Java 流畅的2D游戏速度变化

Java 流畅的2D游戏速度变化,java,performance,game-engine,slick2d,Java,Performance,Game Engine,Slick2d,我用Swing创建了一个游戏,它有点不可靠,所以我开始用Slick2D游戏引擎重新制作它,我遇到了一些问题 每次调用update方法时,游戏的背景都会在屏幕上滚动一定数量的像素。这会不断加速和减速,因此背景会移动得非常快,然后非常慢,并不断波动 我已经尝试了*按增量(我想它会监控刷新率!)移动背景的值,但由于这不会给我一个确切的值,我可以用它将背景重置到左侧(2个背景从右向左移动。左侧一个在-800像素处移到右侧) 这是什么原因造成的?我如何克服它 谢谢这里有一些阅读材料(顺便说一句,这里有一本

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

每次调用update方法时,游戏的背景都会在屏幕上滚动一定数量的像素。这会不断加速和减速,因此背景会移动得非常快,然后非常慢,并不断波动

我已经尝试了*按增量(我想它会监控刷新率!)移动背景的值,但由于这不会给我一个确切的值,我可以用它将背景重置到左侧(2个背景从右向左移动。左侧一个在-800像素处移到右侧)

这是什么原因造成的?我如何克服它


谢谢

这里有一些阅读材料(顺便说一句,这里有一本):

这些文章中最重要的一点是,随着时间的推移,事物以一定的速率移动,而不是在一定数量的帧上。由于帧速率可能会发生不可预测的变化,基于时间和基于帧的运动最终不会彼此相等

这里有一些解释…

因此,您的计算机和操作系统是多线程的,因此,您永远无法知道应用程序之外发生了什么,以及计算机上的总体负载是什么。因此,即使在全屏模式下,您也无法以独占方式访问CPU。所以,这就是为什么事情会变快变慢的原因之一

Slick2D中delta的用途是允许您处理这种加速/减速,并允许您的应用程序动态更改其帧速率,以便屏幕上感知到的移动不会因您机器上的负载而改变。delta不是监控刷新率(恒定)的;delta是自上次调用
update
以来经过的毫秒数


那么如何正确使用这个增量呢?假设你的背景以每秒100像素的速度移动。如果增量(在调用
update
时)为33毫秒,则在此次更新中您应该移动背景的量为
100*(33/1000.0)=0.033
——因此您将移动背景0.033像素。这可能看起来很奇怪,你可能想知道搬家的意义是什么这里有一些阅读材料供你参考(顺便说一句,这里有一个:

这些文章中最重要的一点是,随着时间的推移,事物以一定的速率移动,而不是在一定数量的帧上。由于帧速率可能会发生不可预测的变化,基于时间和基于帧的运动最终不会彼此相等

这里有一些解释…

因此,您的计算机和操作系统是多线程的,因此,您永远无法知道应用程序之外发生了什么,以及计算机上的总体负载是什么。因此,即使在全屏模式下,您也无法以独占方式访问CPU。所以,这就是为什么事情会变快变慢的原因之一

Slick2D中delta的用途是允许您处理这种加速/减速,并允许您的应用程序动态更改其帧速率,以便屏幕上感知到的
移动不会因您机器上的负载而改变。delta不是监控刷新率(恒定)的;delta是自上次调用
update
以来经过的毫秒数


那么如何正确使用这个增量呢?假设你的背景以每秒100像素的速度移动。如果增量(在调用
update
时)为33毫秒,则在此次更新中您应该移动背景的量为
100*(33/1000.0)=0.033
——因此您将移动背景0.033像素。这可能看起来很奇怪,您可能想知道移动的目的是什么?将背景运动基于系统时钟如何?将背景运动基于系统时钟如何?很抱歉,原始答案的语法很差。我已经把它清理得很干净了。对于你提供的这些信息,我感激不尽!很容易理解。我没有注意到任何语法错误,所以不要担心!当我说刷新率时,我的意思是上次调用Update()时,我只是不知道如何表达它。非常感谢。很抱歉原始答案的语法不好。我已经把它清理得很干净了。对于你提供的这些信息,我感激不尽!很容易理解。我没有注意到任何语法错误,所以不要担心!当我说刷新率时,我的意思是上次调用Update()时,我只是不知道如何表达它。万分感谢。