5

我正在 XNA 中制作 2d 游戏。使用可绘制游戏组件时,哪一个更具有性能?

1.当一个组件不在屏幕上时,从组件列表中删除它,当它在屏幕上时添加它。

2.当它的屏幕外不运行它的绘图函数时(通过使用“唤醒”布尔字段和围绕绘图函数中所有内容的 if 语句)

我目前正在使用方法2,效果很好。它很方便,因为组件的draworder不会改变(如果我删除并重新添加它们会改变,我需要更多代码来管理它)事实上我只是想到如果它不在组件列表中它不会更新我需要其他东西来跟踪它是否在屏幕上..

另外我没有带有分析器的视觉工作室的精美版本,所以我只是在这里问人们从他们的经验中的想法

4

1 回答 1

6

在使用 SpriteBatch 时,有时会被忽视的 CPU 性能概念是批处理 sprite 的方式。并且使用可绘制游戏组件并不容易有效地批处理精灵。

基本上,GPU 绘制精灵并不慢,而 CPU 将所有精灵组织成一个批次并不慢。缓慢的部分是 CPU 必须与 GPU 通信它需要绘制的内容(向其发送批处理信息)。当您调用 spriteBatch.Draw() 时,不会发生这种 CPU 到 GPU 的通信。当您调用 spriteBatch.End() 时会发生这种情况。因此,效率低下的果实是调用 spriteBatch.End() 的频率较低。(当然,这意味着调用 Begin() 的频率也更低)。此外,非常谨慎地使用 spriteSortMode.Imediate,因为它会立即导致 CPU 将每个精灵信息发送到 GPU(慢)。

因此,如果您在每个游戏组件类中调用 Begin() 和 End(),并且有许多组件,那么您会不必要地花费大量时间,与担心屏幕外精灵相比,您可能会节省更多时间来提出更好的批处理方案.

另外:无论如何,GPU 都会自动忽略其像素着色器中的屏幕外精灵。所以在 CPU 上剔除屏幕外精灵不会节省 GPU 时间......

于 2013-01-24T14:11:57.470 回答