我开始用游戏开发我的冒险,我选择了LibGDX。 我有一个关于速度和帧速率的问题。
float position x=0f;
float velosity v=200f;
float force f=-15f;
public void update(float deltaTime){
v+=f;
v*=deltaTime;
x+=v;
v*=1/deltaTime;
}
在我的代码中,有一些力量会在每一帧上通过某种方式降低速度。然后在同一时间之后,在30FPS上玩的一个玩家将比在60FPS上玩的玩家进一步移动,因为该力会对他产生更少的影响。我对么? 如果是这样,我怎样才能确保两个球员都移动相同的距离?我应该使用一些完全不同的方法吗?
答案 0 :(得分:1)
您可以将移动与增量时间值(帧之间的时间)相乘,以使其与帧速率无关。使用libgdx,您可以使用以下方法:
Gdx.graphics.getDeltaTime();
这是一个简单的例子:
x += 500 * Gdx.graphics.getDeltaTime();
答案 1 :(得分:1)
你是对的。如果帧速率不同,您的时间步长也不同,因此加速率有点不可预测。这就是为什么许多游戏使用与游戏的帧速率分开运行的固定时间步长的原因。这是确保游戏在每台设备上完全相同的一种方式。
如果这是一款简单的游戏,而不是竞争激烈,那么你只需要确保它保持准确,而不一定是确定性。如果是这种情况,在我看来你可以作弊,并使用最大时间步而不是固定的时间步。游戏在任何时候都不会完全相同,但它足够准确,没有人会注意到。为此,请设置一些最大增量时间。在游戏的每一帧上,重复调用更新直到所有增量时间都用尽,但总增量时间仍然准确。例如:
MAX_DELTA
所以正在发生的事情是在while循环中,你重复更新物理,直到赶上当前时间,使用MAX_DELTA
或更小的时间步长。您只需要确保MAX_UPDATES_PER_FRAME
足够小,以确保您的物理外观正确,并且您无法穿过薄壁。 public static final float FIXED_TIMESTEP = 1/50f;
public static final int MAX_UPDATES_PER_FRAME = 3;
private float elapsedTime;
public void render (float deltaTime){
elapsedTime += deltaTime;
int updates = 0;
while (elapsedTime >= FIXED_TIMESTEP = && updates < MAX_UPDATES_PER_FRAME){
update(FIXED_TIMESTEP);
elapsedTime -= FIXED_TIMESTEP;
updates++;
}
// drawing
}
变量是为了确保在CPU峰值导致过大的delta时间并且开始越来越落后时,不要输入“死亡螺旋”。相反,你的游戏有点慢,直到它赶上来。
这比固定时间步骤(famously explained here)简单的原因是,您不必存储两个模拟以进行渲染之间的插值。使用固定的时间步长,上面的代码变为:
elapsedTime
导致丑陋的口吃,并且只能通过保留游戏的所有位置数据的两个副本,每帧在它们之间交替,并在左边的 foreach(GridViewRow row in GridView1.Rows) {
if(row.RowType == DataControlRowType.DataRow) {
TextBox TextBoxfname = row.FindControl("TextBox1") as TextBox ;
string txtname= TextBoxfname.Text ;// You can insert txtname into database .
}
之间进行插值来修复适合绘制平滑动画的值。很复杂!