在屏幕范围之外绘制是否会影响性能?

3
在我的2D游戏中,我有一个大地图,我会像在帝国时代中一样滚动它。
绘制时,我会绘制所有元素(即纹理/图像)。其中一些在屏幕上,但大多数不在(因为你只能看到地图的约10%)。
XNA是否通过检查目标矩形是否落在屏幕上,从而知道不要绘制它们?
还是应该手动检查并避免将它们绘制出来?
2个回答

7
有时候,使用SpriteBatch时被忽视的CPU性能概念是如何批处理精灵。而使用可绘制游戏组件并不容易有效地批处理精灵。
基本上,GPU绘制精灵不慢,CPU将所有精灵组织成批次也不慢。慢的部分是当CPU需要向GPU通信它需要绘制什么时(发送批次信息)。这种CPU到GPU的通信在调用spriteBatch.Draw()不会发生。它发生在调用spriteBatch.End()时。因此,提高效率的低 hanging fruit 是尽量少调用spriteBatch.End()。(当然,这意味着也要尽量少调用Begin())。此外,请非常节约地使用spriteSortMode.Immediate,因为它会立即导致CPU向GPU发送每个精灵的信息(很慢)。
因此,如果您在每个游戏组件类中调用Begin()End(),并且有许多组件,则会浪费很多不必要的时间,并且您可能会节省更多的时间来设计更好的批处理方案,而不是担心屏幕外的精灵。
另外:GPU自动忽略其像素着色器中的屏幕外精灵。因此,在CPU上剔除屏幕外精灵不会节省GPU时间。
参考这里

5

在游戏增长过程中,你必须手动考虑这一点,这将大大影响游戏的性能,这被称为剔除。剔除不仅仅是因为将屏幕外的东西绘制出来会降低性能,而是因为调用Draw太多次而变慢。任何在视口之外不需要更新的内容也应被排除在外。您可以在这里了解有关如何执行此操作以及SpriteBatch 如何处理此操作的更多信息。


为什么他不这样做? - OopsUser
在你给我的链接中,写着只有当我有比单个批次处理能力更多的精灵时才需要剔除,但它并没有回答他是否会绘制它们的问题... - OopsUser
它不会。它将数据传递给GPU,并默认情况下,它将剔除屏幕外的内容。理论上,在屏幕范围之外绘制不会降低性能,但如果您每帧对spritebatch进行数千次“Draw”调用,则会超出限制并导致帧速率下降。 - Sarkilas
@Sarkilas所说的,如果我的回答措辞不当,我很抱歉。这不是因为你正在屏幕外绘制东西,而是因为需要执行更多的Draw()调用。 - Cyral
你没有说错,Cyral,我只是在向OopsUser澄清。 - Sarkilas
只绘制可见的瓦片和精灵。我忘记在我的SHMUP中删除未命中的子弹,所以当我将游戏放在压力测试中时,它会在10分钟后开始出现延迟,因为它仍在绘制屏幕外数英里的子弹。 - Davor Mlinaric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接