2014-03-05 43 views
2

在我的Android 4.3應用程序中,我想從本地png將紋理加載到TextureView上。我不知道OpenGL,我正在使用GLTextureActivity硬件加速測試中的代碼。我在這裏也粘貼裝載質地部分:在某些設備上使用OpenGL ES 2.0進行Android繪圖紋理的速度較慢

private int loadTexture(int resource) { 
     int[] textures = new int[1]; 

     glActiveTexture(GL_TEXTURE0); 
     glGenTextures(1, textures, 0); 
     checkGlError(); 

     int texture = textures[0]; 
     glBindTexture(GL_TEXTURE_2D, texture); 
     checkGlError(); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

     Bitmap bitmap = BitmapFactory.decodeResource(mResources, resource); 

     GLUtils.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap, GL_UNSIGNED_BYTE, 0); 
     checkGlError(); 

     bitmap.recycle(); 

     return texture; 
    } 

我在兩臺設備上運行的代碼:的Nexus 7和Galaxy Nexus手機,而我注意到兩者之間的巨大的速度差。對於Nexus 7,繪圖部分大約需要170 ms,但對於Galaxy Nexus需要459 ms。最耗時的操作是加載紋理,尤其是texImage2D調用。我已經讀過,有芯片的芯片在功能上很慢,但是如何能告訴別人哪些是這些設備,以及如何避免使用這些功能來獲得相同的結果?

預先感謝您。

//編輯:glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)調用似乎也是在電話設備顯着較慢。這是爲什麼發生?我怎麼能避免它?

+0

FWIW,我爲Grafika(https://github.com/google/grafika)添加了一個'glTexImage2D()'時間測試。主要有一個簡單的方法來比較跨設備的512x512 RGBA紋理上傳。 – fadden

回答

1

你是否在每一幀重新加載紋理?這是不對的 - 你應該在主渲染循環之前加載紋理一次。即使在最快的設備上也不會加載即時貼圖 - 您可以加載資源,從中解碼位圖,然後將其加載到GPU。這需要一些時間。

+0

我已經修改了loadTextures()方法,以便操作在初始化時完成,並且每次幀重繪時唯一的調用是GLUtils.texImage2D,因爲我需要繪製幾個PNG,所以我繪製了不同的位圖每次。這是錯的嗎?我還能怎麼做?例如,如何在框架從SurfaceTexture上的相機或媒體播放器傳來時更快? – drgr

+0

'texImage2D()'是非常耗費資源的操作。它處理源位圖並將其上傳到GPU。這遠非「即時」操作。沒有必要改變你的'loadTexture()'方法,它是正確的。您可以擁有儘可能多的紋理,以適應GPU。只需創建一個數組或整數集合,然後在主渲染循環之前存儲所有紋理ID(從loadTexture()返回),然後僅將必要的ID傳遞到統一着色。 – keaukraine