gpt4 book ai didi

c++ - 使用 C++ 在游戏循环中模拟时间

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:51 25 4
gpt4 key购买 nike

作为一种爱好,我正在使用 C++ 在 Linux 上使用 OpenGL 和 SDL 从头开始​​构建 3d 游戏,并了解有关该编程领域的更多信息。

想知道在游戏运行时模拟时间的最佳方法。显然我有一个看起来像这样的循环:

void main_loop()
{
while(!quit)
{
handle_events();
DrawScene();
...
SDL_Delay(time_left());
}
}

我正在使用 SDL_Delay 和 time_left() 来维持大约 33 fps 的帧速率。

我以为我只需要一些全局变量,比如

int current_hour = 0;
int current_min = 0;
int num_days = 0;
Uint32 prev_ticks = 0;

然后像这样的函数:

void handle_time()
{
Uint32 current_ticks;
Uint32 dticks;
current_ticks = SDL_GetTicks();
dticks = current_ticks - prev_ticks; // get difference since last time

// if difference is greater than 30000 (half minute) increment game mins
if(dticks >= 30000) {
prev_ticks = current_ticks;
current_mins++;
if(current_mins >= 60) {
current_mins = 0;
current_hour++;
}
if(current_hour > 23) {
current_hour = 0;
num_days++;
}
}
}

然后在主循环中调用 handle_time() 函数。

它编译并运行(此时使用 printf 将时间写入控制台)但我想知道这是否是最好的方法。有没有更简单或更有效的方法?

最佳答案

我之前在其他与游戏相关的话题中提到过这一点。一如既往,遵循 Glenn Fiedler 在他的 Game Physics series 中的建议。

您想要做的是使用通过累积时间增量获得的恒定时间步长。如果你想要每秒更新 33 次,那么你的恒定时间步长应该是 1/33。您也可以将其称为更新频率。您还应该将游戏逻辑与渲染分离,因为它们不属于一起。您希望能够使用较低的更新频率,同时尽可能快地渲染机器允许的速度。这是一些示例代码:

running = true;
unsigned int t_accum=0,lt=0,ct=0;
while(running){
while(SDL_PollEvent(&event)){
switch(event.type){
...
}
}
ct = SDL_GetTicks();
t_accum += ct - lt;
lt = ct;
while(t_accum >= timestep){
t += timestep; /* this is our actual time, in milliseconds. */
t_accum -= timestep;
for(std::vector<Entity>::iterator en = entities.begin(); en != entities.end(); ++en){
integrate(en, (float)t * 0.001f, timestep);
}
}
/* This should really be in a separate thread, synchronized with a mutex */
std::vector<Entity> tmpEntities(entities.size());
for(int i=0; i<entities.size(); ++i){
float alpha = (float)t_accum / (float)timestep;
tmpEntities[i] = interpolateState(entities[i].lastState, alpha, entities[i].currentState, 1.0f - alpha);
}
Render(tmpEntities);
}

这会处理欠采样和过采样。如果你像这里那样使用整数运算,你的游戏物理应该接近 100% 确定性,无论机器有多慢或多快。这就是以固定时间间隔增加时间的好处。用于渲染的状态是通过在先前状态和当前状态之间进行插值来计算的,其中时间累加器内的剩余值用作插值因子。这确保无论时间步长有多大,渲染都是流畅的。

关于c++ - 使用 C++ 在游戏循环中模拟时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1823927/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com