绘制脚本占用内存 cpu
Draw script eating up memory and cpu
我一直在使用这个脚本来画线,而且它工作正常,但是当我 运行 我的游戏时,它开始像没有人管的那样消耗我的资源。
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 使用率就开始飙升。
关于它为什么这样做的任何猜测?我什至应该过分担心吗?或者这些操作是否正常。
正如@Norris 在评论中提到的那样,在初始化时创建纹理,然后重新使用它。
它吃掉你的 CPU 的原因是你在每一帧都从头开始创建一个全新的纹理。这很繁重,因为您要求 GPU 保留内存和功率来创建新纹理,在单帧使用它,再次处理它,然后在下一帧重复该过程。 Photoshop 在对大图像进行一些更改时出现进度条是有原因的。
即使它不是 cpu 密集型的,如果不需要的话,每一帧都重新创建一些东西也是不好的做法。始终尽可能多地重复使用。这适用于所有类型的应用程序,但由于 60fps 绘制循环,这在游戏开发中尤为重要。这唯一不适用于的对象是基本值类型,例如 Ints、Floats、Vector3、Matricies 等。当然,除非这些值基于需要在每一帧发生的计算。
总结一下: 总是做尽可能少的工作来完成你的预期目标
我一直在使用这个脚本来画线,而且它工作正常,但是当我 运行 我的游戏时,它开始像没有人管的那样消耗我的资源。
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 使用率就开始飙升。
关于它为什么这样做的任何猜测?我什至应该过分担心吗?或者这些操作是否正常。
正如@Norris 在评论中提到的那样,在初始化时创建纹理,然后重新使用它。
它吃掉你的 CPU 的原因是你在每一帧都从头开始创建一个全新的纹理。这很繁重,因为您要求 GPU 保留内存和功率来创建新纹理,在单帧使用它,再次处理它,然后在下一帧重复该过程。 Photoshop 在对大图像进行一些更改时出现进度条是有原因的。
即使它不是 cpu 密集型的,如果不需要的话,每一帧都重新创建一些东西也是不好的做法。始终尽可能多地重复使用。这适用于所有类型的应用程序,但由于 60fps 绘制循环,这在游戏开发中尤为重要。这唯一不适用于的对象是基本值类型,例如 Ints、Floats、Vector3、Matricies 等。当然,除非这些值基于需要在每一帧发生的计算。
总结一下: 总是做尽可能少的工作来完成你的预期目标