2012-02-04 18 views
2

我剛剛在360和WP7上運行了2D精靈遊戲,並且它們比Windows上的要慢得多。 FPS是一秒鐘左右的幀數,但在窗戶上平滑。我正在使用Farseer這個最新版本。這兩個平臺上是否有可能導致如此劇烈的放緩?在360和WP7上的表現不佳

在此先感謝。

+4

添加到字典

問候之前避免這種情況這聽起來像是一些簡單的錯誤已經取得了什麼地方。您是否嘗試過在360上使用Pix來查看時間花在哪裏? – moonshadow 2012-02-04 17:44:33

+4

我們可以看到一些繪圖代碼嗎? – 2012-02-04 18:52:11

+0

SpriteBatch之間的開始和繪製我打電話是這樣的: sprites.Draw(Texture,_drawPosition,Texture.SourceRectangle,OliveColor.White,(float)OliveMaths.DegreeToRadian(Angle + 180.0f),_midPoint,1.0f,1.0 F); – 2012-02-05 14:43:24

回答

4

是的。在這兩個平臺上有明確的事情會導致顯着的減速。在360和WP7上的CLR的垃圾收集器比在PC上慢得多。因此,這兩個平臺的性能可能會有很大的不同。 PC上運行速度爲60 fps的遊戲可以在這些平臺上以每秒1-2幀的速度緩慢下載。

有很多資源用於故障排除和優化您的代碼,以在所有三個平臺上獲得相同的FPS。這是我會推薦的。

首先,查看Shawn Hargreave關於「How to tell if your Garbage collection is too slow」的文章,這將首先回答你是否看到了這一點。

然後點擊Ian Nicolades的文章「High End Performance Optimizations for Xbox360 and WP7」這篇文章裏有很多很好的建議,提示和技巧。其中大部分應該有助於清除您目前遇到的任何性能問題。

還有這裏一些很好的職位上堆棧溢出,我建議你仔細閱讀: Game Jitters on xBox360 XNA game performance

也爲一些良好的閱讀,.NET Compact Framework的團隊(包括WP7和360運行修改後的版本緊湊架構)的對Xbox 360的Part1 & Part2

還有從戰壕的傢伙在這一些偉大的文章上託管代碼性能的一些老但糖果製品。曾經在360和WP7上發佈過遊戲的人。這是我最喜歡的Kris Steele之一,他曾在多個平臺上發佈了叫做「Optimizing Code for Xbox XNA Games is required」的XNA遊戲。

然後最後但並非最不重要的一點,在App Hub論壇上有一篇帖子涵蓋了從WP7Xbox表現的所有性能領域。不幸的是,在App Hub上的搜索並不是太好,但帖子就在那裏,並提供各種關於如何在這些平臺上查找和改善遊戲性能的提示/技巧和建議。

+0

感謝所有的信息,它已被證明非常有用。我注意到了兩件事,那就是遊戲過程中新物體的改進,FPS得到了改善。另一個問題是IsFixedTimeStep被啓用,應該已經發生,並且確實產生了巨大的影響。 – 2012-02-08 22:08:27

2

我完全同意喬治克林格曼,360和WP7上的CLR比PC上的垃圾收集器慢得多。

首先,我建議你學習垃圾收集器是如何工作的(它並不那麼難)。

的基本步驟是: 1.驗證 2.檔案 3.找到 4.修復

在這裏你可以找到如何與CLRProfiler http://spacedjase.com/post/2010/07/02/How-to-eliminate-frame-by-frame-Garbage-Generation-using-CLR-Profiler.aspx

做一步一步的指示(基本)

CLR Profiler使您能夠查看進程的託管堆並調查垃圾回收器的行爲。使用該工具中的各種視圖,可以獲取有關應用程序執行,分配和內存消耗的有用信息。(下載http://www.microsoft.com/download/en/details.aspx?id=16273

下面是我在互聯網上發現的最有用的鏈接:

而繼承人總結我認爲是最重要的icant問題:

不要使用linq 不要使用LINQ。它看起來很酷。它使你的代碼更簡短,甚至更容易閱讀。但LINQ查詢很容易成爲垃圾的主要來源。他們在你的啓動代碼中很好,因爲無論如何你只是通過加載資源和準備遊戲資源來產生垃圾。但是不要在更新,繪製或者其他在遊戲過程中被調用的方法中使用它。

顯示一個字符串而不觸發垃圾回收回覆引用 最小化ToString()的使用。至少它會創建一個字符串,它位於堆上。請參閱以上關於如何在不產生任何垃圾的情況下在屏幕上繪製int。如果您確實需要使用ToString,請嘗試限制它被調用的頻率。如果字符串只改變每個關卡,只能在關卡的開頭生成一次。如果它只是在某個值發生變化時才改變,那麼只有在該值發生變化時纔會生成該值你可以放任何限制都是值得的。檢查布爾條件花費的時間太短,幾乎不存在。您可能需要幾十甚至幾十萬次的真/假檢查,才能使GC在複雜的堆上運行。 http://forums.create.msdn.com/forums/p/45512/273330.aspx#273330 http://spacedjase.com/post/2010/09/16/Garbage-safe-number-to-string-conversion.aspx 請注意字符串格式。在不引起分配的情況下,很難在.NET中處理字符串。

不要分配內存(Duh!) 這很簡單:不要在引用類型上調用new。但是,對於新的值類型(如Matrix,Vector3和Color)也是可以的。 任何時候您發現自己想要新引用類型,都可以使用對象池來重用現有實例。 oncreators.xna.com上的Particle和Audio 3D示例使用此技術,並且SwampThingTom在博客中介紹了可重用池集合。 http://swampthingtom.blogspot.com/2007/06/generic-pool-collection-class.html http://spacedjase.com/post/2010/07/02/Generic-Resource-Pool.aspx

不要使用您的名義 分配當您將數據添加到一個集合類這樣的類作爲列表或字典,這可能需要分配內存來擴展集合。您可以通過使用具有顯式容量參數的集合構造函數重載來避免這種情況。指定一個容量來預分配儘可能多的內存,因爲您將需要最大數量的對象來存儲該集合。

不要讓CLR運行時分配 當發生裝箱時,CLR運行時分配內存。避免這樣的瘟疫!拳擊可能會發生很多原因,其中一些很明顯,其他原因很少發生: •如果將值類型分配給對象變量,則會將其裝箱。 •如果您將值類型存儲在其中一箇舊的非通用集合類中,它們將被裝箱。 •通過接口訪問值類型會導致它們被裝箱。 •如果使用枚舉類型作爲字典鍵,則內部字典操作將導致裝箱。您可以通過使用整數鍵,並且您鑄造枚舉值整數他們來自阿根廷 HERNAN