在Java2D中(用于2D游戏),应该继承哪个组件来进行绘制?

5
我已经创建了一个扩展自JPanel的画布,但是我注意到随着内容等的增加,我的FPS突然下降。我遵循《Filthy Rich Clients》中的Swing规则,使用paintComponent创建剪辑区域,仅重绘已更改的内容等方法。我将FPS设置为50 FPS,但有时会发现FPS会跳到31/32 FPS,然后再回到50等。在运行程序时,即使在渲染时,它只使用约25MB的RAM和0个CPU。我也已经设置了OpenGL。
注意:我没有任何图像,这完全使用Graphics中的形状。
在JPanel上绘制所有内容是否会对性能造成严重影响?我应该扩展不同的组件(我一直看到Canvas组件)吗?使用JPanel构建类似俄罗斯方块(或其他复古游戏)的游戏有多“聪明”?
这可能是一个定时器问题,因为我刚刚添加了100个额外的绘图调用,但FPS仍然会出现50 32/31的情况。

3
经过深入调查,我发现问题并不在JPanel上。实际上,问题出在Java的计时器上。它不是百分之百准确的,这导致了FPS明显偏低。我的解决方案是阅读这篇文章:http://www.koonsolo.com/news/dewitters-gameloop/ - abc123
2个回答

1

经过深入调查,我发现问题并不是 JPanel。事实上,问题出在 Java 的计时器上。它并不十分准确,导致 FPS 显示偏差很大。我解决这个问题的方法是阅读这篇文章:koonsolo.com/news/dewitters-gameloop


计时器的准确性取决于操作系统时钟中断实现的粒度。例如,WinXP只有约15毫秒的准确性。然而,一个有趣的技巧是运行一个后台Thread.sleep(Long.MAX_VALUE);由于某种原因,这使得WinXP的准确性达到了1毫秒!http://www.java-gaming.org/index.php/topic,24311.msg206914.html#msg206914 - Phil Freihofner

0

我知道你发现 Timer 类有问题,但是我还有一个评论想和你分享,或许会对你有用:

你没有提到是否使用了双缓冲技术。如果没有使用的话,那么你 可能 会注意到 FPS 的提高。

以防你不熟悉这个技术,它涉及创建一个单独的面板缓冲区,在此缓冲区上重新绘制你的场景,然后将此缓冲区与屏幕上的缓冲区进行切换等操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接