Windows phone 7 调用SpriteBatch.Begin()/.End()的频率?

Windows phone 7 调用SpriteBatch.Begin()/.End()的频率?,windows-phone-7,xna,sprite,draw,Windows Phone 7,Xna,Sprite,Draw,我正在搜索windows phone 7的xna代码的绘图部分中的性能问题,该问题有时会在几秒钟后出现。有没有一个最佳的做法,如何/何时调用SpriteBatch。开始画画?是应该为每对精灵调用它(在每个类中,当它绘制玩家、背景、背景对象等时),还是在开始时调用->绘制所有子类中的所有内容-对性能更有利?性能方面最好的做法是每次绘制只调用一次开始/结束(),这会导致图形卡同时处理一批中的所有精灵。如果需要,您应该只使用多个雪碧批次。您可能需要的时间示例如下: 您希望仅对某些精灵应用效果,而不对

我正在搜索windows phone 7的xna代码的绘图部分中的性能问题,该问题有时会在几秒钟后出现。有没有一个最佳的做法,如何/何时调用SpriteBatch。开始画画?是应该为每对精灵调用它(在每个类中,当它绘制玩家、背景、背景对象等时),还是在开始时调用->绘制所有子类中的所有内容-对性能更有利?

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

  • 您希望仅对某些精灵应用效果,而不对其他精灵应用效果
  • 你想截图吗
  • 你想做一些更复杂的效果

任何人都能想到多个精灵批处理(begin->end)的其他原因吗?

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

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


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

Begin的重载列表如下:如果您想在此处执行任何不同的操作,例如传入自定义效果或不同的变换矩阵,则必须执行另一个调用。您好,我不能在一个特定的精灵上截图,但我可以在另一个精灵上截图。任何想法,为什么会发生这种情况?@salsabear,这听起来像是一个新问题的素材。如果问题中包含代码,请确保只包含相关部分。