3

在我的 2D 游戏中,我有一张大地图,我在它周围滚动(就像在《帝国时代》中一样)。

在绘制时,我绘制所有元素(纹理/图像)。其中一些在屏幕上,但大多数不在屏幕上(因为您看到了大约 10% 的地图)。

XNA 是否知道不通过检查目标矩形不会落在屏幕上来绘制它们?

或者我应该手动检查它并完全避免绘制它们?

4

2 回答 2

6

使用时有时被忽视的 CPU 性能概念SpriteBatch是您如何批量处理您的精灵。并且使用可绘制游戏组件并不容易有效地批处理精灵。

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

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

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

参考这里

于 2013-10-20T22:21:52.893 回答
5

您必须手动考虑这一点,随着游戏的发展,它会在很大程度上影响游戏的性能,这也称为剔除。剔除并不是因为从屏幕上绘制东西会降低性能,而是因为调用Draw那么多额外的时间很慢。任何您不需要更新且超出视口的内容也应排除在外。您可以在此处查看有关如何执行此操作以及如何SpriteBatch处理此操作的更多信息。

于 2013-10-20T12:42:51.440 回答