多久调用一次SpriteBatch.Begin()/.End()?

mic*_*ael 5 xna sprite draw windows-phone-7

我在Windows Phone 7的xna代码的Drawing部分中搜索性能问题,有时会在几秒钟后发生.有一个最佳实践如何/何时调用SpriteBatch.Begin绘制一些东西?应该为每对精灵调用它(在每个类中绘制播放器时,背景,背景对象......)或者在开始时调用 - >在所有子类中绘制所有内容 - 对于性能更好吗?

Pab*_*iel 3

您不应过度使用它们,因为 Begin() 意味着准备设备进行精灵渲染,而 End() 意味着恢复到之前的状态。这可能会因 Begin() 中的一些标志告诉您不希望状态更改而有所不同,并且可能会使您的代码复杂化,因为您必须手动设置某些状态。

设备状态更改通常很慢,如果不需要,您应该阻止执行它们,它们也可能会干扰您正在做的任何事情,因此如果您想渲染不在 SpriteBatch 中的内容,您应该调用 End(),但如果您正在渲染精灵你应该为所有精灵调用一次。

为了防止调用 End() 来修改未在前一个精灵上显示的状态,您应该调用 Flush() 而不是 End()。这将使用当前转换和设备状态渲染排队的精灵,但保持状态不变。End() 函数的作用是调用 Flush() 并重置 Begin() 设置的特定状态。