我有一些代码与android开发网站上的示例非常相似。我一定很困惑为什么一些程序员或教程会把统一位置的获取和属性浏览器的设置放在一起
GLES20.glUseProgram(mProgram);
// get handle to vertex shader's vPosition member
mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
// Enable a handle to the triangle vertices
GLES20.glEnableVertexAttribArray(mPositionHandle);
// Prepare the triangle coordinate data
GLES20.glVertexAttribPointer(
mPositionHandle, COORDS_PER_VERTEX,
GLES20.GL_FLOAT, false,
vertexStride, vertexBuffer);
// get handle to fragment shader's vColor member
mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
// Set color for drawing the triangle
GLES20.glUniform4fv(mColorHandle, 1, color, 0);
// get handle to shape's transformation matrix
mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
MyGLRenderer.checkGlError("glGetUniformLocation");
// Apply the projection and view transformation
GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);
MyGLRenderer.checkGlError("glUniformMatrix4fv");
// Draw the triangle
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
// Disable vertex array
GLES20.glDisableVertexAttribArray(mPositionHandle);
到绘图方法?。根据我的理解,绘图方法是一个循环。所以把声明放在那里会让应用程序变慢吗?。另一方面,其他人将该代码放在on surface created
上,即使他们有相同的代码。在这里,哪种方式更可取?
获取初始化代码中的属性和统一指针是一种方法,因为它们在应用程序的整个生命周期中都不会改变。I、 建议一些教程初始化onDraw()中的指针,主要是为了简单起见。就性能而言,它无论如何都不会有任何明显的区别。
我总是在onSurfaceCreated中设置这些句柄。正如您正确注意到的,onDraw方法在连续循环中运行(除非您已将模式设置为RENDERMODE_WHEN_DIRTY),并且这些控制柄不会在迭代之间更改,因为您在onSurfaceCreated中只编译过一次顶点/片段着色器。
然而,它实际上没有什么不同,如果你把它放在onDraw中,也不会让你的应用程序变慢。OpenGL在onDraw中做了大量的工作,例如应用变换和渲染基元。相比之下,设置这些句柄是微不足道的,而且额外的开销也很小,不会引起注意。