我正在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);
}
每次调用时都会分配内存来创建缓冲区,这可能是每秒很多次,因为有更多实体带有动画......
你认为这可能是个问题吗?还是我错了?如果这是一个问题......我怎么能以另一种更有效的方式解决这个问题?
答案 0 :(得分:1)
尝试删除这些行:
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(textureVertexs.length * 4);
byteBuffer.order(ByteOrder.nativeOrder());
textureBuffer = byteBuffer.asFloatBuffer();
在类构造函数/初始值设定项中分配textureBuffer
一次。由于您不需要保留以前的数据,因此无需再次重新创建缓冲区。因此,您只需覆盖同一缓冲区中的旧数据。