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

时间:2011-09-16 19:18:57

标签: windows-phone-7 xna sprite draw

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

2 个答案:

答案 0 :(得分:2)

性能最好的方法是每个Draw()只调用一次开始/结束,这会导致批处理中的所有精灵同时被图形卡处理。如果需要,您应该只使用多个精灵批次。您可能需要的时间示例如下:

  • 您想要仅对某些精灵应用效果,而不是其他精灵
  • 您想截取屏幕截图
  • 你想做一些更复杂的效果

有人可以想到多个精灵批次的其他原因(开始 - >结束)吗?

答案 1 :(得分:2)

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

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

为了防止调用End()来修改上一个sprite中没有显示的状态,你应该调用Flush()而不是End()。这会使排队的精灵呈现当前的变换和设备状态,但保持状态不变。 End()函数的作用是调用Flush()并重置Begin()设置的特定状态。