4

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

我试图注释掉

GraphicsDevice.Clear(Color.CornflowerBlue);

但这无济于事。(它的目的是什么?

4

2 回答 2

3

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

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

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

通常你想做的是 callGame.SupressDraw,当你知道你不会修改屏幕的内容时(保存调用Draw和交换)。另请参阅此处此处的答案。

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

如果您确实有一些要在帧之间重用的渲染成本高的内容,通常您会将其绘制到渲染目标一次,然后每帧将其绘制到屏幕上。但是,一如既往,避免过早的优化!显卡是专门为每帧重绘场景而设计的——它们非常快!

于 2013-06-04T05:51:56.433 回答
0

看到这个,如果你想阻止它清除图像,你可以这样做:

GraphicsDevice.GetType().GetField("lazyClearFlags", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(GraphicsDevice, ClearOptions.DepthBuffer);
于 2013-06-03T23:50:27.350 回答