1. 最简单的情况

1 bool game_is_running = true;
2 while(game_is_running)
3 {
4   update_game();    // 逻辑帧
5   display_game();   // 渲染帧
6 }

带来的问题:小霸王机器会跑的很慢,牛逼机器上跑得飞快,cpu达到100%。显然不是一个合适的算法。

2. 恒定帧率和恒定游戏速度

 1 const int FRAMES_PER_SECOND = 25;
 2 const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
 3
 4 // GetTickCount() returns the current number of milliseconds
 5 DWORD next_game_tick = GetTickCount();
 6
 7 int sleep_time = 0;
 8 bool game_is_running = true;
 9 while(game_is_running)
10 {
11     update_game();
12     display_game();
13     next_game_tick += SKIP_TICKS;
14     sleep_time = next_game_tick - GetTickCount();
15     if(sleep_time >= 0)
16     {
17       Sleep(sleep_time);
18     }
19     else
20     {
21       // Shit, we are running behind!
22     }
23 }

在这种方案下,游戏的帧率恒定设置为25帧。如果达不到游戏内设定的恒定帧率,例如小霸王的机器,会非常的卡;牛逼的机器顶多也就是25帧,一定程度上有点浪费,但是对于手机游戏来说,能省点电,也许是个好事情。

3. 恒定的游戏速度和独立的帧率

 1 const int TICKS_PER_SECOND = 25;
 2 const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
 3 const int MAX_FRAMESKIP = 5;
 4 DWORD next_game_tick = GetTickCount();
 5 int loops;
 6 float interpolation;
 7 bool game_is_running = true;
 8 while(game_is_running)
 9 {
10     loops = 0;
11     while(GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
12     {
13         update_game();
14         next_game_tick += SKIP_TICKS;   // 保证25帧
15         loops++;
16     }
17
18     // interpolation代表插值
19     interpolation = float(GetTickCount() + SKIP_TICKS - next_game_tick) / float(SKIP_TICKS);
20     display_game(interpolation);
21 }

如果是牛逼的机器,在保持逻辑帧率25帧的情况下,会尽可能的提高渲染帧率,当然前提是需要计算需要渲染的插值。
如果是小霸王的机器,渲染帧率不足以达到25帧时,会在渲染一帧的同时跑多次逻辑帧,来尽量保证逻辑帧率一致,如果渲染帧率下降到TICKS_PER_SECOND/MAX_FRAMESKIP时,逻辑帧率也会随之降低。

4. 渲染帧率是否真的需要尽可能的高?
如果没有限制的话,那跑渲染的那个cpu肯定到100%了,这个应该在大部分的情况下是不能接受的。而且在视觉效果表现上来看,一定有个阈值的渲染帧率,超过了这个数值,再高的帧率的意义对画面的提升也有限,显得意义不大。如果是手机游戏的话,考虑到电池电量的因素,更应该控制一下帧率。

参考文档
http://www.koonsolo.com/news/dewitters-gameloop/

转载于:https://www.cnblogs.com/gamehook/p/3625298.html

[摘抄]游戏主循环逻辑相关推荐

  1. 4.帧循环(游戏主循环),schedule

     1 概述 游戏乃至图形界面的本质是不断地绘图,然而绘图并不是随意的,任何游戏都需要遵循一定的规则来呈现出来,这些规则就体现为游戏逻辑.游戏逻辑会控制游戏内容,使其根据用户输入和时间流逝而改变.因 ...

  2. 游戏主循环(Game Loop)的详细解析

    译自:https://dewitters.com/dewitters-gameloop/ 一. 引言 游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分.不幸的是没有任何一篇好的文章来指导一个菜鸟游 ...

  3. 游戏主循环基础例子 GameLoop

    游戏主循环基础例子 GameLoop 这里比较简单,直接发代码好了 import timefrom loguru import loggerfrom core import GetDeltaTime, ...

  4. 游戏主循环(Game Loop)详解

    每一个复杂的应用程序的核心都是一个循环(Loop) - 贯穿于一个应用程序生活周期的是一部分代码不断的重复执行时间.这个循环(Loop),可以就说是主循环.主循环的主要作用是:协调程序的行为(事件)和 ...

  5. cocos2d-x游戏开发(四)游戏主循环

    欢迎转载:http://blog.csdn.net/fylz1125/article/details/8518737 终于抽时间把这个游戏写完了.由于没有自拍神器,所以把它移植到了Android上,用 ...

  6. 辛巴学院-Unity-剑英的c#提高篇(一)主循环

    这是测试版 辛巴学院:正大光明的不务正业. 最近刚刚离开了我服务了三年多的公司,因为一个无数次碰到的老问题,没钱了. 之前不知道做什么好的时候,机缘巧合之下和哒嗒网络的吴总聊了一下,发现了vr gam ...

  7. 一文帮你理清游戏思路+实现逻辑- Python飞机大战

    文章目录 前言 思维导图 思路分析 三大对象 飞船 子弹 小行星 主函数 开始界面 游戏界面 结束界面 End 本篇是一文帮你理清"游戏思路+实现逻辑"专栏的第一篇文章,我个人开此 ...

  8. 上手微信小游戏——官方实例学习,第一天学习游戏结构与逻辑

    上手微信小游戏--官方实例学习 文件结构 代码内容 文件结构 ├── base // 定义游戏开发基础类 │ ├── animatoin.js // 帧动画的简易实现 │ ├── pool.js // ...

  9. 《Unity 游戏案例开发大全》一6.5 游戏主场景

    本节书摘来异步社区<Unity 游戏案例开发大全>一书中的第6章,第6.1节,作者: 吴亚峰 , 杜化美 , 于复兴 责编: 张涛,更多章节内容可以访问云栖社区"异步社区&quo ...

最新文章

  1. jupyter安装与初探
  2. 【原创】rman 全库备份脚本
  3. Spring 框架的AOP之注解的方式
  4. css class选择器用法,CSS类选择器用法简明介绍
  5. Yaf框架视频教程之入门篇【已完成】
  6. (转)服务器控件三个ID
  7. linux查看文件标签,linux下不解包查看tar包文件内容
  8. 1.ESP32c3 移植lvgl核心组件教程
  9. 使用纯文本方式编写软件设计文档
  10. 温州大学计算机学硕考研难度,2020年温州大学计算机科学与技术考研经验分享...
  11. iOS-性能优化的那些事
  12. 服务器响应为 5.7.0 dt spm,常见邮箱客户端发送失败的错误代码解析
  13. 一年级课程表(3月14日-3月18日)
  14. UG NX 12抽取体特征
  15. sql 累计占比_sql中查询占百分比percent和通配符的使用
  16. gioneem5Android版本,金立M5 Plus(金立GN8001) 版本线刷包
  17. DBcontext应用于已存在数据库
  18. RuntimeError: No such operator aten::cudnn_convolution_backward_weight
  19. 清华姚班教授: 「读博,你真的想好了吗?」与 UIUC 王鸿伟「读博,我想好了!」...
  20. 开源无国界?你开源出去的代码, 可能有一天你自己都不能用了!

热门文章

  1. matlab plot symbol,导入时出错matlab.引擎不导入ubuntu16.04上python3.5.2中的matplotlib。为什么?...
  2. 蓝桥杯大赛软件赛省赛,C/C++大学B组,改革后2019-2021真题知识点分类
  3. AcWing基础算法课Level-2 第六讲 贪心
  4. 【NOIP2017】【Luogu3951】小凯的疑惑
  5. 两个pv挂一个vg_SKT前教练结婚,发布婚前感言,SKT和VG队员发来祝福
  6. JavaScript浏览器对象Window对象常用方法(3)
  7. 计算机网络交换机组网及虚拟局域网实验报告,计算机网络实验报告材料(虚拟局域网).doc...
  8. python文件管不了_Python文件_管道与模块编写
  9. 互联网控制协议ICMP
  10. bzoj 3751: [NOIP2014]解方程(同余系)