Bol*_*aul 3 java multithreading asynchronous libgdx
我的游戏有一个统计数据队列,每场比赛结束后,当前的游戏统计数据都会进入队列。每当主菜单启动时,我想将所有游戏统计信息上传到服务器,这需要 1-3 秒,我想在另一个线程中执行此操作。
我的代码
@Override
public void show() {
Global.key = Global.getKey();
// System.out.println(Stats.getJSONObject(Global.key));
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
Stats.TryUploadGame1();
System.out.println("DONE");
}
});
.....
}
Run Code Online (Sandbox Code Playgroud)
但这也冻结了我的游戏。
我该怎么办?
您当前的代码正在发布一个Runnable实例,该实例将由渲染线程在下一帧之前执行。该Gdx.app.postRunnableAPI,通常使用这样的后台线程可以问一些渲染线程上发生。您想发布一个Runnable以在渲染线程之外的任何地方执行。
只要您的 Stats 代码根本不与 OpenGL 上下文交互(因为 Android OpenGL API 假定只有一个线程与它们交互),您就可以Runnable在新的后台线程上发布您的:
new Thread(new Runnable() { ... }).start();
Run Code Online (Sandbox Code Playgroud)
这应该会解锁您的渲染。(当然,如果你的后台线程使用大量 CPU,它仍然会干扰渲染线程,但如果它主要做阻塞 IO 或主机有备用内核,它不应该干扰。)
这可以通过多种方式进行改进(使用 ThreadPool,或使用 Android 感知后台任务支持),但是如果您的统计信息更新相对较快并且线程创建不频繁,这应该可以正常工作。
| 归档时间: |
|
| 查看次数: |
4579 次 |
| 最近记录: |