2012-02-21 42 views
2

我正在開發一個應用程序(XNA遊戲)的XBOX,這是一個非常簡單的應用程序。首頁包含具有移動gif圖像的圖塊。這些gif圖像實際上都是png圖像,每個圖塊都會加載一次,然後放入一個數組中。然後,使用定義的延遲,播放這些圖像(使用延時遞增的計數器)。Xbox Xbox框架當GC踢

這一切都很好,但是,我注意到在GIF圖像的移動過程中每x秒都會有一些小的延遲。然後我就開始添加一些標杆的東西:

http://gyazo.com/f5fe0da3ff81bd45c0c52d963feb91d8

正如你所看到的,FPS是這樣一個簡單的程序相當低(這是在調試,從Xbox itsself運行應用程序時,我得到平均62fps)。 2個重要設置: Graphics.SynchronizeWithVerticalRetrace = false; IsFixedTimeStep = false;

將isFixedTimeStep更改爲true會增加延遲。設置瓷磚有旋轉的輪子,並且您可以每隔x秒看到一次輪子。 SynchronizeWVR的計數也會增加滯後。

我注意到滯後和垃圾收集踢,每次它踢的那一刻之間的連接,有一個滯後...

不介意MAX HMU(堆內存使用量),作爲這是需要開始的金額,平均值更加現實。

下面是從性能監視器的另一個屏幕,但我不明白,從這個工具,我用它第一次了...希望它能幫助:

http://gyazo.com/f70a3d400657ac61e6e9f2caaaf17587

+0

爲Xbox開發垃圾收集效率低下是一個衆所周知的問題。在Google中搜索將爲您提供大量信息和解決方案,它們是最常用的緩存對象,而不是重新創建它們,以及更復雜的版本,創建池以重用對象。 – Elideb 2012-02-21 15:41:38

+0

@Mortana我讀過這個問題的答案和評論的一個好地方開始瞭解GC最佳做法的360 http://stackoverflow.com/questions/9142918/poor-performance-on-360-and- WP7/9150698#9150698 – 2012-02-21 20:54:45

回答

0

過了一會兒研究發現罪魁禍首。

我有所有派生自GameComponent的自定義組件,以及誰被添加到主Game類的組件列表中。

這是一個(共2個)主要問題,導致更新所有不需要更新的東西。 (繪製方法是唯一一個記住頁面狀態的人,只有在需要時才繪製)。 我通過使用不同的「屏幕」(或我稱之爲頁面)來解決這個問題,這是從GameComponent派生的唯一組件。

然後,我只更新最活躍的頁面,並且該頁面上的自定義組件也被更新。問題已修復。

第二個大問題,是以下; 我做了一個幫助我定位屏幕上的東西的類,相對的,百分比和類似的東西。父容器,對齊& v對齊等等等 該類具有屬性,對於大小爲&的向量,但不是將計算值保存在後臺字段中,而是每次訪問屬性時都重新計算它們。但是計算複雜的東西就像使用引用(例如父容器&子容器),這使CLR變得非常困難,因爲它有很多工作要做。

我現在重建整個定位類到一個全功能優化的類,用不同的標誌重新計算必要時,而不是20fps滴,我現在得到平均170 + fps!