libGDX中的java线程

libGDX中的java线程,java,multithreading,libgdx,Java,Multithreading,Libgdx,我正在用libGDX制作一个游戏,我真的很想让这个游戏线程化,所以我在不同的线程上运行一个paint循环和一个logic循环,就像你用paintcomponent循环和runnable循环制作一个简单的java swing游戏一样 我对c语言中的线程技术很有经验,但对java语言没有太多经验 生成线程的唯一方法是生成一个扩展线程的类,然后在其中创建运行循环 但是创建运行循环的目的是允许每个屏幕自由地计算逻辑,因此我最终需要某种抽象屏幕类来实现自定义线程类 我想问的是,对于这种情况,是否有一种更简

我正在用libGDX制作一个游戏,我真的很想让这个游戏线程化,所以我在不同的线程上运行一个paint循环和一个logic循环,就像你用paintcomponent循环和runnable循环制作一个简单的java swing游戏一样

我对c语言中的线程技术很有经验,但对java语言没有太多经验

生成线程的唯一方法是生成一个扩展线程的类,然后在其中创建运行循环

但是创建运行循环的目的是允许每个屏幕自由地计算逻辑,因此我最终需要某种抽象屏幕类来实现自定义线程类


我想问的是,对于这种情况,是否有一种更简单或更标准的方法来实现线程。

不确定您的意思,但屏幕上的绘图(反映对显示的更改)由专用的单线程完成是标准的(例如,请参阅Swing framework)。这是因为让多个线程在屏幕上画图而不把事情弄糟是相当困难的——只有少数实现能做到这一点。因此,如果您计划自己实现GUI框架,建议使用单线程绘制方法


至于您的业务逻辑,它取决于许多事情。一个非常简单的方法确实可以为每个活动生成一个新线程。然后,这些线程可以将结果发布到所述GUI线程。这种方法的问题是,如果同时执行多个活动,效率可能会显著下降,因为在Java中,每个线程都映射到一个本机OS线程。您可以使用线程池来避免这种情况。Java标准库以
ThreadPoolExecutor
的形式提供线程池,或者如果您需要更高的抽象,
ExecutorService

libGDX库已经为OpenGL上下文更新运行了单独的渲染线程。看

我们已经了解到,UI线程不是连续执行的,而是仅在需要调度事件时由操作系统调度运行(大致为:p)。这就是为什么我们实例化第二个线程,我们通常称之为渲染线程。该线程由图形模块创建,该模块本身在启动时由应用程序实例化

每次屏幕刷新时,此渲染线程都会调用主游戏对象上的
ApplicationListener.render()
方法一次(因此它应该大约为60hz),因此只需将渲染循环的主体放入此方法的实现中即可

您可以在
ApplicationListener
create
方法中创建额外的后台线程(例如,用于游戏逻辑)(请确保在
dispose
方法中清理它)。除了
渲染
线程之外,我认为任何预先存在的线程都不是游戏逻辑的正确位置


对于线程之间的通信,可以使用任何现有的Java同步方法。我使用Java的
ArrayBlockingQueue
向后台线程发送请求。我曾经让我的后台线程将数据推送到渲染线程(在调用
render()
之前,这些可运行程序将在下一帧运行)。

谢谢,我会查看ThreadPoolExecutor并与您联系!也许我不清楚,我知道渲染是一个线程,它不断循环。但我想看看我是否可以为实际的游戏逻辑提供一个单独的线程。如果libGDX为渲染创建了一个新线程,我将如何访问父线程或源线程?@Mintybacon我已经更新了我的答案,提供了有关线程间通信选项的更多详细信息。希望这有帮助。