GC使用Android视频游戏

时间:2013-01-24 15:43:06

标签: android opengl-es garbage-collection

我正在Android中使用JAVA和OpenGL-ES开发2D视频游戏。

我遇到问题,我认为它是垃圾收集器。每隔几秒钟,无论我做什么,游戏都会冻结。

我一直在阅读一些文档等等,我删除了所有的循环迭代器,现在我用于(i = 0,...)等解决方案。情况是,它没有对性能做任何事情......

我一直在寻找我的代码,我发现了一些我认为可能会产生问题的东西,而且它是我在动画中精灵之间进行切换的方式。

例如,我有一个可以移动按键的英雄。当它走路时,他的精灵在帧之间变化。为此,我移动纹理缓冲区以瞄准我想要的图像部分。每次都这样,我使用这个功能:

protected void SetTextureBuffer(float xo, float xf, float yo, float yf) {

    float textureVertexs[] = {
            xo, yf,     // top left
            xf, yf,     // bottom left
            xf, yo,     // top right
            xo, yo      // bottom right
    };

    // a float has 4 bytes so we allocate for each coordinate 4 bytes
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4);
    byteBuffer.order(ByteOrder.nativeOrder());

    // allocates the memory from the byte buffer
    textureBuffer = byteBuffer.asFloatBuffer();

    // fill the vertexBuffer with the vertices
    textureBuffer.put(textureVertexs);

    // set the cursor position to the beginning of the buffer
    textureBuffer.position(0);
}

每次调用时都会分配内存来创建缓冲区,这可能是每秒很多次,因为有更多实体带有动画......

你认为这可能是个问题吗?还是我错了?如果这是一个问题......我怎么能以另一种更有效的方式解决这个问题?

1 个答案:

答案 0 :(得分:1)

尝试删除这些行:

ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
textureBuffer = byteBuffer.asFloatBuffer();

在类构造函数/初始值设定项中分配textureBuffer一次。由于您不需要保留以前的数据,因此无需再次重新创建缓冲区。因此,您只需覆盖同一缓冲区中的旧数据。