LibGDX: 在另一个线程中创建新的 scene2d 对象?
LibGDX: Create new scene2d Object inside another thread?
我有一个数据库可以存储例如TextureAtlas 的图像键。因为数据库查询不应该阻塞主线程,查询在另一个线程上执行。
现在我想创建一个 scene2d actor return,这样它就可以显示了。
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();
如您所见,我正在新线程中创建图像,然后将其传递给主线程。但是 libGDX wiki 声明:
You should never perform multi-threaded operations on anything that is graphics or audio related, e.g. use scene2D components from multiple threads.
我是否必须在主线程上创建 和 将演员分配到舞台?或者,如果我在另一个线程中创建它,然后将它添加到主线程的舞台上,是否可以?
我在上面看到的唯一潜在问题是在 atlas 上调用 findRegion,这不是线程安全的。但是,如果你知道你的线程不是 运行 而图集正在其他地方使用,那就没问题了。如果您正在进行多个查询,这些查询都可能访问地图集,那么您就会遇到问题。或者,如果您在游戏循环中调用 atlas 方法。
当然,您可以简单地使用无参数 Image 构造函数并将游戏线程可运行区域中的区域传递给它。那么你就没有什么可担心的了。
我有一个数据库可以存储例如TextureAtlas 的图像键。因为数据库查询不应该阻塞主线程,查询在另一个线程上执行。
现在我想创建一个 scene2d actor return,这样它就可以显示了。
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();
如您所见,我正在新线程中创建图像,然后将其传递给主线程。但是 libGDX wiki 声明:
You should never perform multi-threaded operations on anything that is graphics or audio related, e.g. use scene2D components from multiple threads.
我是否必须在主线程上创建 和 将演员分配到舞台?或者,如果我在另一个线程中创建它,然后将它添加到主线程的舞台上,是否可以?
我在上面看到的唯一潜在问题是在 atlas 上调用 findRegion,这不是线程安全的。但是,如果你知道你的线程不是 运行 而图集正在其他地方使用,那就没问题了。如果您正在进行多个查询,这些查询都可能访问地图集,那么您就会遇到问题。或者,如果您在游戏循环中调用 atlas 方法。
当然,您可以简单地使用无参数 Image 构造函数并将游戏线程可运行区域中的区域传递给它。那么你就没有什么可担心的了。