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

标签 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");
            }
        });
.....

}

但这也卡住了我的游戏。

我该怎么办?

最佳答案

您当前的代码正在发布一个 Runnable 实例,该实例将在下一帧之前由渲染线程执行。 Gdx.app.postRunnable API 通常用于后台线程可以请求在渲染线程上发生某些事情。您想要发布一个 Runnable 以在渲染线程以外的任何地方执行。

只要您的 Stats 代码根本不与 OpenGL 上下文交互(因为 Android OpenGL API 假定只有一个线程与它们交互),您只需在新背景上发布您的 Runnable主题:

new Thread(new Runnable() { ... }).start();

这应该会解锁您的渲染。 (当然,如果您的后台线程使用大量 CPU,它仍然会干扰渲染线程,但如果它主要执行阻塞 IO 或主机有备用内核,则它不应该干扰。)

这可以通过多种方式进行改进(使用 ThreadPool,或使用支持 Android 的后台任务),但如果您的统计信息更新相对较快并且线程创建不频繁,那么这应该可以正常工作。

关于java - libgdx - 在其他线程中做某事不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22424109/

相关文章:

java - 如何模拟私有(private)静态属性,特别是 ResourceBundle

java - RecyclerView - 获取特定位置的 View

java - 通过 JGit 添加远程

c++ - 英特尔tbb内存开销

c# - 如何在 Visual Studio 中调试单线程?

wcf - 异步WCF

java - 不想将图像保留在同一文件夹中的 jar 文件之外

java - 如何使用三个不同的线程调用同一方法

c# - 对同一 http 主机的多个同时请求

mysql - 带有mysql查询的异步函数不会返回查询结果node.js