Попытка выборочно перерисовать фон для игры на андроид, но движущееся изображение дублируется по экрану - PullRequest
1 голос
/ 09 апреля 2011

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

Приложение на моем HTC Hero:

Image from my Hero

То же приложение на эмуляторе, где оно работает нормально (не обращая внимания на случайно размещенные остатки, я знаю их причину, и это не проблема): Image from the emulator

Теперь, если вы посмотрите на первое изображение, верхнее - это «настоящее», а остальные всегда следуют внизу, а также есть копии выше. В настоящее время я перекрашиваю только фоновые квадраты, которые посетили, и они по какой-то причине нарисованы над копиями (вы можете видеть, что все они частично закрашены плиткой).

Нужно ли перекрашивать весь экран каждый кадр на телефонах Android? Или можно избавиться от этих странных копий?

Вот код, используемый для рисования текстур (я новичок в opengl-es, так что это очень похоже на остров реплик):

первый

public static void beginDrawing(GL10 gl, float viewWidth, float viewHeight) {
    gl.glShadeModel(GL10.GL_FLAT);
    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glColor4x(0x10000, 0x10000, 0x10000, 0x10000);

    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glPushMatrix();
    gl.glLoadIdentity();
    gl.glOrthof(0.0f, viewWidth, 0.0f, viewHeight, 0.0f, 1.0f);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glPushMatrix();
    gl.glLoadIdentity();

    gl.glEnable(GL10.GL_TEXTURE_2D);
}

Затем для каждой текстуры (сначала я рисую фон, затем в этом случае только одну текстуру Халка. Я уверен, что она рисуется только один раз):

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);
        ((GL11Ext) gl).glDrawTexfOES(x, y, 0, (float) mWidth, (float) mHeight); 

и в конце:

public static void endDrawing(GL10 gl) {
    gl.glDisable(GL10.GL_BLEND);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glPopMatrix();
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glPopMatrix();
}

Код, который я использую для загрузки текстур:

private void loadGLTextures(GL10 gl) {
    int[] textures = new int[1];
    gl.glGenTextures(1, textures, 0);
    textureID = textures[0];

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
            GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
            GL10.GL_LINEAR);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
            GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
            GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,
            GL10.GL_MODULATE);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
    int[] mCropWorkspace = new int[4];
    mCropWorkspace[0] = 0;
    mCropWorkspace[1] = bitmap.getHeight();
    mCropWorkspace[2] = bitmap.getWidth();
    mCropWorkspace[3] = -bitmap.getHeight();
    ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, 
            GL11Ext.GL_TEXTURE_CROP_RECT_OES, 
            mCropWorkspace,
            0);
    mCrop = mCropWorkspace;
    bitmap.recycle();
}

Вся помощь очень ценится, и, если что-то неясно, оставьте комментарий!

РЕДАКТИРОВАТЬ: я должен добавить, что если я каждый кадр перерисовываю все квадраты, «лишние» изображения скрыты, и это работает так, как должно.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Нужно ли перекрашивать весь экран каждый кадр на телефонах Android?

Да, и именно поэтому используется двойная буферизация. Подготовка следующего кадра при отображении текущего кадра.

1 голос
/ 12 апреля 2011

Могу я узнать, где именно вы расчищаете ранее посещенную площадь. Определенно можно обновить только грязное зелье. Но при условии, что вы кодируете с помощью Android, он поддерживает два буфера, в которых внутренняя перестановка происходит. В этом случае вы должны убедиться, что вы очистили область, где изображение было нарисовано 2 кадра назад.

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