到目前为止,我正在绘制我的调试性能图,其中 1px 矩形拉伸到必要的高度,但是以这种方式绘制大量数据会导致显着的性能损失。
目前的逻辑是:收集当前帧的所有时间,将它们放入Queue<float>
s 中,并通过绘制 300 个拉伸的 1px 精灵为每个队列绘制图形。有 4 个图,因此仅在调试覆盖中就有 1200 个精灵,这很耗费资源。
有没有更好的方法来绘制至少不需要绘制这么多精灵的图形?
您可以使用VertexPositionColor
数组来存储单独的图形值,然后GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>
与定义的线列表(索引)一起使用以通过正交投影绘制它们。
由于文件大小,.gif 的大小调整了 50%。
我正在以 60fps 的速度绘制这些样本(4 个图形,每个图形有 300 个值点/像素)。
如果您需要填充线条下方的图形,则可以改为绘制三角形条(点位于图形底部)。
这是上面呈现的第一个图形的相关代码:
Matrix worldMatrix;
Matrix viewMatrix;
Matrix projectionMatrix;
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();
}
绘制它:
foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.DrawUserIndexedPrimitives<VertexPositionColor>(
PrimitiveType.LineList,
pointList,
0,
pointList.Length,
lineListIndices,
0,
pointList.Length - 1
);
}
对于三角形带状图,修改代码以显示三角形带状,并为图形曲线中的每个点在图形底部放置一个。