画脚本占用内存和CPU

时间:2015-10-22 22:57:28

标签: c# resources draw xna-4.0 monogame

我一直在使用这个剧本绘制线条,但它确实有效,但是当我运行游戏时,它开始耗尽我的资源,就像没有人一样。

public static void DrawLine(Vector2 start, Vector2 end, Color color, int width, float alpha, float depth)
{
                                // GraphicsDevice stored in other class
    var texture = new Texture2D(Graphics2D.GraphicsDevice, 1, 1);
    texture.SetData(new[] { color });

    Vector2 edge = end - start;
    float angle = (float)Math.Atan2(edge.Y, edge.X);

    // SpriteBatch stored in other class
    Graphics2D.SpriteBatch.Draw(
        texture,
        new Rectangle(
        (int)start.X,
        (int)start.Y,
        (int)edge.Length(),
        width),
    null,
    Color.White,
    angle,
    new Vector2(0, 0),
    SpriteEffects.None,
    1.0f);
}

一旦开始绘制线条,内存和CPU使用率就会开始飙升。

Memory usage spikes as soon as lines start being drawn.

有没有猜测为什么要这样做?我是否应该过度关注?或者对于这些操作来说这是正常的。

1 个答案:

答案 0 :(得分:0)

正如@Norris在评论中提到的那样,在Initialize处创建纹理,然后重复使用它。

它占用CPU的原因是因为你从零开始创建一个全新的纹理。这很重要,因为你要求GPU保留内存和电源以创建一个新的纹理,使用单帧,再次处理它,然后重复下一帧。在对大型图像进行一些更改时,Photoshop有进度条的原因。

即使它不是cpu密集型的,如果你不必要的话,每帧都重新创建一些东西是不好的做法。始终尽可能多地重复使用。这适用于所有类型的应用程序,但由于60fps绘制循环,在游戏开发中尤为重要。关于唯一不适用的对象是基本的值类型,例如Ints,Floats,Vector3,Matricies等。除非这些值基于每帧需要进行的计算。

总结:始终尽可能少地完成预期目标