LibGDX:在另一个线程中创建新的scene2d对象?

时间:2018-04-28 20:10:37

标签: java multithreading libgdx thread-safety scene2d

我有一个存储例如数据库的数据库TextureAtlas图像的关键字。因为数据库查询不应该阻塞主线程,所以查询在另一个线程上执行。

现在我想创建一个scene2d actor并返回它,因此可以显示它。

new Thread() {
        @Override
        public void run() {
            String resultOfQuery = ...;
            final Image image = new Image(atlas.findRegion(resultOfQuery));

            Gdx.app.postRunnable(new Runnable() {
                @Override
                public void run() {
                    listener.onImageCreated(image);
                }
            }); 
        }
    }.start();

正如您所看到的,我在新线程中创建了Image,然后将其传递给主线程。但是libGDX wiki表示:

  

您永远不应对任何与图形或音频相关的内容执行多线程操作,例如:使用来自多个线程的scene2D组件。

我是否必须创建将actor分配给主线程上的舞台?或者它是否可以,如果我在另一个线程中创建它然后将它添加到主线程的舞台上?

1 个答案:

答案 0 :(得分:0)

我上面看到的唯一潜在问题是在地图册上调用findRegion,这不是线程安全的。但是如果你知道你的线程没有运行,而地图集正在其他地方使用它就没问题了。如果您有多个查询可能都可能访问图集,那么您就会遇到问题。或者,如果您在游戏循环中调用atlas方法。

当然,你可以简单地使用无参数的Image构造函数,并在游戏线程runnable中传递一个区域。那你就没什么好担心的了。