在Android中使用OpenGL有幾個重要可是容易忽視的事項測試
1. Render Modespa
Render的mode能夠設爲兩種模式,一種是自動循環模式,也就是說GL線程以必定的時間間隔自動的循環調用用戶實現的onDrawFrame()方法進行一幀一幀的繪製,還有一種的「髒」模式,也就是說當用戶須要重繪的時候,主動「拉」這個重繪過程,有點相似於Canvas中的invalidate()線程
具體的調用方法是在GLSurfaceView中ip
a.自動模式內存
setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);ci
b."髒"模式get
.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);it
當須要重繪時,調用date
GLSurfaceView.requestRender()循環
通常狀況下我使用髒模式,這樣能夠有效下降cpu負載。在N1的測試結果代表,OpenGL真正繪圖時通常會佔到30%以上的cpu。
2. Dither
Dither又叫抖動,是一種在色彩空間較小的設備上展現較大色彩空間的圖像的一種方法。好比在一個RGB_565的設備上展現RGB_888的圖像。若是簡單的截斷位的話,會形成色彩的失真和生硬。dither使用一個矩陣,來調整一個像素周圍的像素的值,來令人眼產生錯覺,而「模擬」出原來的色彩。缺省狀況下GLSurfaceView是RGB——565的surface,因此若是在該surface上直接繪製RGB_888的紋理的話就會產生色彩失真,修復辦法就是使能dither。方法很簡單
gl.glEnable(GL10.GL_DITHER);
3. 深度測試
深度測試是在片段處理過程當中經過測試一個片段在eye space的深度座標,來判斷它是否被更小深度座標的片段遮擋而決定是否真去繪製它。沒有深度測試,物體展示與否就會取決於繪製順序而不是擺放的座標。
在Android中打開深度測試的方法是
GLSufaceView.setEGLConfigChooser(true);
你甚至能夠進一步規範片段處理中每種測試所佔的位數:
mGLView.setEGLConfigChooser(redSize, greenSize, blueSize, alphaSize, depthSize, stencilSize)
4.深度座標的精度
3中已經知道咱們能夠設置深度緩衝區的位數以達到合理的精度。若是精度不夠的話,在「遠方」的物體可能出現不但願的重疊。道理顯而易見,因爲深度座標是非線性的,越遠的地方單位深度座標對應的實際距離越大。當精度不足時,較短差距的兩個物體就會被「截位」到一樣的深度座標而致使深度測試時發生錯誤。
解決的辦法有兩個:
1. 不要將投影平截頭的遠方座標設的太大,通常不要 far/near < 100 比較合適
2. 擴大深度緩衝區所佔的位數,以提升精度。代價就是佔用的內存會增大。
通常我首選1方案。
分享到: