5

我正在使用 libGDX 制作游戏,我真的很想线程化游戏,所以我在单独的线程上运行一个绘画循环和一个逻辑循环,就像你用绘画组件循环和可运行的运行循环制作一个简单的 java swing 游戏一样.

我对 c 中的线程有经验,但在 java 中没有那么多经验。

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

但是制作运行循环的目的是允许每个屏幕自由计算逻辑,所以我最终需要某种具有自定义线程类实现的抽象屏幕类。

我在问是否有一种更简单或更标准的方式来实现这种情况下的线程。

4

2 回答 2

12

libGDX 库已经为 OpenGL 上下文更新运行了一个单独的渲染线程。请参阅http://code.google.com/p/libgdx/wiki/TheArchitecture#The_Graphics_Module

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

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

您可以在您的方法中创建一个额外的后台线程(例如,用于游戏逻辑)(请务必在create方法中对其进行清理)。除了线程之外,我认为任何预先存在的线程都不适合游戏逻辑。ApplicationListenerdisposerender

对于线程之间的通信,您可以使用任何现有的 Java 同步方法。我使用 JavaArrayBlockingQueue<>将请求发送到后台线程。而且我曾经Gdx.app.postRunnable()让我的后台线程将数据推送到渲染线程(这样的 Runnables 在下一帧上运行,在render()被调用之前)。

于 2012-10-01T15:52:54.383 回答
0

不知道你的意思,但屏幕上的绘图(反映对显示的更改)是由一个专用的单线程完成的(例如,参见 Swing 框架),这是标准的。这是因为很难让多个线程在屏幕上绘制而不搞砸——只有少数实现这样做。因此,如果您打算自己实现 GUI 框架,建议使用单线程绘图方法。

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

于 2012-10-01T11:23:04.257 回答