2011-09-16 39 views
5

我在Windows Phone 7的xna代碼的繪圖部分中搜索性能問題,有時會在幾秒鐘後發生。有什麼最佳做法/何時調用SpriteBatch.Begin來繪製一些東西?是否應該爲每一對精靈(在每個類中繪製玩家,背景,背景對象......)或者在開始時調用 - 在所有子類中繪製所有東西 - 是否更適合性能?多久調用一次SpriteBatch.Begin()/ .End()?

回答

2

您不應該使用它們,因爲Begin()意味着爲精靈渲染準備設備,End()意味着恢復到之前的狀態。這可能會因Begin()中的某些標誌而有所不同,這表示您不需要更改狀態,並且可能會使代碼複雜化,因爲您必須手動設置某些狀態。

設備狀態變化通常很慢,如果不需要,你應該阻止它們的操作,它們也可能會干擾你正在做的任何事情,所以如果你想渲染的東西不在SpriteBatch中,你應該調用End(),但如果你正在渲染精靈,你應該爲所有精靈調用它。

爲了防止調用End()來修改上一個精靈不顯示的狀態,應該調用Flush()而不是End()。這將使用當前轉換和設備狀態呈現隊列中的精靈,但保持狀態不變。 End()函數的作用是調用Flush()並重置由Begin()設置的特定狀態。

2

性能最好的事情是每個Draw()只調用一次begin/end,這會導致批處理中的所有精靈同時得到圖形卡的處理。如果需要,您應該只使用多個精靈批次。當你可能需要的例子是:

  • 您想要的效果只適用於特定的精靈,而不是其他
  • 你想採取截圖
  • 你想做些什麼與影響更復雜

任何人都可以想到多個精靈批次(開始 - >結束)的其他原因?

+0

開始的重載列表在這裏:http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.begin.aspx如果你想在這裏有不同的東西,例如當傳入一個自定義效果或不同的變換矩陣時,您必須再次調用。 – 2011-09-17 11:48:40

+0

嗨,我無法截取特定精靈圖片的截圖,但能夠截取不同精靈的截圖。任何想法,爲什麼這可能發生? – nagavamsikrishna

+0

@salsabear,這聽起來像是一個新問題的材料。如果您在問題中包含代碼,請確保僅包含相關部分。 –