Slick2D游戏速度在变化

时间:2011-10-27 22:51:40

标签: java performance game-engine slick2d

我使用Swing创建了一个游戏,它有点不可靠,所以我开始使用Slick2D游戏引擎重新制作它,我遇到了问题。

每次调用更新方法时,游戏的背景在屏幕上滚动一定的像素。这样可以保持加速和减速,因此背景会非常快速地移动,然后非常慢,并且会一直波动。

我已尝试*由delta(它监视刷新率,我认为!)在我的值上移动背景,但由于这不会给我一个确切的值,我可以用来将背景重置到左侧( 2背景从右向左移动。左手一个在-800像素处向右移动。

造成这种情况的原因是什么?如何克服它?

由于

1 个答案:

答案 0 :(得分:11)

这里有一些阅读(有一个gamedev-specific StackExchange site,BTW):

这些文章中最重要的一点是事物以超过一定的速度移动,而不是超过一定数量的帧。由于帧率可能无法预测地改变,因此基于时间和基于帧的移动不会相互影响。

这里有一些解释......

因此,您的计算机和操作系统是多线程的,因此,您永远不会知道应用程序外部发生了什么,以及机器上的总体负载是什么。因此,即使您处于全屏模式,也无法独占访问CPU。所以,这是为什么事情加速和减速的一个因素。

Delta在Slick2D中的目的是让您处理此加速/减速,并允许您的应用动态更改其帧速率,以便屏幕上的感知移动不会由于您的机器负载而发生变化。 delta 不是监视器刷新率(不变); delta是自上次调用update以来经过的毫秒数。

那你如何正确使用这个delta?假设你的背景应该以100px / sec的速度移动。如果delta(在update的给定调用中)为33毫秒,那么您应该在此更新中移动背景的数量为100*(33/1000.0) = 0.033 - 因此您将背景移动0.033像素< / strong>即可。这可能看起来很奇怪,你可能想知道移动&lt; 1像素是什么意思,但坚持我。

首先,你必须将它除以1000.0而不是1000的原因是因为你希望 delta的移动给你一个浮点数。

您会注意到Slick2D中的2D图形内容使用浮点值来跟踪事物的位置。那是因为如果delta告诉你移动0.033像素的东西,你需要移动0.033:不是0,而不是1像素。子像素移动对于平滑帧速率的增加/减少也是至关重要的,因为对几个子像素移动的累积效应是,当时刻正确时,所有这些小移动加起来整个像素,并且它非常平滑,从而产生正确的整体移动速度。

您可能认为,由于您的屏幕将图像解析为给定像素而非子像素元素,因此如果您进行子像素移动并不重要,但是如果将所有移动跟踪转换为浮点数,你会发现你观察到的效果很大程度上消失了。