libgdx - 在其他线程中做某事不起作用

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)

但这也冻结了我的游戏。

我该怎么办?

P.T*_*.T. 5

您当前的代码正在发布一个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 感知后台任务支持),但是如果您的统计信息更新相对较快并且线程创建不频繁,这应该可以正常工作。