(android - Opengl-es) GlTexSubImage2D Hiccup Первый звонок после первого розыгрыша - PullRequest
1 голос
/ 12 марта 2011

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

после некоторого теста, я нашел единственный звонок, который зависает.

gl.glTexSubImage2D (GL10.GL_TEXTURE_2D, 0, x, y, ширина, высота, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer);

декаль действительно крошечная (32 * 32 пикселя), после этого вызова нет ошибки opengl, и я действительно не понимаю все (я имею в виду ..... создание целого слоя листов на самом деле занимает намного меньше, чем 1 секунду, и выполняется тысячами команды glTexSubImage2D на большой пустой текстуре ..... 3 секунды довольно большие).

У меня уже есть обходной путь («поддельное» обновление как раз перед тем, как отключается заставка), но я действительно хочу понять это странное (по крайней мере для меня) поведение ..: |

(мне очень жаль моего английского, надеюсь, это понятно)

METHOD: 
    public static void replaceSubImg(GL10 gl, int hwdId , int x,int  y,int width, int height,Buffer pixelBuffer) {
        gl.glFinish();
        gl.glBindTexture(GL10.GL_TEXTURE_2D, hwdId);
        long time = System.currentTimeMillis();
        gl.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, x, y, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer);
        Log.d("testApps","openglUtil,@@@@@@@@@@@@@@@@@@@@@@@@@ subImg replaced in "+(System.currentTimeMillis()-time)+" ms");
    }

    LOG:        
     DEBUG/testApps(3809): openglUtil,@@@@@@@@@@@@@@@@@@@@@@@@@ subImg replaced in 2811 ms
     DEBUG/testApps(3809): openglUtil,@@@@@@@@@@@@@@@@@@@@@@@@@ subImg replaced in 1 ms(this is the 2d run)

Ответы [ 3 ]

1 голос
/ 13 марта 2011

после тонны тестов, я выделил все это, и это похоже на ошибку в реализации opengl в последнем cyanogenmod (или просто gingerbread, я еще не тестировал это ....) :

цианоген (пряник, 7rc2):

  • загрузка текстуры, ~ 1 мс,
  • изменение текстуры, ~ 1 мс,
  • Drawin текстуры, ~ 1 мс,
  • любое редактирование, даже 1px для 1px, для каждой текстуры, огромная задержка (в зависимости от того, насколько велика текстура), в моем случае ~ 3000ms
  • любое дальнейшее редактирование, независимо от размера, обратно до ~ 1 мс

на фройо (сток, frf91):

  • загрузка текстуры, ~ 1 мс,
  • изменение текстуры, ~ 1 мс
  • рисование текстуры, ~ 1мс
  • любое редактирование, даже 1px для 1px, для каждой текстуры, небольшая задержка (в зависимости от того, сколько большая текстура), в моем случае ~ 80мс
  • любое дальнейшее редактирование, независимо от размера, обратно до ~ 0 мс

в любом случае есть небольшая задержка, но на этот раз понятно.

0 голосов
/ 12 марта 2011

Инструкции OpenGL могут быть конвейерными и не могут быть выполнены немедленно. Кажется вероятным, что сам вызов glTexSubImage2D быстрый, но должен ждать завершения какой-либо другой операции.

Чтобы понять это, может быть полезно позвонить glFinish после некоторых основных операций и посмотреть, когда , что занимает много времени. Вы можете обнаружить, что фактическое время проводится в другом месте ... например, в тысяче glTexSubImage2D звонков?

0 голосов
/ 12 марта 2011

Я не уверен, правильно ли я вас понимаю, но:

Есть ли у вас код gl.glTexSubImage2D(GL10.GL_TEXTURE_2D, 0, x, y, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, pixelBuffer); на каждой итерации? Этот вызов довольно дорогой, и его не следует повторять каждый кадр (как будто вы создаете текстуру каждый раз, когда рисуете).

Вам необходимо загрузить свои текстуры в обратный вызов onSurfaceCreated, сохранить ваш GL pointer и присвоить этот указатель объекту Texture (объект, который просто удерживает указатель в OpenGL памяти).

После этого вы можете просто связать его, используя glBindTexture(GL10.GL_TEXTURE_2D, yourPointer);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...