美文网首页
游戏循环

游戏循环

作者: APP4x | 来源:发表于2020-08-06 22:43 被阅读0次
    这是我在《游戏架构-核心技术与面试精粹》看的,记录一下~

    游戏循环由三部分组成:
    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)等方式保证游戏流畅

    相关文章

      网友评论

          本文标题:游戏循环

          本文链接:https://www.haomeiwen.com/subject/joxxdktx.html