使用Java Swing Timer实现Java 2D游戏性能

时间:2014-12-19 16:15:50

标签: java swing timer graphics2d

我正在使用Java Swing开发一款射击类型的视频游戏,我正在使用Java Swing Timer来控制所有的屏幕更新。主屏幕使用BorderLayout,我在BorderLayout中包含的Panel上执行我的图形,并使用AWT Graphics调用来绘制。

现在随着我的游戏进展,我想加快我的屏幕对象(船只)的移动,但我仍然希望它们能够顺利地穿过屏幕。我想我可以通过将Java Swing Timer的超时值降低到5ms左右来完成任务。但是,我注意到当我将它设置为小于15毫秒的任何东西时,似乎没有太大区别。一旦超过该阈值,性能几乎没有明显差异。 - 为什么? -

另一个选择是增加每艘船每次更新移动的像素数,但超过3或4像素的东西,事情开始看起来有些跳跃。

有什么想法吗?并且真的想要将游戏保留在Swing中,在这一点上更倾向于不移植到第三方库。

感谢。

2 个答案:

答案 0 :(得分:1)

很可能,这不是软件问题,也不是软件可修复的问题。您的屏幕可能每秒仅刷新约60次,这意味着帧每秒仅绘制60次,或者每隔(大约)16毫秒绘制一次。由于这是一个硬件障碍,因此无法通过软件更快地进行更新。你可以指望你的用户只有60Hz的显示器,所以更值得研究其他解决方案。

浮现在脑海中的一个解决方案是增加运动模糊,使它看起来像船只在它们真的没有时移动得更快。它会让你在看起来有点跳跃之前“跳”更远的距离,因为模糊会让人觉得它的速度非常快,而不是跳过屏幕。不幸的是,我看到做动作模糊的唯一事情是第三方库,尽管你可能有更好的运气谷歌搜索。

答案 1 :(得分:-1)

我建议您更换用于JavaFX的Swing引擎(至少),这是一种性能更好的技术,可以使用更多工具。如今的Swing被认为是一种死技术,以及之前的AWT。学习和启动JavaFX的好地方就是这个:

http://docs.oracle.com/javase/8/javase-clienttechnologies.htm

开发游戏的理想选择是使用为其准备的库,例如libGDX:

http://libgdx.badlogicgames.com/

但如果你想在Swing中创造一个游戏,我该判断谁?有时看到旧东西很好。我自己仍然喜欢Swing,甚至比其他东西都过时了。

我认为你可能正在实施一个错误的游戏循环。 Swing Timer似乎不是更新游戏逻辑的好方法。即使在不同的计算机之间设置不同,通常也很实用且易于实现游戏环以正常工作,尤其是对于角色的正确移动。

你知道,游戏循环是游戏的核心,需要直接实施,否则游戏开发错误,并有几个限制。通常,在游戏循环中我们必须考虑所需的FPS。在游戏更新中,我们必须花费上次更新和当前更新之间经过的时间,即许多开发人员所谓的增量。你会在互联网上找到很多关于它的资料,我建议:

http://dewitters.koonsolo.com/gameloop.html

http://www.java-gaming.org/index.php?topic=21919.0

https://www.youtube.com/watch?v=9dzhgsVaiSo

过去的链接会对您有所帮助,但如果您想了解更多信息,我建议您查看一下这本书:

http://www.brackeen.com/javagamebook/

即使是旧的材料(如Swing),你会发现如何使用键盘和鼠标输入系统实现良好游戏循环的细节,声音,使用最佳性能摇摆必须提供,以及其他酷的东西。还有一件事......为了给你一个关于角色运动的更好结果,我建议你使用位置变量(X和Y)和十进制类型,如float或double。

我希望你能做你想做的事。祝你好运!