使用libGDX平台。加载纹理后,我的应用程序变短,不控制冻结。
@Override
public void render() {
float deltaTime = Gdx.graphics.getDeltaTime();
if (IS_LOG_ENGINE_SPEED_INFO) {
startTickCount = System.currentTimeMillis();
runingAppTime += deltaTime;
}
if (sceneDirector.sceneUpdate()) {
deltaTime = 0;
if (!manager.update()) {
Gdx.app.log("aaa", "Skip!");
return;
}
}
sceneDirector.getCurScene().updateLogic(deltaTime);
if (IS_LOG_ENGINE_SPEED_INFO) {
logStr = (System.currentTimeMillis() - startTickCount) + ", ";
startTickCount = System.currentTimeMillis();
}
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
batch.setProjectionMatrix(camera.combined);
sceneDirector.getCurScene().updateGraph(batch);
if (IS_LOG_ENGINE_SPEED_INFO) Gdx.app.log("aaa", logStr + (System.currentTimeMillis() - startTickCount));
}
我做什么:如果改变了场景-锻炼方法sceneDirector。sceneUpdate(),有一个纹理加载。纹理加载函数:
public static void loadAtlas(String pngFileName, String xmlFileName, Scene scene) {
MainClass.manager.load(pngFileName, Texture.class);
MainClass.manager.finishLoading();
Texture texture = MainClass.manager.get(pngFileName, Texture.class);
scene.textures.add(texture);
texture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
...
最后我们得到了什么?加载方法工作正确。渲染图形时只加载纹理。这可以通过显示应用程序的日志来确认:
01-07 16:38:50.509: INFO/aaa(27259): LogicTime: 1712, GraphTime: 145
01-07 16:38:50.559: INFO/aaa(27259): LogicTime: 0, GraphTime: 38
01-07 16:38:50.559: INFO/aaa(27259): LogicTime: 0, GraphTime: 1
01-07 16:38:50.569: INFO/aaa(27259): LogicTime: 0, GraphTime: 3
01-07 16:38:50.579: INFO/aaa(27259): LogicTime: 1, GraphTime: 1
01-07 16:38:50.589: INFO/aaa(27259): LogicTime: 0, GraphTime: 1
01-07 16:38:50.609: INFO/aaa(27259): LogicTime: 2, GraphTime: 2
01-07 16:38:50.629: INFO/aaa(27259): LogicTime: 0, GraphTime: 1
01-07 16:38:50.649: INFO/aaa(27259): LogicTime: 0, GraphTime: 4
但是!为什么第一次和第二次图像更新这么长时间?这个问题很重要,因为在加载图形后,立即在场景中开始操作。
This:
MainClass.manager.finishLoading();
可能是你的时间去了(虽然我不确定,因为你没有显示MainClass.manager
定义,你没有显示从render
到loadAtlas
的调用图)。你需要在后台加载资源(参见manager.update()
)。finishLoading
将阻塞当前线程(渲染线程),直到所有资源加载完毕。
这意味着你需要在加载资源之前在渲染线程上"渲染"。通常,这是通过显示"加载"屏幕来完成的。参见这个问题:如何使用libgdx资产管理器正确加载纹理