http://gafferongames.com/game-physics/fix-your-timestep/
http://www.koonsolo.com/news/dewitters-gameloop/
在 Glenn Fiedler 的Fix Your Timestep的最后一个游戏循环中!在文章中,他使用了一个更新循环,将游戏逻辑推进了一个固定的增量时间。既然delta时间是固定的,那他为什么要根据delta时间来积分呢?在基于固定时间步长的游戏中,移动不能像以下那样简单:
if ( keyboard pressing "W" ) {
velocity += acceleration
}
position += velocity
Run Code Online (Sandbox Code Playgroud)
而不是传入增量时间变量:
if ( keyboard pressing "W" ) {
velocity += integrated(acceleration, delta_time)
}
position += velocity * delta_time
Run Code Online (Sandbox Code Playgroud)
因为“固定”时间步长循环中的增量时间没有意义,它就像将所有内容乘以 1。在基于“可变”时间步长的游戏中,您必须使用增量时间并整合运动,但在这种情况下,这无关紧要. 请注意 delta time 的变量如何设置为常数并且从未改变,游戏逻辑已经是确定性的,而且似乎不需要在代码的任何地方将速度和加速度乘以 delta 时间。我从这篇文章中学到的是“修复你的时间步长!”,顾名思义,所以你有确定性的游戏逻辑,而不是浮点不准确和随着可变时间步长而来的爆炸物理。我只是对为什么将增量时间传递到更新函数中感到困惑,因为它似乎与本文的目的背道而驰。
double t = 0.0;
double dt = 0.01;
double currentTime = hires_time_in_seconds();
double accumulator = 0.0;
State previous;
State current;
while ( !quit )
{
double newTime = …Run Code Online (Sandbox Code Playgroud) 有时我需要在C/C++中编写一个循环,其中有一个初始化后跟一个条件.
我喜欢这个样子,
for (int i = 0, j = 0; i == 0 && j == 0;) {
// condition fails at some point
}
Run Code Online (Sandbox Code Playgroud)
比这还多.
int i = 0, j = 0;
while (i == 0 && j == 0) {
// condition fails at some point
}
Run Code Online (Sandbox Code Playgroud)
虽然这是个人代码,所以没有人可以评判我.编译器是否会使它们成为同一个东西?