在我的2D游戏中,我有大型地图,我可以滚动它(就像帝国时代一样)。
在绘制时,我绘制所有元素(纹理/图像)。其中一些在屏幕上,但大多数都没有(因为你看到大约10%的地图)。
XNA是否知道不通过检查目标矩形是否会落在屏幕上来绘制它们?
或者我应该手动检查它并避免绘制它们?
答案 0 :(得分:6)
使用SpriteBatch
时,有时会忽略CPU性能的概念,就是如何批量精灵。使用可绘制的游戏组件并不容易有效地批量精灵。
基本上,绘制精灵的GPU并不慢将所有精灵组织成批处理的CPU并不慢。缓慢的部分是当CPU必须与GPU通信时需要绘制的内容(向其发送批处理信息)。当您致电spriteBatch.Draw()
时,此CPU与GPU之间的通信不会发生。当你致电spriteBatch.End()
时就会发生这种情况。因此,效率低下的结果是减少spriteBatch.End()
的频率。 (当然这意味着更少地调用Begin()
)。另外,非常谨慎地使用spriteSortMode.Immediate
,因为它会立即导致CPU将每个sprite信息发送到GPU(慢))。
所以,如果你致电Begin()
& End()
在每个游戏组件类中,并且有很多组件,你花费了很多时间在不必要的时间,你可能会节省更多的时间来提供更好的批处理方案,而不是担心屏幕外的精灵。
除此之外:GPU无论如何都会自动忽略其像素着色器中的屏幕外精灵。因此,剔除CPU上的屏幕外精灵将无法节省GPU时间。
参考here。
答案 1 :(得分:5)
你必须手动解释这个问题,它会在游戏增长时大大影响游戏的性能,这也称为剔除。剔除不仅仅是因为从屏幕上绘制内容会降低性能,这是因为调用Draw
许多额外的时间很慢。还应排除您不需要更新的任何超出视口的内容。您可以详细了解如何执行此操作以及SpriteBatch
如何处理此here。