2013-11-21 1 views
0

У меня есть код, который очень похож на образец на веб-сайте разработчика Android. Я должен совершенно запутать, почему некоторые программисты или учебники положить получение равномерного расположения и настройки attribporinter, где можно разместить равномерное местоположение и атрибут? рисовать против поверхности?

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); 

к по методу жеребьевки ?. Из того, что я понимаю, метод draw - это цикл. SO, помещая объявление, сделает приложение медленным ?. Другие, с другой стороны, поставили этот код на on surface created, хотя они имеют одинаковый код. Какой из них здесь предпочтительнее?

ответ

0

Я всегда устанавливал эти ручки в onSurfaceCreated. Как вы правильно заметили, метод onDraw работает в непрерывном цикле (если вы не задали режим RENDERMODE_WHEN_DIRTY), и эти дескрипторы не будут меняться между итерациями, поскольку вы компилируете шейдеры вершин/фрагментов только один раз в onSurfaceCreated.

Однако это на самом деле очень мало отличается и не сделает ваше приложение медленным, если вы поместите его в onDraw. OpenGL делает огромную работу в onDraw, например, применяя преобразования и примитивы рендеринга. Установка этих ручек тривиальна в сравнении, а дополнительные накладные расходы крошечные и не будут заметны.

1

Получение атрибутных и унифицированных указателей в вашем коде инициализации - это путь, так как они не будут меняться на протяжении всего срока службы приложения. Я предлагаю, чтобы некоторые учебники инициализировали указатели в onDraw() в основном для простоты. Разумеется, это не вызовет каких-либо заметных различий.

Смежные вопросы