这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~
游戏循环由三部分组成:
1.非阻塞的用户输入
2.更新游戏逻辑状态
3.渲染游戏画面
while(true)
{
Input();
Update();
Render();
}
每次循环完成后,会更新一次画面的绘制,这个过程也叫做帧(Frame)
帧率(FPS)是标定游戏循环的速率与真实时间的映射关系。(越小越卡)
一般来说:PC上60/秒,手机上30/秒
帧数的倒数就是每帧所占用的时长,单位通常为毫秒
什么会影响帧率?
1.复杂的物理运算
2.游戏逻辑的处理
3.图形细节控制
如果处理操作的时长超过帧率的倒数,那么就会拖慢帧率,这种现象被称为掉帧
一般我们都希望有固定帧率~
(固定帧率模式)
1.如果每帧运行时间较短,那么帧率就会超过预定的标准
那就需要在循环的末尾加入延期等待。(Sleep)
while (true)
{
double start = getCurrentTime();
Input();
Update();
Render();
sleep(start + 1 / FPS - getCurrentTime());
}
2.如果掉帧了
(追赶模式)
当掉帧时,只运行逻辑,不绘制画面,用节省下来的时间追赶落后的帧
double preFrameTime = getCurrentTime();
double lag = 0.0;
while (true)
{
double current = getCurrentTime();
double elapsed = current - preFrameTime;
preFrameTime = current;
lag += elapsed;
Input();
while (lag >= 1 / FPS)
{
Update();
lag -= 1 / FPS;
}
Renderer();
}
如果使用这种模式,不要将FPS设置的太大,慢的机器永远赶不上时间,卡在死循环里了
Unity中 FixedUpdate 就是这种模式
如果FixedUpdate在限定的时间内执行不完,则图形绘制频率就会降低,以保证物理的执行
Fixed Timestep:控制 fixedUpdate 速度
Maximum Aloowed Timestep:防止逻辑执行过长,卡死线程
总结:
Unity有自己的循环模式,但是有些游戏通常有自己的特点
竞速游戏要求实时反馈很高,如果采用追赶模式,造成抽帧的体验就很差
MMO游戏主要是位置同步造成的卡顿,可以使用分帧加载、AOI(area of interest)等方式保证游戏流畅
网友评论