在較慢的設備上測試我的遊戲(橙色舊金山又名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鍵,然後切換回來,則緩慢迴歸。
我幾乎在這個愚蠢的不合邏輯的問題上束縛着我!我很想把它歸結爲一個設備特定的問題。
我覺得它可能與內存使用有關。也許有些東西正在被換掉,它會影響視頻內存?至少我會對理論感興趣。
描述什麼時候控制*什麼時候渲染髮生......你是在使用一個專用的線程,還是在每個draw()的末尾使用invalidate(),或者你使用時序機制還是什麼? – 2011-03-03 16:34:02
我使用線程繪製(與SpriteMethodTest相同)。只是循環而真實。 – Kevin 2011-03-03 21:42:33
你是否有可能陷入大GC?我的意思是我同意lockCanvas()不是最便宜的通話,但它不應該花那麼長時間。如果你在愛荷華州的通話過程中遇到GC問題,那麼通話時間似乎比應該多花100ms。你有一個logcat或一些代碼示例? – 2011-03-07 02:44:35