使用活动渲染的全屏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时才会出现这种情况吗?
毕竟我更喜欢使用主线程进行游戏循环和渲染。
如何在此环境中处理事件?将它们放在线程安全队列中并将队列中的事件处理到游戏循环中的适当位置是否明智?
答案 0 :(得分:2)
查看您链接的教程中的MultiBufferText。
它的作用是创建一个Frame然后从EDT完全去除渲染(未修饰和ignoreRepaint)。由于EDT不会尝试为该帧渲染任何内容,因此从另一个线程渲染时,EDT不会有任何干扰。
您仍然可以正常处理事件(如在KeyListener,MouseListener等中),但您需要注意从EDT调用将调用。当你改变(游戏?)状态以响应监听器回调时,你需要提供适当的同步。
至于是否可取,我无法确定。由于该教程实际上演示了如何绕过EDT,我认为在这些情况下(在窗口上禁用EDT渲染时)无需EDT即可进行渲染。
另一个问题是,是否真的有必要使用主动渲染?在我的(无可否认的非常有限)体验中,您可以坚持使用被动渲染几乎所有东西(从EDT外部请求简单的重绘()以定期触发渲染)。除非你做的很重,java2d的图形速度非常快(在2003硬件上使用60fps的小型aplha'd图像图块重复绘制整个屏幕两次)。
如果您需要光束同步渲染,唯一支持的方式似乎是进入全屏模式。