2012-07-20 6 views
0

Я искал ответ, но не нашел ничего конкретного.Текстуры для анимации в 2D OpenGL (Android)

Я хотел бы знать, что из этих двух примеров лучше связано со скоростью и производительностью. Заранее спасибо!

Я делаю openGL ES 1.0 Android в 2D. Для анимации символов я использую разные текстуры. У меня есть два максимальных возможности с текстурами:

Сначала один должна иметь каждую текстуру в качестве целочисленного массива и изменений, которые один выбираются в зависимости от кадра с:

gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[actual_id]); 

С другой стороны, мы можем иметь «Большая» текстура со всеми изображениями и просто изменяйте координаты Текстуры. В этом случае вместо:

private float textures[] = { 
    // Mapping coordinates for the vertices 
    0.0f, 1.0f,  // top left  (V2) 
    0.0f, 0.0f,  // bottom left (V1) 
    1.0f, 1.0f,  // top right (V4) 
    1.0f, 0.0f  // bottom right (V3) 
}; 

(который был бы один в первом случае) было бы:

private float textures[] = { 
    // Mapping coordinates for the vertices 
    0.0f, 0.5f,  // top left  (V2) 
    0.0f, 0.0f,  // bottom left (V1) 
    0.5f, 0.5f,  // top right (V4) 
    0.5f, 0.0f  // bottom right (V3) 
}; 

(Используя поле 2х2) И эти координаты должны перемещаться по текстуре.

Я хотел бы знать, какой из них может быть самым быстрым. Кроме того, если есть третий лучший способ, я хотел бы узнать об этом.

Спасибо за ваше время. Если у меня есть подробный вопрос, спросите меня.

+0

Здравствуйте, и добро пожаловать. Возможно, вам захочется узнать, что такие «предпочтительные» вопросы, как это, обычно считаются неприемлемыми (см. [FAQ] (http://stackoverflow.com/faq#dontask)). Сказав это, вы можете выбрать один критерий, который вас больше всего интересует. Я не считаю, что один метод «лучше», чем другой (может быть, быстрее, другой может использовать меньше памяти), и это может легко измениться с одного устройства на другое. Если вы можете выбрать один важный критерий и перефразировать свой вопрос, чтобы спросить только, что i.e *, какой метод использует меньше памяти *, это может быть более уместным. – Tim

+0

Спасибо за быстрый ответ. Я хотел бы знать, какая из них самая быстрая, чем использование памяти. Я собираюсь изменить вопрос, спасибо за ваш совет! – charlypu

ответ

0

Я думаю, что нет общего ответа на этот вопрос, потому что это зависит от некоторых других вещей.

Я предполагаю, что у вас есть много других объектов помимо персонажей для рисования. Давайте предположим, что у вас есть игровой цикл, который выглядит примерно так:

while (gameNotFinished) { 
    changeToTerrainTexture() 
    drawTerrain() 
    changeToCharacterTexture() 
    drawCharacter() // the character you want to draw 
    changeToHouseTexture() 
    drawHouse() 
    ... 
} 

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

Но если ваш цикл выглядит следующим образом:

while (gameNotFinished) { 
    changeToTerrainTexture() 
    drawTerrain() 
    changeToCharacterTexture() 
    for (int i = 0; i < characters.size(); i++) { 
    characters.get(i).draw() 
    } 
    ... 
} 

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

Я не знаю, существует ли какая-либо реальная альтернатива OpenGl ES 1.0. С ES 2.0 у вас будет возможность использовать одну текстуру для нескольких состояний анимации (например, ваш второй подход) и вычислить смещения координат текстуры в шейдере (так что вам не нужны несколько массивов текстурных координат).

+0

Итак, если у нас есть несколько символов, но у каждого есть свои собственные текстуры, первый вариант будет приятным? Спасибо за ваше мнение! – charlypu

+0

Да, если вам нужно переключить текстуру для каждого символа, вы не получите реальной выгоды от # 2 – micha

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