À partir de maintenant, je dessine mes graphiques de performances de débogage avec des rectangles de 1px étirés à la hauteur requirejse, mais dessiner beaucoup de données de cette façon entraîne une perte de performance significative.
Actuellement, la logique est la suivante: collecter tous les synchronisations pour l’image actuelle, les placer dans les Queue
et tracer un graphique pour chaque queue en traçant 300 images-objects étirées de 1px étirées. Il y a 4 graphiques, donc 1200 sprites dans la superposition de débogage seulement, ce qui consum des ressources.
Existe-t-il une meilleure façon de dessiner des graphiques qui au moins ne nécessiteront pas autant de sprites?
Vous pouvez utiliser des tableaux VertexPositionColor
pour stocker des valeurs de graphique individuelles, puis utiliser GraphicsDevice.DrawUserIndexedPrimitives
avec une liste de lignes définie (indices) pour les dessiner avec une projection orthographique.
Le .gif est redimensionné à 50% en raison de la taille du fichier.
Je dessine ces échantillons (4 graphiques avec 300 points de valeur / pixels chacun) à 60 images par seconde.
Si vous devez remplir les graphiques sous la ligne, vous pouvez dessiner une bande de sortingangle (avec des points au bas du graphique).
Voici le code pertinent pour le premier graphique rendu ci-dessus:
Masortingx worldMasortingx; Masortingx viewMasortingx; Masortingx projectionMasortingx; BasicEffect basicEffect; VertexPositionColor[] pointList; short[] lineListIndices; protected override void Initialize() { int n = 300; //GeneratePoints generates a random graph, implementation irrelevant pointList = new VertexPositionColor[n]; for (int i = 0; i < n; i++) pointList[i] = new VertexPositionColor() { Position = new Vector3(i, (float)(Math.Sin((i / 15.0)) * height / 2.0 + height / 2.0 + minY), 0), Color = Color.Blue }; //links the points into a list lineListIndices = new short[(n * 2) - 2]; for (int i = 0; i < n - 1; i++) { lineListIndices[i * 2] = (short)(i); lineListIndices[(i * 2) + 1] = (short)(i + 1); } worldMatrix = Matrix.Identity; viewMatrix = Matrix.CreateLookAt(new Vector3(0.0f, 0.0f, 1.0f), Vector3.Zero, Vector3.Up); projectionMatrix = Matrix.CreateOrthographicOffCenter(0, (float)GraphicsDevice.Viewport.Width, (float)GraphicsDevice.Viewport.Height, 0, 1.0f, 1000.0f); basicEffect = new BasicEffect(graphics.GraphicsDevice); basicEffect.World = worldMatrix; basicEffect.View = viewMatrix; basicEffect.Projection = projectionMatrix; basicEffect.VertexColorEnabled = true; //important for color base.Initialize(); }
Pour le dessiner:
foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Apply(); GraphicsDevice.DrawUserIndexedPrimitives( PrimitiveType.LineList, pointList, 0, pointList.Length, lineListIndices, 0, pointList.Length - 1 ); }
Pour le graphique en bandes sortingangulars, modifiez le code pour afficher une bande sortingangular , et pour chaque sharepoint la courbe graphique, placez-en un au bas du graphique.