每次抽奖都会重绘不变的背景?

时间:2013-06-03 19:57:45

标签: c# xna xna-4.0

这可能是一个非常简单的问题,但我搜索并发现没有其他方法可以做到这一点。在每个Draw上重绘背景都没有意义。有没有办法绘制一些东西并将它们留在屏幕上?

我试图评论

GraphicsDevice.Clear(Color.CornflowerBlue);

但这没有用。 ( 的目的是什么?)

2 个答案:

答案 0 :(得分:2)

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

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

我不确定为什么XNA在交换时将缓冲区标记为未初始化。我以前没有遇到过这种行为 - 主要是因为想要交换缓冲区来保存它们的内容是非常不寻常的。

通常您要做的就是拨打Game.SupressDraw ,当您知道自己不想修改屏幕内容时(同时保存对Draw的呼叫和交换)。另请参阅答案herehere

请注意,使用GraphicsDevice.Clear清除屏幕非常。并且XNA没有“背景”或“前景”的概念(你总是在缓冲区中的任何内容上绘制)。

如果你想要在帧之间重复使用一些昂贵的渲染内容,通常你会将它绘制到渲染目标一次,然后将其绘制到每帧的屏幕上。但是,一如既往,避免过早优化!显卡专门设计用于每帧重绘场景 - 它们非常快![/ p>

答案 1 :(得分:0)

请参阅this,如果您想阻止它清除您可以执行的图像:

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