簡體   English   中英

旋轉畫布和繪圖位圖的性能

[英]Rotating canvas and drawing bitmap performance

我正在嘗試制作一個游戲,使行星位於用戶屏幕的中心,並像行星一樣緩慢旋轉。.因此,我首先決定測試一下它是否可以正常工作,但不能正常工作。像這樣的簡單“行星”圖像:

Bitmap image = BitmapFactory.decodeResource(getResources(),R.mipmap.totone);

我也有一個存儲角度的變量。 然后在繪圖功能中,我只是旋轉畫布,繪制行星(現在已旋轉),然后將畫布旋轉回去。 像這樣:

//the planet's image is 512x512px
canvas.rotate(ang,256,256); //256, 256 is the center of rotation
canvas.drawBitmap(image, 0,0, null);
canvas.rotate(-ang,256,256); //rotate back

我不知道為什么,但是當圖像旋轉90度和270度時,游戲fps會降低一點? 我做了一點gif來顯示問題。 fps一直都是完美的60,但隨后幾毫秒就下降到50ish了嗎? 是什么原因造成的? 我試圖將線程的目標fps更改為30,然后看起來沒有fps下降。。所以這可能是性能問題。 請注意,我嘗試使用不同的方法旋轉位圖,但fps下降效果仍然相同。

Gif

這很可能是設備的固定屏幕刷新率與以特定角度繪制位圖所需時間的微小變化之間的相互作用。

我猜想你在onDraw()中將ang增加一個恆定的數量。 這個事實可以用來解釋轉速的急劇變化。

說明

您的設備以60Hz刷新屏幕。 這意味着在理想條件下onDraw()最大調用頻率為60Hz:大約每16.7ms調用一次。

假設onDraw()需要大約15毫秒的時間來執行。 剩下1.7毫秒; 一切安好! 您將獲得一個流暢,平滑的60Hz旋轉。

然后假設,在ang某些值處, onDraw()花費的時間稍長一些; 比方說18毫秒 (我將推測為什么drawBitmap()的執行時間會隨瞬間的角度而變化。現在,讓我們看一下這18ms的繪制時間會發生什么。)

理想情況下, onDraw()的調用頻率為60Hz。 但是現在你花太長時間了; 超過1個周期。 現在, 合成器必須從您的應用程序中刪除幀,因為您無法提供足夠快的幀! 因此,現在只能每33.4ms調用一次onDraw() ,而不是每16.7ms執行一次。

換句話說,屏幕硬件以恆定速率刷新,並且當您的onDraw()超過該16.7ms閾值時,您的更新速率將精確地減半。

這是在您的GIF中暗示的。 顯示的幀速率從60變為51,但是對我來說,很明顯實際旋轉速率幾乎下降了50%。 我懷疑差異僅是由於您計算顯示幀速率的方式造成的。

drawBitmap()執行時間中的變化的規范化

可能是處理器的緩存性能。 在某些旋轉角度下,圖形邏輯可能以對L1緩存/預取邏輯不理想的方式訪問位圖內存。 換句話說,從這些角度來看,您可能會遇到很多緩存未命中的情況。

推薦的可玩性修復

  1. 使用更快的圖形管線,例如OpenGL,和/或:
  2. 基地ang在一次黑客( uptimeMillis()而不是一個增量。 您仍然會丟幀,但視在旋轉速率將得到糾正。
  3. 如果您想發瘋,則可以提供第二個位圖,該位圖會與第一個位圖預先旋轉90度,並使用該位圖進行以接近90/270度的角度進行繪制。 如果我對高速緩存未命中的判斷是正確的,則可以緩解此問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM