2011-04-19 68 views
5

我已经创建了自己的画布,该画布已经从JPanel扩展而来,但是我已经注意到w /内容等等,突然之间我的FPS受到了重创。我遵循来自Filthy Rich Clients的挥杆规则,通过使用paintComponent,创建剪辑区域,仅重绘已更改的内容等等。我将FPS设置为50 FPS,我注意到有时我的FPS会跳到31/32 FPS并回到50等等。运行我的程序时,即使在渲染时,也只使用大约25MB的RAM和0的CPU。我也有OpenGL设置。要在Java2D中绘制子类以绘制哪个组件(用于2D游戏)

注:我没有图像,这是严格使用图形中的形状。

通过绘制JPanel上的所有内容,是否存在重大性能下降?我应该扩展一个不同的组件吗(我一直看到Canvas组件)?在JPanel中构建诸如俄罗斯方块(或任何其他复古游戏)的游戏有多“聪明”?

这是一个可能性,这是一个计时器问题,因为我刚刚添加了100个额外的绘画调用,FPS仍然做50 32/31的事情。

+3

经过大量调查后我发现问题根本不在于JPanel。事实上,问题在于Java中的Timer。这不是100%准确的,这导致了FPS的退出。 我解决这个问题的方法是阅读:http://www.koonsolo.com/news/dewitters-gameloop/ – abc123 2011-04-19 04:07:17

回答

1

经过多次调查后,我发现问题根本不在于JPanel。事实上,问题在于Java中的Timer。这不是100%准确的,这导致了FPS的退出。我解决这个问题的解决方案是这样的:koonsolo.com/news/dewitters-gameloop

+0

定时器的精度取决于OS时钟中断实施的粒度。例如,WinXP只有15毫秒的准确度。有趣的闪避,但是,是运行一个后台Thread.sleep(Long.MAX_VALUE);出于某种原因,这使得WinXP以1毫秒的精度运行! http://www.java-gaming.org/index.php/topic,24311.msg206914.html#msg206914 – 2011-08-24 19:55:03

0

我意识到你已经发现了一个Timer类的问题,但是我对你有另一个评论,你可能会觉得很有用:

你还没有提到你是否使用双缓冲技术。如果你不是,那么你可能会注意到一个FPS的改进。

万一你不熟悉的技术,它涉及创建单独的面板缓冲,重新绘制场景的这个缓冲区,然后关掉这个缓冲与屏幕上的一个等