我在Windows Phone 7的xna代碼的繪圖部分中搜索性能問題,有時會在幾秒鐘後發生。有什麼最佳做法/何時調用SpriteBatch.Begin來繪製一些東西?是否應該爲每一對精靈(在每個類中繪製玩家,背景,背景對象......)或者在開始時調用 - 在所有子類中繪製所有東西 - 是否更適合性能?多久調用一次SpriteBatch.Begin()/ .End()?
5
A
回答
2
您不應該使用它們,因爲Begin()意味着爲精靈渲染準備設備,End()意味着恢復到之前的狀態。這可能會因Begin()中的某些標誌而有所不同,這表示您不需要更改狀態,並且可能會使代碼複雜化,因爲您必須手動設置某些狀態。
設備狀態變化通常很慢,如果不需要,你應該阻止它們的操作,它們也可能會干擾你正在做的任何事情,所以如果你想渲染的東西不在SpriteBatch中,你應該調用End(),但如果你正在渲染精靈,你應該爲所有精靈調用它。
爲了防止調用End()來修改上一個精靈不顯示的狀態,應該調用Flush()而不是End()。這將使用當前轉換和設備狀態呈現隊列中的精靈,但保持狀態不變。 End()函數的作用是調用Flush()並重置由Begin()設置的特定狀態。
2
性能最好的事情是每個Draw()只調用一次begin/end,這會導致批處理中的所有精靈同時得到圖形卡的處理。如果需要,您應該只使用多個精靈批次。當你可能需要的例子是:
- 您想要的效果只適用於特定的精靈,而不是其他
- 你想採取截圖
- 你想做些什麼與影響更復雜
任何人都可以想到多個精靈批次(開始 - >結束)的其他原因?
相關問題
- 1. 在SpriteBatch.begin/end中嵌套ShapeRenderer.begin/end
- 2. viewDidLoad多久調用一次?
- 3. Iterator會多次循環調用end()嗎?
- 4. Event.RENDER被多久調用一次?
- 5. jiffies多久更新一次?
- 6. 你多久合併一次?
- 7. .scroll()多久發射一次?
- 8. 我應該多久使用一次NSAutoreleasePools?
- 9. 我應該多久使用一次C++?
- 10. 在離線Solr/Lucene索引上多久調用一次commit?
- 11. 我的HTML多久調用一次函數?
- 12. OpenGL:我應該何時和多久調用一次glLineWidth,glPointSize,glLineStyle?
- 13. 頂點着色器多久調用一次?
- 14. 多次調用Ajax而不是一次
- 15. SpriteBatch:「在成功調用End之前,不能再次調用Begin。」
- 16. 一次調用多個deleteRowsAtIndexPaths
- 17. 其他SpriteBatch.Begin()
- 18. SpriteBatch.Begin和SpriteBatch.End
- 19. 多久檢查一次許可證?
- 20. 多久撥打一次GCM RegistrationIntentService
- 21. 我多久運行一次autoconf?
- 22. WordPress多久檢查一次更新?
- 23. 你在cron中多久做一次? - 0 * * * *
- 24. DocSearch多久檢索一次網站
- 25. 兜風傀儡多久運行一次?
- 26. 我應該多久檢索一次?
- 27. Quartz Scheduler多久出現一次?
- 28. VLC多久檢查一次更新?
- 29. DownloadProgressChangedEventHandler多久會被調用
- 30. 微調一些SQL調用多次
開始的重載列表在這裏:http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.begin.aspx如果你想在這裏有不同的東西,例如當傳入一個自定義效果或不同的變換矩陣時,您必須再次調用。 – 2011-09-17 11:48:40
嗨,我無法截取特定精靈圖片的截圖,但能夠截取不同精靈的截圖。任何想法,爲什麼這可能發生? – nagavamsikrishna
@salsabear,這聽起來像是一個新問題的材料。如果您在問題中包含代碼,請確保僅包含相關部分。 –