2011-01-31 61 views
7

我添加了幾個CALayers作爲UIView圖層的子圖層。每層的內容是從服務器下載的不同圖像。每個圖層都從屏幕外移動到隨機生成的位置。圖像數據是異步下載的。每張圖像大約爲300x300或更小。CALayer優化?

隨機放置的結果是,這些層重疊,有些被上面的層遮擋。這很好。

我除去層,因爲它們使用建議在the answer to this question的計算以確定覆蓋變得完全遮蔽從視野發生在一個單獨的線程。

我有一個UIPanGestureRecognizer,允許用戶在屏幕上拖動圖層。

當添加的圖層數量接近25-30並逐漸變差時,我遇到了性能問題。動畫變得不穩定並且通常完全不存在(新添加的層僅出現在其最終位置)。而平移手勢要麼被忽略,要麼導致選定圖層重新定位不連續。

我想我正在殺死所有圖層重疊並且上面有另一個圖層動畫的GPU?

有關如何提高性能的任何建議?

處理大量圖層的最佳做法?

讓圖層在單獨的view.layer中開始動畫比先前添加的圖層更好嗎?

謝謝!

回答

4

幾件快速檢查。

運行核心動畫工具並查找不透明度。只需將圖層的不透明標誌設置爲YES是不夠的,如果底層圖像具有alpha分量,則圖層將考慮此因素。

如果您從服務器獲得的數據具有alpha值,那麼您應該使用Quartz重新繪製並以不包含alpha的新格式在本地保存文件。

確保您不會將100萬像素的圖片放入100x100的圖塊中。還有核心動畫工具,打開「顏色未對齊的圖像」並尋找黃色。

30至50層應該沒問題。

+0

謝謝比爾。我會給它一個鏡頭。當我提供layer.contents(僅在繪製圖層時才使用)時,我的印象是不透明的被忽略了?阿爾法位將更加棘手 - 我在圖像邊緣周圍使用2px寬的透明邊框來平滑旋轉邊緣。關閉儀器! – TomH 2011-02-01 14:16:26

3

如果所有圖層不適合GPU的內存或內存部分,事情會減慢很多。據報道,與GPU內存中的合成層相比,加載和卸載GPU內存相當慢。您必須嘗試使用​​此內存限制,因爲較舊設備的可用GPU內存少於較新設備。