2013-01-23 90 views
5

我在XNA製作2D遊戲。 當使用可繪製的遊戲組件時哪一個性能更好?如何防止XNA組件在屏幕外時畫圖?

1.當組件不在屏幕上時,將它從組件列表中刪除,並在屏幕上將其添加。

2,當其離屏幕不要運行它的繪製函數(通過使用「甦醒」布爾字段和 如果周圍繪製函數聲明的一切)

我使用的那一刻方法2,它工作正常。其方便的組件的抽屜不會改變(如果我刪除並重新添加它們,我將需要更多代碼來管理它) 事實上,它只是發生在我身上,如果它不在組件列表中更新和我需要別的東西來跟蹤它是否在屏幕上或不是..

另外我沒有與探查器的視覺工作室的花哨版本,所以我只是問在這裏,人們認爲他們的經驗是什麼

+1

您不需要昂貴的分析器來確定哪個測試速度更快'Stopwatch'足夠好。分析器將幫助解釋爲什麼*一個比另一個更快(即,該算法的哪些部分很慢,什麼消耗最多的內存,是否需要優化此部分等等)。 – Servy

+2

我會相信選擇2會更快。 – Cyral

+2

您使用多少個'DrawableGameComponent'?如果你正在使用它的很多實例,你可能會誤用它。 –

回答

5

在使用SpriteBatch時,CPU性能有時會被忽略,這是你如何去配合你的精靈。而使用可繪製的遊戲組件並不能輕鬆地有效地分批精靈。

基本上,繪製精靈的GPU並不慢&將所有精靈組織成批次的CPU並不慢。緩慢的部分是當CPU必須向GPU傳達需要繪製的內容時(向其發送批處理信息)。當您調用spriteBatch.Draw()時,此CPU與GPU通信不會發生。它發生在你調用spriteBatch.End()時。因此,低效率的結果是不經常調用spriteBatch.End()。 (當然這也意味着不太經常調用Begin())。此外,使用spriteSortMode.Imediate非常謹慎,因爲它立即導致CPU發送每個精靈信息到GPU(慢))。

所以,如果你在每場比賽的組件類()開始&()結束,並有許多組件,你是不必要的花費自己很多的時間,你可能會節省更多的時間想出一個更好的配料方案比擔心屏幕外的精靈。

另外:無論如何,GPU自動忽略來自其像素着色器的離屏精靈。所以剔除CPU上的屏幕外精靈不會節省GPU時間...

+0

非常感謝!非常翔實..此外,就我而言,我的遊戲程序化地生成了由房間組成的關卡。我在140個房間進行了壓力測試,之後我進行了一些表演編碼,結果很慢。然後我做了它,所以只有你現在的房間被繪製(方法2在我的文章中)而性能又回到了完美,根據你的答案,這是所有的CPU,這是有道理的,因爲這是在一個craptop運行與視覺工作室鬥爭! :)我想我會遵循你的建議,並重新設計一點,使我的開始和結束語句保持更多 –

+0

我想說,僅僅因爲你使用drawablegamecomponents,並不意味着你不能使用相同的spritebatch.begin()。如果你將你的base.draw放置在spritebatch中,你可以從你的主遊戲文件開始調用,然後在你的組件中完成所有的繪圖,然後再次在Game文件中創建spritebatch.end。 – TopHatHacker

+0

@TopHatHacker我想提到,但沒有意識到如果有一些3D可繪製組件和一些2D組件,那麼這是行不通的。 –