【发布时间】:2016-04-20 18:13:05
【问题描述】:
我认为在 LibGDX 中处理 BitmapFonts 存在问题。 我创建了这个测试:
printAnalytics();
ArrayList<BitmapFont> fonts = new ArrayList<BitmapFont>();
for (int i = 0; i < 2000; i++) {
// create a sample parameters
FreeTypeFontParameter params = new FreeTypeFontParameter();
params.size = 12;
params.minFilter = TextureFilter.Nearest;
params.magFilter = TextureFilter.Nearest;
// load the font
FileHandle fontFile = Gdx.files.internal("arial.ttf");
// generate it
FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fontFile);
BitmapFont bitmapFont = generator.generateFont(params);
bitmapFont.setUseIntegerPositions(false);
generator.dispose();
// add to array
fonts.add(bitmapFont);
}
printAnalytics();
// dispose all fonts
for (BitmapFont font : fonts) {
font.dispose();
}
// clear array
fonts.clear();
fonts = null;
printAnalytics();
如您所见,我在加载字体之前输出了一些内存信息。然后我创建 2 000 个 BitmapFonts 并再次输出信息。处理字体,销毁数组(丢失所有实例)并再次存储信息。 我正在使用默认的 arial 字体进行测试。
这里是printAnalytics方法的代码:
public void printAnalytics() {
int mb = 1024 * 1024;
// get Runtime instance
Runtime instance = Runtime.getRuntime();
System.out.println("\n***** Heap utilization statistics [MB] *****\n");
// available memory
System.out.println("Total Memory: " + (instance.totalMemory() / mb));
// free memory
System.out.println("Free Memory: " + (instance.freeMemory() / mb));
// used memory
System.out.println("Used Memory: " + ((instance.totalMemory() - instance.freeMemory()) / mb));
// Maximum available memory
System.out.println("Max Memory: " + (instance.maxMemory() / mb));
// Gdx heap
System.out.println("Gdx Java Heap: " + (Gdx.app.getJavaHeap() / mb));
// Gdx heap
System.out.println("Gdx Native Heap: " + (Gdx.app.getNativeHeap() / mb));
}
这是我的输出:
***** Heap utilization statistics [MB] *****
Total Memory: 120
Free Memory: 91
Used Memory: 28
Max Memory: 1790
Gdx Java Heap: 28
Gdx Native Heap: 28
***** Heap utilization statistics [MB] *****
Total Memory: 232
Free Memory: 109
Used Memory: 122
Max Memory: 1790
Gdx Java Heap: 122
Gdx Native Heap: 122
***** Heap utilization statistics [MB] *****
Total Memory: 232
Free Memory: 109
Used Memory: 122
Max Memory: 1790
Gdx Java Heap: 122
Gdx Native Heap: 122
还有来自任务管理器的数字:
- 测试前:165 MB (我正在测试我的一个应用程序)
- 加载字体后:800 MB
- 处理后:340 MB
可以看到问题:本次测试前后使用的内存应该是一样的。但事实并非如此。它是 +150/200 MB!
我检查了 BitmapFont 是否拥有纹理 (font.ownsTexture()) 并且它是真的,所以 dispose 方法也应该处理创建的字体纹理。
我知道 JVM 使用一些 RAM,所以这就是为什么任务管理器显示的数字比代码中的数字大。但是为什么最后使用的java堆是+94MB (122-28)而进程内存是+175MB (340-165)?
我是否加载或处理错误?是Java吗?是 LibGDX 吗?这是一个严重的问题,因为在我的程序的一部分中,我需要加载和卸载很多字体......
更新:
我跳过了数组部分:我创建了字体bitmapFont,然后立即调用了bitmapFont.dispose()和bitmapFont=null .进程内存没有改变,堆使用空间也保持不变。为什么?!
我在 Windows 7、Java 7 上运行。
【问题讨论】:
标签: java memory memory-leaks libgdx