【问题标题】:Draw script eating up memory and cpu绘制脚本占用内存和cpu
【发布时间】:2015-10-22 22:57:28
【问题描述】:

我一直在使用这个脚本来画线,它可以工作,但是当我运行我的游戏时,它开始像没有人的事一样消耗我的资源。

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 使用率就会开始飙升。

对于它为什么这样做有任何猜测吗?我是否应该过度担心?或者这对于这些类型的操作是否正常。

【问题讨论】:

  • 我将只存储一个白色像素的Texture2D,然后在Draw 调用中指定颜色。
  • 太棒了,它有效。非常感谢。

标签: c# resources draw xna-4.0 monogame


【解决方案1】:

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

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

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

总结一下:始终尽可能少地完成工作以实现您的预​​期目标

【讨论】:

  • 是的,当他建议我更改纹理时,我意识到这是在重新创建纹理。现在说得通了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多