尝试有选择地重画android游戏的背景,但运动图像会在屏幕上复制

尝试有选择地重画android游戏的背景,但运动图像会在屏幕上复制,android,opengl-es,Android,Opengl Es,如果我只是从显示问题的图片开始,这是最简单的。这些图片显示了纹理四处移动的快照 我的HTC Hero上的应用程序: emulator上运行正常的应用程序(忽略随机放置的剩余部分,我知道它们的原因,这不是问题): 现在,如果你看第一张图片,上面的一张是“真实的”,其他的图片总是在下面,上面还有副本。我目前只重新绘制了访问过的背景方块,出于某种原因,它们被绘制在副本上方(你可以看到它们都被瓷砖部分覆盖) 在安卓手机上,你是否需要在每一帧都重新绘制整个屏幕?还是有可能把这些奇怪的复制品处理掉 以下

如果我只是从显示问题的图片开始,这是最简单的。这些图片显示了纹理四处移动的快照

我的HTC Hero上的应用程序:

emulator上运行正常的应用程序(忽略随机放置的剩余部分,我知道它们的原因,这不是问题):

现在,如果你看第一张图片,上面的一张是“真实的”,其他的图片总是在下面,上面还有副本。我目前只重新绘制了访问过的背景方块,出于某种原因,它们被绘制在副本上方(你可以看到它们都被瓷砖部分覆盖)

在安卓手机上,你是否需要在每一帧都重新绘制整个屏幕?还是有可能把这些奇怪的复制品处理掉

以下是用于绘制纹理的代码(我是opengl es新手,所以它很像复制岛):

首先

然后对于每个纹理(我先绘制背景,然后在本例中仅绘制一个绿巨人纹理。我确定它只绘制一次):

最后:

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();
}
非常感谢您的帮助,如果有任何不清楚的地方,请留言


编辑:我应该补充一点,如果我每一帧都重新绘制所有的方块,那么“额外”的图像将被隐藏,并且它将以应有的方式工作。

我可以知道您在哪里清除以前访问过的方块吗。绝对有可能只更新脏药水。但假设您使用android进行编码,它会维护两个缓冲区,以便在内部进行交换。在这种情况下,您必须确保清除将图像向后绘制2帧的区域

在安卓手机上,你是否需要在每一帧都重新绘制整个屏幕


是的,这就是为什么使用双缓冲。在显示当前帧的同时准备下一帧。

这正是第2张图像中出现剩余帧的原因,但这不会有问题。我的问题是为什么我会得到相同的图像上下重复。因此,一个图像有点变成了一整列图像。但是,当我重新绘制所有内容时,问题确实消失了。这些图像从来没有被画在它不应该画的位置,而且总是笔直地在上面和下面。我想知道这是否与纹理的处理方式有关……因此,仅仅渲染更改的内容并依靠旧的内容将其保留在原来的位置无法保存渲染调用?不过,它在模拟器上运行良好。谢谢,那我就重新粉刷一遍。不。自从我使用图形引擎开发以来,我还没有见过任何类似的解决方案。
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();
}