我正在編寫一個簡單的2D遊戲引擎,並通過調用Canvas.drawBitmap將所有對象渲染到一個鎖定的SurfaceVew(所有相同的源位圖,但通常不與1:1源到目標縮放) 。當渲染很多位圖時出現奇怪的文物
一切似乎按預期工作,直到每幀有很多調用drawBitmap。發生這種情況時,我偶爾會看到一個停頓(100mS左右),並伴隨着效果,看起來好像幾幀渲染一起發生,即某些對象將在兩個屏幕位置或兩個以相同速度移動的對象上繪製兩次似乎會瞬間變得更近或更遠。
該應用程序的結構如下(爲了舉例簡化);
initialiseGameObjects();
while(quit==false)
{
processGameLogic(); // update object positions
Canvas c = surface_holder.lockCanvas();
if (c != null) {
drawGameObjects(c); // draw all objects
surface_holder.unlockCanvasAndPost(c);
}
}
據我所知,畫布是一個持票人,當郵政發出時得到執行。據推測,它可以容納的請求數量是有限的,我想知道如果我超過了這個限制(我根據屏幕上的內容在任何時候繪製了一百個小的位圖),並且無意中挑起了一些儘管我還沒有設法找到任何證明文件來證實或反駁這一點,但是在某種程度上,這種沖洗和搗亂是雙重緩衝。
有沒有人有任何想法可能會發生什麼?
問候, 史蒂夫
感謝。你的意思是同步的(surface_holder)封裝了draw調用嗎?如果是這樣的話,那麼我已經這樣做了,爲了簡單起見,我在上面的示例中省略了它,因爲它在執行作用域代碼時鎖定了surface_holder以防止從另一個線程訪問。 –
在這種情況下,您的代碼中可能有其他內容正在執行此操作。您可以儘可能快地在while循環中撥打電話,但下一步只能在前一個完成時纔會發生,所以我不認爲這是問題所在。幀的閃爍可能是由於遊戲邏輯,它發生在我身上。處理這個問題的一種方法是通過將代碼塊轉換爲註釋/*....*/直到找到導致它的原因來簡化代碼。 – Lumis
我想我知道爲什麼,你沒有在每一幀畫完整個畫布,而且因爲surfaceView是可以緩衝的,所以它的幀速率降低到了沒有畫的一半。檢查這個http://stackoverflow.com/questions/6847323/android-surfaceview-canvas-flickering-after-trying-to-clear-it/6849080#6849080 – Lumis