在我的 2D 游戏中,我有一张大地图,我在它周围滚动(就像在《帝国时代》中一样)。
在绘制时,我绘制所有元素(纹理/图像)。其中一些在屏幕上,但大多数不在屏幕上(因为您看到了大约 10% 的地图)。
XNA 是否知道不通过检查目标矩形不会落在屏幕上来绘制它们?
或者我应该手动检查它并完全避免绘制它们?
在我的 2D 游戏中,我有一张大地图,我在它周围滚动(就像在《帝国时代》中一样)。
在绘制时,我绘制所有元素(纹理/图像)。其中一些在屏幕上,但大多数不在屏幕上(因为您看到了大约 10% 的地图)。
XNA 是否知道不通过检查目标矩形不会落在屏幕上来绘制它们?
或者我应该手动检查它并完全避免绘制它们?
使用时有时被忽视的 CPU 性能概念SpriteBatch
是您如何批量处理您的精灵。并且使用可绘制游戏组件并不容易有效地批处理精灵。
基本上,GPU 绘制精灵并不慢,而 CPU 将所有精灵组织成一个批次并不慢。缓慢的部分是 CPU 必须与 GPU 通信它需要绘制的内容(向其发送批处理信息)。当您调用spriteBatch.Draw()
. 它发生在你打电话时spriteBatch.End()
。因此,效率低下的果实就是spriteBatch.End()
不那么频繁地打电话。(当然这Begin()
也意味着更少打电话)。另外,spriteSortMode.Immediate
请谨慎使用,因为它会立即导致 CPU 将每个精灵信息发送到 GPU(慢)。
因此,如果您在每个游戏组件类中调用Begin()
&End()
并且有许多组件,那么您会浪费大量时间,而且您可能会节省更多时间来提出更好的批处理方案,而不是担心屏幕外的精灵。
另外:无论如何,GPU 都会自动忽略其像素着色器中的屏幕外精灵。因此,在 CPU 上剔除屏幕外精灵不会节省 GPU 时间。
参考这里。
您必须手动考虑这一点,随着游戏的发展,它会在很大程度上影响游戏的性能,这也称为剔除。剔除并不是因为从屏幕上绘制东西会降低性能,而是因为调用Draw
那么多额外的时间很慢。任何您不需要更新且超出视口的内容也应排除在外。您可以在此处查看有关如何执行此操作以及如何SpriteBatch
处理此操作的更多信息。