天天看點

Android SurfaceView 繪圖及幀頻處理方法修正

今天我在審視上篇示例代碼時猛然發現我犯了個低級錯誤,緻使幀頻達不到預期,這個錯誤在這裡:

<a href="http://images.cnblogs.com/cnblogs_com/SkyD/Windows-Live-Writer/Android-SurfaceView-_14621/image_2.png"></a>

這裡設定每次繪制之後固定休眠33毫秒,以此來限制每秒幀頻在30幀。

但實際上這裡忽視了繪圖及其他運算所消耗的時間,也就是說除非其他所有操作的總耗時都不足1/3毫秒,否則我們就根本無法達到每秒30幀的期望。

修正方法是在每幀開始處理前擷取系統目前時間值,然後在處理完畢後再擷取一次目前時間值,然後用目前值減去舊值,就得到了處理所消耗的時間,然後用33毫秒減去得到的消耗時間,就是我們此幀接下來應當休眠的時間值了:

<a href="http://images.cnblogs.com/cnblogs_com/SkyD/Windows-Live-Writer/Android-SurfaceView-_14621/image_4.png"></a>

現在運作一下程式,就能看到跑得很流暢了。

我想可能從事過遊戲開發的人都能一眼看出這個錯誤吧,我是沒經驗在這栽了一下&gt;_&lt;~

在繪圖處理時,還有一點需要注意的就是:

鎖定Canvas之後到解鎖這段時間内,最好僅執行與繪圖有關的操作,其他代碼越少越好,就好像往常我們開發時打開資料庫連結一樣。

因為我們鎖定後其他線程如果要使用的話就得等待了,是以盡快釋放會節省其他線程的等待時間,要盡量把無關緊要的代碼放在這個時間段以外執行。

針對此例而言,就是那個有關矩陣部分的操作可以調整到前面去執行,Paint對象也可以挪到前面去建立,而且不需要每次循環都建立一個Paint對象,建立一次就足矣:

<a href="http://images.cnblogs.com/cnblogs_com/SkyD/Windows-Live-Writer/Android-SurfaceView-_14621/image_6.png"></a>

經過調整之後,綠色高亮部分就隻剩下繪圖相關的代碼了,減負了不少呵。

本文轉自斯克迪亞部落格園部落格,原文連結:http://www.cnblogs.com/SkyD/archive/2010/11/08/1872235.html,如需轉載請自行聯系原作者