C# 在每次绘制时都重新绘制不变的背景?

C# 在每次绘制时都重新绘制不变的背景?,c#,xna,xna-4.0,C#,Xna,Xna 4.0,这可能是一个非常简单的问题,但我搜索了一下,没有找到其他方法。在每次绘制时重新绘制背景是没有意义的。有没有办法画一些东西,然后把它们留在屏幕上 我试着把这件事说出来 GraphicsDevice.Clear(Color.CornflowerBlue); 但那没用。(其目的是什么?请参见,如果您只想阻止它清除图像,您可以执行以下操作: GraphicsDevice.GetType().GetField("lazyClearFlags", BindingFlags.NonPublic | Bind

这可能是一个非常简单的问题,但我搜索了一下,没有找到其他方法。在每次绘制时重新绘制背景是没有意义的。有没有办法画一些东西,然后把它们留在屏幕上

我试着把这件事说出来

GraphicsDevice.Clear(Color.CornflowerBlue);
但那没用。(其目的是什么?

请参见,如果您只想阻止它清除图像,您可以执行以下操作:

GraphicsDevice.GetType().GetField("lazyClearFlags", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(GraphicsDevice, ClearOptions.DepthBuffer);

XNA和DirectX使用您看到的深紫色表示未初始化的缓冲区。XNA还将清除此颜色的缓冲区,以模拟Xbox 360或Windows Phone的行为,这样,如果您在Windows上构建游戏,它将在其他平台上“正常工作”(或者,更确切地说,它将以相同的方式失败,以便您可以调试它)

XNA是双缓冲的。您不会直接绘制到屏幕,而是绘制到“backbuffer”。屏幕仅显示“前缓冲区”。每次调用
GraphicsDevice.Present
Game
EndDraw
中为您调用它),这两个缓冲区将被交换,并且显示您正在绘制的内容(并且您将获得一个新的缓冲区来绘制)

我不知道为什么XNA在交换缓冲区时会将其标记为未初始化。我以前从未遇到过这种行为——主要是因为想交换缓冲区并保存其内容是非常罕见的

通常您要做的是调用
Game.supersDraw
,当您知道不打算修改屏幕内容时(保存对
Draw
的调用和交换)。另请参见答案和

请记住,使用
GraphicsDevice.Clear
清除屏幕速度非常快。XNA没有“背景”或“前景”的概念(您总是在缓冲区中已经存在的任何内容上绘制)


如果要在帧之间重复使用某些昂贵的渲染内容,通常会将其绘制到渲染目标中一次,然后在每个帧中将其绘制到屏幕上。但是,一如既往,避免过早优化!图形卡是专门为每一帧重新绘制场景而设计的-它们非常快

等等-你是说你的XNA游戏会清除屏幕,即使你注释掉图形设备。清除行?或者你是在问,如果你打算每帧重画一次整个屏幕,为什么还要清除屏幕?@ananthonline是的。即使被注释掉,它也会清除屏幕。唯一的区别是背景色。但即使它会停止清除屏幕,我仍然会寻找类似的东西:
clearprogent()。我想知道这是否支持模拟Xbox在Windows()上的清除行为。你可能不需要搞乱它。(虽然一个小测试表明设置
PreserveContents
并不能修复它-所以它不是Xbox的东西。)谢谢。尤其是“渲染目标”。不过请注意,(如果我错了,请纠正我。)-尽管图形卡可能非常快-大部分计算不是用于渲染,而是用于计算。例如-使用
Math.Sin
等计算圆的像素-这些不是由图形卡完成的。@ispiro对此的回答是“视情况而定”。理想情况下,您可以将尽可能多的处理工作卸载到GPU(例如:在像素着色器中,圆可以计算为
x^2+y^2<1
)。理想情况下,静态模型将被发送到GPU一次(作为顶点缓冲区),并在GPU内存中保持不变。但请注意不要过早优化-这基本上是任何优化,而没有测量到您的速度慢(与一些基准测试相比,如目标硬件上的60fps)以及您的速度慢的原因(你的程序的哪个部分最慢)。否则你可能会发现你花了很多时间优化了
Math.Sin
(实际上非常快),但却发现您实际上花费了所有的时间或其他东西。是否有方法将当前帧复制到后台缓冲区并从那里开始,以保留内容?若要获得该效果,请使用渲染目标而不是后台缓冲区。