Загрузка текстур в приложении Android OpenGL ES - PullRequest
6 голосов
/ 23 марта 2010

Мне было интересно, кто-нибудь мог бы посоветовать хороший шаблон для загрузки текстур в приложении Java для Java и OpenGL ES.

Моя первая задача - определить, сколько имен текстур нужно выделить и как я могу эффективно сделать это до рендеринга моих вершин.

Мое второе беспокойство связано с загрузкой текстур, я должен вывести текстуру для загрузки на основе моих игровых данных. Это означает, что я буду играть со строками, что, как я понимаю, я не должен делать в своей теме GL.

В целом, я понимаю, что происходит при загрузке текстур, я просто хочу извлечь из этого лучший жизненный цикл. Есть ли что-то еще, что я должен рассмотреть?

Ответы [ 2 ]

14 голосов
/ 24 марта 2010

1) Вы должны выделить столько имен текстур, сколько вам нужно. Один для каждой текстуры, которую вы используете.

Загрузка текстуры - очень тяжелая операция, которая останавливает конвейер рендеринга. Таким образом, вы никогда не должны загружать текстуры внутри игрового цикла. У вас должно быть состояние загрузки до состояния приложения, в котором вы визуализируете текстуры. Состояние загрузки отвечает за загрузку всех текстур, необходимых для рендеринга. Поэтому, когда вам нужно визуализировать вашу геометрию, у вас будут загружены все текстуры, и вам больше не придется об этом беспокоиться.

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

2) Если вы подразумеваете под выводом, что вам нужны разные текстуры для разных уровней или что-то похожее, то вы должны обработать данные уровней в состоянии загрузки и решить, какие текстуры нужно загрузить.

С другой стороны, если вам нужно рисовать текст (например, текущий счет), то в OpenGL все становится сложнее. У вас будут следующие опции: предварительно отобразить необходимый текст в текстурах (легко), реализовать собственный движок растровых шрифтов (сложнее) или использовать пару растровых изображений и холста для создания текстур на лету (медленно).

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

Для текущего счета достаточно иметь текстуру с глифом для чисел от 0 до 9 и использовать ее для отображения произвольных значений. Реализация будет довольно простой.

Если вам нужны более длинные локализованные тексты, вам нужно задуматься о создании текстур на лету. По сути, вы бы создали растровое изображение, в которое вы визуализируете текст, используя Canvas. Затем вы загружаете его как текстуру и визуализируете как любую другую текстуру. Если он вам больше не нужен, вы можете удалить его. Эта опция медленная и ее следует избегать внутри цикла приложения.

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

  • Минимизируйте изменения текстуры, так как это медленная операция. Оптимально вы должны визуализировать все объекты, используя одну и ту же текстуру в пакете. Затем измените текстуру и визуализируйте объекты. нуждаюсь в этом и т. д.
  • Использование текстурных атласов для минимизации количества текстур (и изменений текстур)
  • Если у вас много текстур, вам может понадобиться использовать битовую глубину, отличную от 8888, чтобы все ваши текстуры поместились в память. Использование более низких битовых глубин также может улучшить производительность.
2 голосов
/ 23 ноября 2011

Это должен быть комментарий к ответу Лаури, но я не могу комментировать с 1 повторением, и есть вещь, на которую следует указать:

Вам следует заново загружать текстуры каждый раз, когда ваш EGL-контекст теряется (т. Е. Когда ваши приложения переводятся в фоновый режим и обратно). Итак, правильное местоположение для (повторной) загрузки их в методе

public void onSurfaceChanged(GL10 gl, int width, int height)

рендерера. Очевидно, что если у вас есть различные наборы текстур, которые нужно загружать, в зависимости от того, на каком уровне игры вы играете, то при изменении уровня вы должны удалить текстуры, которые вы не собираетесь использовать, и загрузить новые текстуры. Кроме того, вы должны следить за тем, что вам нужно перезагружать при потере контекста EGL.

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