2011-02-23 89 views
14

在較慢的設備上測試我的遊戲(橙色舊金山又名ZTE Blade),我的幀速率令人震驚。lockCanvas()真的很慢

我把一些調試代碼到平局環路,發現下面的行接管100ms的:

c = mSurfaceHolder.lockCanvas(); 

其他人看到這種行爲?我通過擴展視圖和實現onDraw()臨時替換了surfaceview,並且我獲得了更好的幀率。

雖然在我的HTC Desire上一般surfaceView是快得多。我懷疑這可能是Android 2.1的問題。如果可能的話,我正在考慮將手機生根並將其升級到2.2,但我確實希望在2.1上運行設備,以便從長遠來看可能會適得其反。

**更新**

我一直對這個多一些,並發現了一些更令人費解的方面吧。

我紮根手機並安裝2.2,問題仍然存在。當應用程序第一次啓動時,lockCanvas按照預期工作(0-1毫秒)。然後,在初始化過程中的某個時刻,lockCanvas突然開始大約需要100ms。

可能值得指出的是,我正在將資產加載到異步任務中,以便我可以顯示加載屏幕。

儘管我盡最大的努力來確定當程序實際發生緩慢時,我無法做到這一點。事實上,當我以調試模式和單步執行它時,它運行得很快!

現在我發現,如果我在我的SurfaceView的構造函數(大約10秒)中添加延遲,緩慢不會發生,並且都可以正常工作。

但是,如果按Home鍵,然後切換回來,則緩慢迴歸。

我幾乎在這個愚蠢的不合邏輯的問題上束縛着我!我很想把它歸結爲一個設備特定的問題。

我覺得它可能與內存使用有關。也許有些東西正在被換掉,它會影響視頻內存?至少我會對理論感興趣。

+0

描述什麼時候控制*什麼時候渲染髮生......你是在使用一個專用的線程,還是在每個draw()的末尾使用invalidate(),或者你使用時序機制還是什麼? – 2011-03-03 16:34:02

+0

我使用線程繪製(與SpriteMethodTest相同)。只是循環而真實。 – Kevin 2011-03-03 21:42:33

+0

你是否有可能陷入大GC?我的意思是我同意lockCanvas()不是最便宜的通話,但它不應該花那麼長時間。如果你在愛荷華州的通話過程中遇到GC問題,那麼通話時間似乎比應該多花100ms。你有一個logcat或一些代碼示例? – 2011-03-07 02:44:35

回答

11

關於從文檔lockCanvas():

如果調用此反覆當 表面沒有準備好(之前 Callback.surfaceCreated或 Callback.surfaceDestroyed後),您的通話將 節流至爲了避免消耗CPU,在 的緩慢率。

是否有可能您的繪製循環對於某些設備太早啓動?我認爲這是問題,因爲你寫的:

現在我發現,如果我在SurfaceView(約10秒) 的構造函數中添加一個延遲 ,緩慢 不會發生,所有工作正常。

+0

我給你+1在文檔中找到。我上週也看到了,並且測試了它,但它沒有解決問題,雖然再次閱讀它,我需要仔細檢查我做了什麼。無論如何,我將把這個獎勵視爲最佳答案。 – Kevin 2011-03-10 16:22:20

0

那麼,也許我們可以使用holder.isCreating()來檢查狀態? 如果仍然創建畫布,此方法將返回true。

類似於 while(holder.isCreating()){} can = holder.lockCanvas();

但我現在有點困惑。正如我所知,在創建表面視圖時會調用colbeck。我們應該實現SurfaceHolder.Callback接口。當表面創建回調方法 public void surfaceCreated(SurfaceHolder holder){}將被調用。 從surfaceCreated方法我開始gameloop線程。

0

我最近發現,如果大量位圖用於繪製在畫布這些位圖存儲在活動課上 - 在「_surfaceHolder.lockCanvas()」命令本身需要很長(約70毫秒取決於設備)。但是,將這些位圖存儲移動到其他類(在不同的文件中,比如說MY_DATA),並且這個活動只是提到了這個新類 - 解決了這個問題。

我對這種現象沒有任何解釋。

0

我遇到了與Canvas繪圖一樣的神祕問題,但是通過改變Canvas繪圖到SurfaceView來解決。但現在我不斷撥打電話lockCanvas()。 這是我的觀察結果。 問題是隻存在於一些設備:

  • 銀河注3 N900:有問題
  • 銀河注3 N9005:有問題
  • 銀河S4 i9505:有問題
  • 銀河吉奧:沒有問題
  • LG G2 D802:有問題
  • 銀河S2 I9100:沒有問題

我暫時通過擴展查看和執行的onDraw()取代了surfaceview,我得到了一個更好的幀率

我也注意到,在使用的GLES20Canvas代替普通CanvasonDraw()繪圖三星手機,作爲結果,更好的表現。