[摘抄]游戏主循环逻辑
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
[摘抄]游戏主循环逻辑相关推荐
- 4.帧循环(游戏主循环),schedule
1 概述 游戏乃至图形界面的本质是不断地绘图,然而绘图并不是随意的,任何游戏都需要遵循一定的规则来呈现出来,这些规则就体现为游戏逻辑.游戏逻辑会控制游戏内容,使其根据用户输入和时间流逝而改变.因 ...
- 游戏主循环(Game Loop)的详细解析
译自:https://dewitters.com/dewitters-gameloop/ 一. 引言 游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分.不幸的是没有任何一篇好的文章来指导一个菜鸟游 ...
- 游戏主循环基础例子 GameLoop
游戏主循环基础例子 GameLoop 这里比较简单,直接发代码好了 import timefrom loguru import loggerfrom core import GetDeltaTime, ...
- 游戏主循环(Game Loop)详解
每一个复杂的应用程序的核心都是一个循环(Loop) - 贯穿于一个应用程序生活周期的是一部分代码不断的重复执行时间.这个循环(Loop),可以就说是主循环.主循环的主要作用是:协调程序的行为(事件)和 ...
- cocos2d-x游戏开发(四)游戏主循环
欢迎转载:http://blog.csdn.net/fylz1125/article/details/8518737 终于抽时间把这个游戏写完了.由于没有自拍神器,所以把它移植到了Android上,用 ...
- 辛巴学院-Unity-剑英的c#提高篇(一)主循环
这是测试版 辛巴学院:正大光明的不务正业. 最近刚刚离开了我服务了三年多的公司,因为一个无数次碰到的老问题,没钱了. 之前不知道做什么好的时候,机缘巧合之下和哒嗒网络的吴总聊了一下,发现了vr gam ...
- 一文帮你理清游戏思路+实现逻辑- Python飞机大战
文章目录 前言 思维导图 思路分析 三大对象 飞船 子弹 小行星 主函数 开始界面 游戏界面 结束界面 End 本篇是一文帮你理清"游戏思路+实现逻辑"专栏的第一篇文章,我个人开此 ...
- 上手微信小游戏——官方实例学习,第一天学习游戏结构与逻辑
上手微信小游戏--官方实例学习 文件结构 代码内容 文件结构 ├── base // 定义游戏开发基础类 │ ├── animatoin.js // 帧动画的简易实现 │ ├── pool.js // ...
- 《Unity 游戏案例开发大全》一6.5 游戏主场景
本节书摘来异步社区<Unity 游戏案例开发大全>一书中的第6章,第6.1节,作者: 吴亚峰 , 杜化美 , 于复兴 责编: 张涛,更多章节内容可以访问云栖社区"异步社区&quo ...
最新文章
- jupyter安装与初探
- 【原创】rman 全库备份脚本
- Spring 框架的AOP之注解的方式
- css class选择器用法,CSS类选择器用法简明介绍
- Yaf框架视频教程之入门篇【已完成】
- (转)服务器控件三个ID
- linux查看文件标签,linux下不解包查看tar包文件内容
- 1.ESP32c3 移植lvgl核心组件教程
- 使用纯文本方式编写软件设计文档
- 温州大学计算机学硕考研难度,2020年温州大学计算机科学与技术考研经验分享...
- iOS-性能优化的那些事
- 服务器响应为 5.7.0 dt spm,常见邮箱客户端发送失败的错误代码解析
- 一年级课程表(3月14日-3月18日)
- UG NX 12抽取体特征
- sql 累计占比_sql中查询占百分比percent和通配符的使用
- gioneem5Android版本,金立M5 Plus(金立GN8001) 版本线刷包
- DBcontext应用于已存在数据库
- RuntimeError: No such operator aten::cudnn_convolution_backward_weight
- 清华姚班教授: 「读博,你真的想好了吗?」与 UIUC 王鸿伟「读博,我想好了!」...
- 开源无国界?你开源出去的代码, 可能有一天你自己都不能用了!
热门文章
- matlab plot symbol,导入时出错matlab.引擎不导入ubuntu16.04上python3.5.2中的matplotlib。为什么?...
- 蓝桥杯大赛软件赛省赛,C/C++大学B组,改革后2019-2021真题知识点分类
- AcWing基础算法课Level-2 第六讲 贪心
- 【NOIP2017】【Luogu3951】小凯的疑惑
- 两个pv挂一个vg_SKT前教练结婚,发布婚前感言,SKT和VG队员发来祝福
- JavaScript浏览器对象Window对象常用方法(3)
- 计算机网络交换机组网及虚拟局域网实验报告,计算机网络实验报告材料(虚拟局域网).doc...
- python文件管不了_Python文件_管道与模块编写
- 互联网控制协议ICMP
- bzoj 3751: [NOIP2014]解方程(同余系)