Java 游戏、全屏独占、主动渲染和 EDT

标签 java rendering fullscreen event-dispatch-thread

使用主动渲染的全屏 Java 游戏的正确设置是什么?

示例位于http://docs.oracle.com/javase/tutorial/extra/fullscreen/example.html不要将渲染推迟到 EDT。这是什么原因呢?有些人倾向于说 GUI 的更新应该只在 EDT 中完成。

例如:Is it possible to perform active rendering in Java Swing without being on the EDT?

只有在 EDT 中创建 GUI 时才会出现这种情况吗?

毕竟我更喜欢使用主线程进行游戏循环渲染。

在此环境中如何处理事件?将它们放入线程安全队列并在游戏循环中的适当位置处理队列中的事件是否明智?

最佳答案

查看您链接的教程中的 MultiBufferText。

它的作用是创建一个 Frame,然后完全取消 EDT 的渲染(未装饰和ignoreRepaint)。由于 EDT 不会尝试渲染该帧的任何内容,因此当从另一个线程渲染时,EDT 不会发生相互引用。

您仍然可以正常处理事件(如在 KeyListener、MouseListener 等中),但您需要注意您的监听器从 EDT 调用。当您更改(游戏?)状态以响应监听器回调时,您需要提供适当的同步。

至于是否可取,我无法确定。由于本教程实际上演示了如何绕过 EDT,因此我认为在这种情况下在没有 EDT 的情况下进行渲染是有效的(在窗口上禁用 EDT 渲染)。

另一个问题是,真的有必要使用主动渲染吗?根据我(诚然非常有限)的经验,几乎所有事情都可以坚持使用被动渲染(从 EDT 外部请求一个简单的 repaint() 以定期触发渲染)。除非您正在做非常繁重的事情,否则 java2d 图形速度相当快(在 2003 硬件上以 60fps 的速度用小 aplha'd 图像图 block 覆盖整​​个屏幕两次没有问题)。

如果您需要光束同步渲染,唯一支持的方法似乎是进入全屏模式。

关于Java 游戏、全屏独占、主动渲染和 EDT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21704379/

相关文章:

menu - 你如何制作一个固定的侧边菜单,主要内容缩放到屏幕边缘?

objective-c - 如何 : Is NSWindow In FullScreen Mode (Lion) AND Enabling/Disabling?

java - 在 AndroidTestCase 中调用 MockitoAnnotations.initMocks() 时的 NPE

java - Mockito 匹配原始类型

ios - iOS pdf渲染慢的优化方法

jquery - 为什么不同的浏览器以不同的方式呈现相同的 HTML?

java - 如何在HashMap中查找元素

java - 两点之间的角度与 atan2

ios - Core Image 渲染缓慢

matlab - 如何在 MATLAB 图中设置子图大小?