2011-10-05 32 views
1

我有我的iPad應用程序的性能這個問題..iPad性能問題

爲了開發,我使用MonoDevelop,它負責照顧垃圾收集。我的問題仍然是相當普遍的。

好的,我用5個NavigationControllers TabBarController。在導航控制器內部有一些控制器,其視圖是TableView或ScrollViews。下一個孩子總是隻是定期的看法。

我有幾個問題:

1)TableViews從不順利滾動。我有一些alpha透明度,但由於我在Photoshop中完成了圖形處理,而不是以編程方式進行,因此此透明度不應引起太多問題。表格中是否有少量或多少結果並不重要。另一方面,我有ScrollView,它具有相同的用途,即具有不同佈局的表格和按鈕也具有Photoshop生成的透明度。它完美的作品。

對於我申請DequeueReusableCell()的表,它工作正常(我發現滾動後內存使用量沒有增加)。那麼爲什麼桌子滾動得這麼生澀呢?

2)我的應用程序支持旋轉。當我滾動表或scrollView,同時傾斜設備一點,我可能得到1或2 FPS。什麼是實施輪換的最佳方式?據我所知,必須在NavigationController鏈中的所有控制器中覆蓋ShouldAutorotateToInterfaceOrientation。另外,我需要在View中添加觀察者,我想要進行一些更改。我是否必須在所有視圖中使用BeginGeneratingDeviceOrientationNotifications(),還是足以在Main.cs中執行此操作?也許這會減慢它?

3)一段時間後,應用程序開始獲取內存警告,然後最終崩潰。我試着用Instruments讀取日誌並運行應用程序,但無法找到崩潰的原因。

4)從NavigationController棧彈出的視圖究竟發生了什麼?我無法重複使用它。但Monotouch(或我)不能正確處理它嗎?

我有幾乎相同的iPhone應用程序,而不支持從不崩潰的旋轉。我認爲我在這個輪換中做了一些錯誤,但我不確定是什麼。

任何幫助將不勝感激。所以,提前謝謝你。

Regards

回答

5

1-透明膠片始終是個問題。即使你沒有在代碼中渲染圖像,手機仍然需要進行圖像合成,這可能需要很長時間。每次顯示新單元格或者表格被滾動時,UITableViews都必須計算最終的合成圖像,而UIScrollViews只能計算一次,因爲圖像不會更改。所以要非常小心,關閉透明度,並檢查性能是否提高。

2 - 您不需要在應用程序中通知每個uiview。在控制器中接收只想更新的通知,例如,如果要重新排列UIViewControllers視圖中的項目。

3 - 您有一個(或多個)內存泄漏。我的猜測是,MonoTouch可能無法收集UIViews或UIViewControllers,因爲它們仍然從UIKit中的某個地方鏈接,就像UINavigationController一樣,直到應用程序獲得內存警告通知之前,UIView不會被UIKit處置。

+1

很好的答案,但4)不正確。 UIViews一旦不再是視圖層次結構的一部分(因爲視圖保留了它們的子視圖),並且沒有其他人保留它們。他們根本不關心記憶警告。另一方面查看_controllers_ _can_在低內存條件下卸載它們的視圖,如果它當前不可見。這適用於在導航控制器中當前顯示的視圖控制器「下方」,但是當您從堆棧彈出視圖控制器時,它應該立即釋放。 – omz

+0

Eduardo,omz,非常感謝您的幫助。 我會嘗試刪除alpha並查看它是否改進。 omz,謝謝你清理視圖保留。但是,如果我公開一些子視圖或將其作爲參數傳遞,會發生什麼?如果我手動處理它,我不會保留它並指向什麼?或者在自動處置的情況下,該對象仍然會有另一個指針? –

+0

@omz你說得對UIViews馬上被釋放。從問題(從navviewcontroller彈出的視圖會發生什麼),我認爲它們與UIViewController關聯。 –

2

就像愛德華多說的,Views中的alpha透明度是有代價的。有一些工具,你可以用它來從確定這些WWDC 2011的會談中討論的瓶頸:

https://developer.apple.com/videos/wwdc/2011/

  • iOS的性能和電源優化與儀器
  • 瞭解UIKit的渲染

在iOS模擬器的「調試」菜單中,您可以找到各種調試工具,這些工具會對屏幕的不同區域進行着色,指示出現問題的渲染的位置。 WWDC 2011會談展示瞭如何解決這些問題。

對於你的記憶問題,很有可能你有東西指向你周圍的物體,所以你需要確保這些物體消失。雖然我們目前沒有發佈MonoTouch的新分析器,可以顯示問題的根源,但我編寫了一個「窮人的」調試實用程序,它可以幫助您縮小哪些對象處於活動狀態。它可以在這裏找到:

http://tirania.org/tmp/HttpDebug.cs

呼叫HttpDebug.Start()從應用程序和運行,使用Web瀏覽器來http://localhost:5000連接到獲取實時Objective-C對象名單浮出水面C#。該工具並不完美,並顯示了大量不相關的數據,但它至少會讓您知道發生了什麼。