Libgdx 批量绘制内存问题
Libgdx Batch Draw Memory Issue
我试图使用 jconsole(来自 JDK 的内置工具)监控我的游戏的内存使用情况。我发现 gc 每大约 3 分钟调用一次,因为堆分配每 3 秒增加大约 3 MB。我试图通过将我的渲染循环简化为尽可能简单来寻找原因,直到剩下的唯一代码是这样的:
public void render() {
camera.update();
Gdx.gl.glClearColor(0.5f, 0.2f, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.setProjectionMatrix(camera.combined);
batch.setColor(1f, 1f, 1f, 1);
for( int y = 0 ; y < l1BlockedNd.size ; y++){
batch.draw(pmxTexture[0], l1BlockedNd.get(y).getPosX() * 10, l1BlockedNd.get(y).getPosY() * 10);
}
}
当我删除 batch.draw 调用时,我发现堆不再增加...这很奇怪,因为我根本没有创建任何新对象。我做错了什么?
原来 batch.draw() 方法似乎有一点内存开销(实际上很少)。出现问题是因为我尝试在每一帧中绘制大量对象(大约 90000 个对象)。通过仅选择玩家当前可见的对象来减少绘制对象的数量即可解决此问题。
我知道你说你解决了你的问题......但是,你需要做的另一件事是在你所有的 batch.draw(...) 调用。
public void render() {
camera.update();
Gdx.gl.glClearColor(0.5f, 0.2f, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.setProjectionMatrix(camera.combined);
batch.setColor(1f, 1f, 1f, 1);
for( int y = 0 ; y < l1BlockedNd.size ; y++){
batch.draw(pmxTexture[0], l1BlockedNd.get(y).getPosX() * 10, l1BlockedNd.get(y).getPosY() * 10);
}
batch.end();
}
batch.end() 是实际绘制批次中的东西。如果您从不自己调用它,那么批次绘制的唯一时间是它完全填满并刷新时。
我试图使用 jconsole(来自 JDK 的内置工具)监控我的游戏的内存使用情况。我发现 gc 每大约 3 分钟调用一次,因为堆分配每 3 秒增加大约 3 MB。我试图通过将我的渲染循环简化为尽可能简单来寻找原因,直到剩下的唯一代码是这样的:
public void render() {
camera.update();
Gdx.gl.glClearColor(0.5f, 0.2f, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.setProjectionMatrix(camera.combined);
batch.setColor(1f, 1f, 1f, 1);
for( int y = 0 ; y < l1BlockedNd.size ; y++){
batch.draw(pmxTexture[0], l1BlockedNd.get(y).getPosX() * 10, l1BlockedNd.get(y).getPosY() * 10);
}
}
当我删除 batch.draw 调用时,我发现堆不再增加...这很奇怪,因为我根本没有创建任何新对象。我做错了什么?
原来 batch.draw() 方法似乎有一点内存开销(实际上很少)。出现问题是因为我尝试在每一帧中绘制大量对象(大约 90000 个对象)。通过仅选择玩家当前可见的对象来减少绘制对象的数量即可解决此问题。
我知道你说你解决了你的问题......但是,你需要做的另一件事是在你所有的 batch.draw(...) 调用。
public void render() {
camera.update();
Gdx.gl.glClearColor(0.5f, 0.2f, 0, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
batch.setProjectionMatrix(camera.combined);
batch.setColor(1f, 1f, 1f, 1);
for( int y = 0 ; y < l1BlockedNd.size ; y++){
batch.draw(pmxTexture[0], l1BlockedNd.get(y).getPosX() * 10, l1BlockedNd.get(y).getPosY() * 10);
}
batch.end();
}
batch.end() 是实际绘制批次中的东西。如果您从不自己调用它,那么批次绘制的唯一时间是它完全填满并刷新时。