我寫了一個遊戲,其中當調用onDrawFrame()時,我首先更新遊戲狀態(遊戲邏輯和繪圖緩衝區),然後繼續執行實際繪圖。在Moto G和Nexus 7上,一切正常,每次onDrawFrame()調用只需要1-5ms。但是,在三星Galaxy S3上,90%的onDrawFrame()調用時間需要30-50ms才能更新。onDrawFrame中的GLES20調用導致長時間延遲
進一步調查問題我發現問題完全在於我在下面附加的第一個渲染方法: - (編輯:該塊現在在glclear();已刪除不必要的調用來獲取句柄,請參閱到的註釋)
public void render(float[] m, FloatBuffer vertex, FloatBuffer texture, ShortBuffer indices, int TextureNumber) {
GLES20.glVertexAttribPointer(mPositionHandle, 3, GLES20.GL_FLOAT, false, 0, vertex);
GLES20.glEnableVertexAttribArray(mPositionHandle);
GLES20.glVertexAttribPointer(mTexCoordLoc, 2, GLES20.GL_FLOAT, false, 0, texture);
GLES20.glEnableVertexAttribArray(mTexCoordLoc);
GLES20.glUniformMatrix4fv(mtrxhandle, 1, false, m, 0);
int mSamplerLoc = GLES20.glGetUniformLocation(fhGraphicTools.sp_Image, "s_texture");
GLES20.glUniform1i(mSamplerLoc, TextureNumber);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.capacity(), GLES20.GL_UNSIGNED_SHORT, indices);
// Disable vertex arrays used
GLES20.glDisableVertexAttribArray(mPositionHandle);
GLES20.glDisableVertexAttribArray(mTexCoordLoc);
}
上述方法被稱爲5次在每個onDrawFrame()來繪製在不同的紋理地圖的東西。 (前4個實際上是遊戲的背景,它是1長矩形)。已經登錄它需要在我找到的代碼的每一行,我在S3具有滯後總是駐留在下面線之一時:
int mPositionHandle = GLES20.glGetAttribLocation(fhGraphicTools.sp_Image, "vPosition");
或
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.capacity(), GLES20.GL_UNSIGNED_SHORT, indices);
滯後僅發生在render()的第一次調用中,因爲隨後的調用每次大約需要1-2ms。我已經嘗試禁用第一個render()調用,但之前只需要1-2ms的第二個調用現在成爲滯後的來源,在同一行下。
有沒有人有我S3代碼無法處理的錯誤的想法?看起來S3在每個onDrawFrame()的開頭都有開始GL調用的問題,但是爲什麼這樣的行爲令我困惑呢?可以做些什麼來減少「啓動」延遲?
非常感謝您的耐心閱讀。
編輯代碼採取Selvin的建議。
你爲什麼要在onDrawFrame中獲取attrib位置和制服?而不是在你編譯'fhGraphicTools.sp_Image'着色器之後將它存儲在fx'fhGraphicTools.sp_Image_mPositionHandle'中。 – Selvin 2014-09-23 09:42:50
我已經如你所說在編譯後存儲了句柄。現在「塊」來自glClear(),它在18-50ms之間。我做了一些搜索,發現這個帖子http://stackoverflow.com/questions/12224230/why-is-glclear-blocking-in-openglesbut看過它,我仍然不完全理解我的情況下的問題... – user3846551 2014-09-23 10:58:55