2013-10-20 49 views
3

在我的2D遊戲中,我有大型地圖,並且圍繞它滾動(就像在帝國時代一樣)。在屏幕邊界之外繪製是否會影響性能

繪製時繪製所有元素(紋理/圖像)。其中一些是在屏幕上,但大多數不是(因爲你看到地圖的大約10%)。

XNA是否知道不通過檢查目標矩形不會落在屏幕上來繪製它們?

或者我應該手動檢查並避免繪製它們?

回答

5

您必須手動對此進行解釋,並且它將在很大程度上影響遊戲成長過程中的表現,這也稱爲剔除。剔除並不僅僅是因爲在屏幕上畫東西會降低性能,這是因爲撥打Draw很多額外的時間很慢。應該排除任何不需要更新的視口。你可以看到更多關於你如何做到這一點以及SpriteBatch如何處理這個here

+0

他爲什麼不這樣做? – OopsUser

+0

在你給我的鏈接中寫道,只有當我有更多的精靈比他在單批次中可以處理的時候更需要剔除,但是它並不回答他是否繪製它們的問題...... – OopsUser

+0

它沒有。它會將數據傳遞給GPU,並且默認情況下,它將剔除屏幕外的內容。從理論上講,在屏幕邊界之外繪製並不會降低性能,但如果每個幀都對數千個「spritebatch」進行「Draw」調用,那麼您將超出限制,並且會消除幀率。 – Sarkilas

6

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

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

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

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

參考here

相關問題