2010-07-09 75 views
5

我目前正在開發一個C#.net xna遊戲引擎。C#代表在xna遊戲中的表現

我一直在試圖找出辦法有一個更新管理/調度/事件系統。我目前使用委託來提供創建動態計劃任務和事件的方式。

我最近讀過代表可能很慢。我的遊戲中的代表正在被調用每一幀,我想知道是否會有性能打擊?

更新:

我也剛剛發現這個http://blogs.msdn.com/b/shawnhar/archive/2007/07/09/delegates-events-and-garbage.aspx

這是我很擔心,我想可以有變通的辦法。感謝所有其他信息。

+0

寫一個小的微型基準,找出你自己? – Brian 2010-07-09 00:35:36

+0

至於你的更新 - 只是不要每1/60秒重新創建代表。但是,即使你這樣做了,實例也將全部位於堆中的Gen0上,並且GC非常有效地收集Gen0。 – codekaizen 2010-07-09 05:48:43

+0

@codekaizen除了Xbox上的GC不是世代的! – 2010-07-09 08:59:11

回答

8

不要擔心 - 代表是比普通函數調用速度較慢,但​​除非你打電話給他們幾百萬次,第二我很懷疑你會發現。

我建議堅持與代表,除非它證明是一個瓶頸。

+0

是的,他們應該只被召喚至多60次每秒 – 2010-07-09 00:39:40

+0

如果它只有60次/秒將有微秒的差異。如果是6000次/秒,我懷疑你會發現代表和函數之間有很大的區別。 – 2010-07-09 00:41:38

+0

@Chris是的,如果它是每秒60次,那麼對性能的影響將完全可以忽略不計。如果代表們工作並保持代碼簡單和可維護,那就去做吧。 – mikera 2010-07-09 01:01:53

1

不管是否有可以是一個性能命中,更好的問題是,是否有性能的下降。您應該在有和沒有代表的情況下衡量應用程序的性能,以確定是否有任何性能問題可以接受。

+0

我會這樣做,並讓你知道 – 2010-07-09 00:39:16

1

有一些明顯的逆足擊中委託與直接的方法調用,但與現代(讀:後V1.1)的CLR版本,它是關於儘可能快地通過接口方法調用。

這裏是粗糙PERF措施表: http://msdn.microsoft.com/en-us/magazine/cc507639.aspx

與往常一樣,你應該測量,看是否表現尚可你。由於我使用了代表性的關鍵代碼(動畫),並沒有遇到問題,所以我希望它能爲您解決問題。

+0

雅表,這有助於感謝! – 2010-07-09 05:15:15

1

你的猜測(和我們的猜測)將是不準確的,而不一定會符合您的遊戲的實際表現。知道實際性能命中的唯一方法是使用至少一種性能分析。 Why measure when you can guess?

除了讓你的性能的實際測量,可以考慮:什麼關係呢?如果您的遊戲運行速度爲60fps(即使在快節奏的遊戲中,我甚至可以以30fps的速度享受自己的樂趣,如果速度較慢,我可以在20fps的速度下處理,就像回合制遊戲一樣),並且您可以在不同的時間內達到300fps步驟模式,代表花費你整整20幀(順便說一句,它們可能不會)......你的遊戲在固定時間步模式下仍然可以保持60fps。

1

我將在這裏附和別人的答案,在代表是沒有問題的,除非他們是一個問題 - 分析器是你的朋友。

有一點要注意這一點可能是一個問題是,如果你正在重新創建每一幀的代表 - 在這種情況下,你可能會產生過多的垃圾,這會降低你的表現。但是,使用像CLR分析器這樣的工具首先確定這對您是否有問題。