ApplicationListener中的所有方法都在同一个线程中被调用。这个线程就是能够发生OpenGl调用的绘制线程。对大多数游戏来说在Application.render()方法中同时实现逻辑和绘制已经足够了。
任何直接涉及OpenGL的图形操作都需要在渲染线程中执行。如果不在这个线程中操作的可能会造成不可预料的后果。这是由于OpenGL上下文只在渲染线程中才是活动的。
如果要从一个线程向渲染线程中传递数据的话,我们建议使用Application.postRunnable()。这样就会在下一帧的时候在渲染线程中运行Runnable中的代码,并且是在Application.render()方法被调用之前执行。
new Thread(new Runnable() {
@Override
public void run() {
//在这里做一些跟渲染线程异步的操作,比如更新游戏数据等操作,以提高游戏效率
final Result result = createResult();
// 向渲染线程中发送一个Ruunable对象,以处理上面代码的结果
Gdx.app.postRunnable(new Runnable() {
@Override
public void run() {
// 处理结果,比如讲result加入到ApplciationListener中的List<Result>集合中
results.add(result);
}
});
}
}).start();
libGDX中的哪些类是线程安全的?
在libGDX中没有线程安全的类,除非在类文档中明确表明了其实安全的。
我们建议你在涉及到图形和音频处理的时候不要进行多线程操作,比如在多线程中使用scene2D组件是非常危险的。