游戏主循环

17、游戏主循环机制解析 本文深入解析了游戏主循环的核心机制,包括飞船速度警告、殖民者处理、燃料舱和外星UFO的出现逻辑,以及玩家死亡和进入母舰停机坪时的弹窗处理。文章通过详细代码示例和流程图展示了各个功能模块的工作原理,并提出了性能优化建议,如随机数选择优化、动画缓存和碰撞检测优化,为游戏开发者提供了实用的参考方案。 阅读详情
 

游戏主循环

http://dewitters.koonsolo.com/gameloop.html

引言

游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。

由于我身为游戏程序员,我见过许许多多的手机小游戏的代码。这些代码给我展示了五彩缤纷的游戏主循环实现方法。你可能要问: " 这么简单的一个小玩意还能做到千奇百怪? " 事实就是这样,我就会在此文中讨论一些主流实现的优缺点,并且给你介绍在我看来最好的输送养分的解决方案。


游戏主循环


每一个游戏都是由获得用户输入,更新游戏状态,处理 AI ,播放音乐和音效,还有画面显示这些行为组成。游戏主循环就是用来处理这个行为序列。如我在引言中所说,游戏主循环是每一个游戏的心跳。在此文中我不会深入讲解上面提到的任何一个行为,而只详细介绍游戏主循环。所以我把这些行为简化为了两个函数:

update_game(); // 更新游戏状态 (后文可能翻译为逻辑帧)
display_game(); //
更新显示 (显示帧)

下面是最简单的游戏主循环:

bool game_is_running = true;

while( game_is_running ) {
update_game();
display_game();
}

这个简单循环的主要问题是它忽略了时间,游戏会尽情的飞奔。在小霸王机器上运行会使玩家有极强的挫败感,在牛逼的机器上运行则会要求玩家有超人的判断力和 APM (原意为慢的机器上运行慢,快的机器上运行快 %26#8230;%26#8230; )。在远古时代,硬件的速度已知的情况下,这不算什么,但是目前有如此多的硬件平台使得我们不得不去处理时间这个重要因素。对于时间的处理有很多的方法,接下来我会一一奉上。

首先我会解释两个贯穿全文的术语:

每秒帧数(后简称 FPS )

FPS 是 Frames Per Second 的缩写。在此文的上下文中它意味着 display_game() 每秒被调用的次数。

游戏速度

游戏速度是每秒更新游戏状态的速度,换言之,即 update_game() 每秒被调用的次数。

FPS 依赖于恒定的游戏速度

实现

一个让游戏每秒稳定运行在 25 帧的解决方案如下:

const int FRAMES_PER_SECOND = 25;
const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;

DWORD next_game_tick = GetTickCount(); 
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started

int sleep_time = 0;

bool game_is_running = true;

while( game_is_running ) {
update_game();
display_game();

next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - GetTickCount();
if( sleep_time >= 0 ) {
Sleep( sleep_time );
}
else {
// Shit, we are running behind!
}
}

这个方案有一个非常大的优点:简单!因为你知道 update_game() 每秒被调用 25 次,那么你的游戏的逻辑部分代码编写将非常直白。比如说在这种主循环实现的游戏中实现一个 重放 函数将非常简单(译者注:因为每帧的间隔时间已知,只需要记录每一帧游戏的状态,回放时按照恒定的速度播放即可。就像电影胶片一样)。如果在游戏中没有受到随机值的影响,只需要记录玩家的输入就可以实现重放。

在你实现这个循环的硬件上你可以按需要调整 FRAMES_PER_SECOND 到一个理想的值,但是这个游戏主循环实现会在各种硬件上表现得怎么样呢?

小霸王机

如果硬件可以应付指定的 FPS ,那么不会有什么事情发生。但是小霸王通常是应付不了的,游戏就会卡。在极端情况下就会卡得掉渣,或者一步十卡、一卡十步(原意为某些情况下游戏速度很慢,有一些情况下又比较正常)。这样的问题会毁掉你的游戏,使得玩家及其挫败。

牛逼的机器

在牛逼的机器上似乎不会有任何问题,但是这样的游戏主循环浪费大量的时钟循环!牛逼的机器运行这个游戏可以轻松的跑到 300 帧,却每秒只运行了 25 或者 30 帧 ~ 那么这个主循环实现会让拥有牛逼硬件的玩家无法尽情发挥其硬件效果产生极大的挫败感(原意为这样的实现会让你的视觉效果受到影响,尤其是高速移动物体)。

从另外一个角度来说,在移动设备上,这一点可能会是一个优点。游戏持续的高速运行会很快地消耗电池 %26#8230;%26#8230;

结论

基于恒定游戏速度的 FPS 的主循环实现方案简单易学。但是存在一些问题,比如定义的 FPS 太高会使得老爷机不堪重负,定义的 FPS 太低则会使得高端硬件损失太多视觉效果。

基于可变 FPS 的游戏速度

实现

另外一种游戏实现可以让游戏尽可能的飞奔,并且让依据 FPS 来决定游戏速度。游戏状态会根据每一显示帧消耗的时间来进行更新。

DWORD prev_frame_tick;
DWORD curr_frame_tick = GetTickCount();

bool game_is_running = true;
while( game_is_running ) {
prev_frame_tick = curr_frame_tick;
curr_frame_tick = GetTickCount();

update_game( curr_frame_tick - prev_frame_tick );
display_game();
}

这个游戏主循环的代码比起之前稍微复杂一些,因为我们必须去考虑两次 update_game() 调用之间的时间差。不过,好在这并不算复杂。
初窥这个实现的代码好像是一个理想的实现方案。我已经见过许多聪明的游戏程序员用这种方式来书写游戏主循环。但是我会给你展示这个实现方案在小霸王和牛逼的机器上的严重问题!是的,包括非常职业非常娴熟非常牛逼的玩家的机器。

小霸王

小霸王会在某些运算复杂的地方出现卡的情况,尤其在 3D 游戏中的复杂场景更是如此。帧率的降低会影响游戏输入的响应,同时降低玩家的反应速度。游戏状态更新也会因此突然受到影响。这样的情况会使得玩家和 AI 的反应速度减慢,造成玩家挫败感加剧。比如一个在正常帧率下可以轻松越过的障碍会在低帧率下无法逾越。更严重的问题是在小霸王上会经常发生一些违反物理规律的怪事,如果这些运算涉及到物理模拟的话。

牛逼的机器

你可能会好奇,为什么刚才的游戏循环在飞快的机器上会出现问题。不幸的是,这个方案的确如此,首先,让我给你介绍一些计算机数学知识。

浮点数类型占用内存大小是有限的,那么有一些数值就无法被呈现。比如 0.1 就不能用 2 进制表示,所以会被近似的存储在一个浮点数中。我用 python 给你们展示一下。

>>> 0.1
0.10000000000000001

这个问题本身并不怎么具有戏剧性,但是这样的后果却截然相反。比方说你的赛车的速度是 0.001 个单元每微秒。那么正确的结果是在 10 秒后你的赛车会移动 10 个单位,那么我们这样来实现一下:

>>> def get_distance( fps ):
... skip_ticks = 1000 / fps
... total_ticks = 0
... distance = 0.0
... speed_per_tick = 0.001
... while total_ticks < 10000:
... distance += speed_per_tick * skip_ticks
... total_ticks += skip_ticks
... return distance


现在我们来得到 40 帧每秒时运行 10 秒后的结果
>>> get_distance( 40 )
10.000000000000075

等等 ~ 怎么不是 10 呢?发生了什么?嗯, 400 次加法后的误差就有这么大,每秒运行 100 次加法后又会是怎么一个样子呢?

>>> get_distance( 100 )
9.9999999999998312

误差越来越大了!那么, 40 帧每秒的结果和 100 帧每秒之间误差差距是多大呢?

>>> get_distance( 40 ) - get_distance( 100 )
2.4336088699783431e-13

你 可能会想这样的误差可以忽略。但是真正的问题出现在你使用这些错误的值去进行更多的运算。小的误差会被扩大为致命的错误!然后这些错误会在游戏飞奔的同时 毁掉它!这些问题发生的几率绝对大到足够引起你的注意。我有见过因为这个原因在高帧率出现问题得游戏。之后那个游戏程序员发现这些问题出现在游戏的核心部 分,只有重写大部分代码才能修复它。

结论

这样的游戏主循环看上起不错,但是并不怎么样。不管运行它的硬件怎样,都可能出现严重的问题。另外,游戏实现的代码相对于固定游戏速度的主循环而言更加复杂,那你还有什么使用它的理由呢?

最大 FPS 和恒定游戏速度

实现

我们的第一个实现中, FPS 依赖于恒定的游戏速度,在低端的机器上会出现问题。游戏速度和游戏显示都会出现掉帧。一个可行的解决方案是牺牲显示帧率的来保持恒定的游戏速度。下面就实现了这种方案:


const int TICKS_PER_SECOND = 50;
const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
const int MAX_FRAMESKIP = 10;

DWORD next_game_tick = GetTickCount();
int loops;

bool game_is_running = true;
while( game_is_running ) {

loops = 0;
while( GetTickCount() > next_game_tick %26amp;%26amp; loops < MAX_FRAMESKIP) {
update_game();

next_game_tick += SKIP_TICKS;
loops++;
}

display_game();
}

游戏会以稳定的 50 (逻辑)帧每秒的速度更新,渲染速度也尽可能的快。需要注意的是,如果渲染速度超过了 50 帧每秒的话,有一些帧的画面将会是完全相同的。所以显示帧率实际上也等同于最快每秒 50 帧。在小霸王上运行的话,显示帧率会在更新游戏状态循环达到 MAX_FRAMESKIP 时下降。从上面这个例子来说就是当渲染帧率下降到 5 ( FRAMES_PER_SECOND / MAX_FRAMESKIP )以下时,游戏速度会变慢。

小霸王

在小霸王上运行这样的游戏循环会出现掉帧,但是游戏速度不受到影响。如果硬件还是没有办法处理这样的循环,那么游戏速度和游戏帧率都会受到影响。

牛逼的机器

在牛逼的机器上这个游戏循环不会出现问题,但是如同第一个解决方案一样,还是浪费了太多的时钟周期。找到一个快速更新并且依然能够在小霸王上运行游戏的平衡点是至关重要的!

结论

使用上面的这个方案可以使游戏的实现代码比较简单。但是仍然有一些问题:如果定义了一个过高的 FPS 会让小霸王吃不消,如果过低则会让牛逼的机器难以发挥性能。


独立的可变显示帧率和恒定的游戏速度

实现

有没有可能对之前的那种方案进行优化使得它在各种平台上都有足够好的表现呢?当然是有的!游戏状态本身并不需要每秒更新 60 次。玩家输入, AI 信息等都不需要如此高的帧率来进行更新,大约每秒 25 次就足够了。所以,我们可以试着让 update_game() 每秒不多不少的被调用 25 次。渲染则放任不管,让其飞奔。但是不能让小霸王的低渲染帧率影响到游戏状态更新的速度。下面就是这个方案的实现:

const int TICKS_PER_SECOND = 25;
const int SKIP_TICKS = 1000 / TICKS_PER_SECOND;
const int MAX_FRAMESKIP = 5;

DWORD next_game_tick = GetTickCount();
int loops;
float interpolation;

bool game_is_running = true;
while( game_is_running ) {

loops = 0;
while( GetTickCount() > next_game_tick %26amp;%26amp; loops < MAX_FRAMESKIP) {
update_game();

next_game_tick += SKIP_TICKS;
loops++;
}

interpolation = float( GetTickCount() + SKIP_TICKS - next_game_tick )
/ float( SKIP_TICKS );
display_game( interpolation );
}

使用这种方案的 update_game() 实现会比较简单,相对而言, display_game() 则会变得稍许复杂。你需要实现一个接收插值参数的预言函数,这并不是什么难事,只是需要做一些额外的工作。我会接着解释这个预言函数是如何工作的,不过首先让我告诉你为什么需要这样的一个函数。

游戏状态每秒被更新 25 次,如果你渲染的时候不使用插值计算,渲染帧率就会被限定在 25 帧。需要注意的是, 25 帧并没有人们想象中的糟糕,电影画面在每秒 24 帧的情况下依然流畅。所以 25 帧可以很好的展示游戏画面,不过对于高速移动的物体,更高的帧率会带来更好的效果。所以我们要做的是,在显示帧之间让高速移动的物体平滑过度。这就是我们需要一个插值和预言函数的原因。

插值和预言函数

如我之前所说,游戏状态更新在一个恒定的帧率下运行着,当你渲染画面的时刻,很有可能就在两个逻辑帧之间。假设你已经第 10 次更新了你的游戏状态,现在你需要渲染你的场景。这次渲染就会出现在第 10 次和第 11 次逻辑帧之间。很有可能出现在第 10.3 帧的位置。那么插值的值就是 0.3 。举个例子说,我的一辆赛车以下面的方式计算位置。

position = position + speed;

如果第 10 次逻辑帧后赛车的位置是 500 ,速度是 100 ,那么第 11 帧的位置就会是 600. 那么在 10.3 帧的时候你会在什么位置渲染你的赛车呢?显而易见,应该像下面这样:

view_position = position + (speed * interpolation)

现在,赛车将会被正确地渲染在 530 这个位置。

基本上,插值的值就是渲染发生在前一帧和后一帧中的位置。你需要做的就是写出预言函数来预计你的赛车 / 摄像机或者其他物件在渲染时刻的正确位置。你可以根据物件的速度来计算预计的位置。这些并不复杂。对于某些预计后的帧中出现的错误现象,如某个物体被渲染到了某个物体之中的情况的确会出现。由于游戏速度恒定在每秒更新 25 次状态,那么这种错误停留在画面上的时间极短,难以发现,并无大碍。

小霸王

大多数情况下, update_game() 执行需要的时间比 display_game() 少得多。实际上,我们可以假设在小霸王上 update_game() 每秒还是能运行 25 次。所以游戏的逻辑状态不会受到太大的影响,即使 FPS 非常低。

牛逼的机器

在牛逼的硬件上,游戏速度会保持每秒 25 次,屏幕更新却可以非常快。插值的方案可以让游戏在高帧率中有更好的画面表现。但实质上游戏的状态每秒只更新了 25 次。

结论

使游戏状态的更新独立于 FPS 的解决方案似乎是最好的游戏主循环实现。不过,你必须实现一个插值计算函数。

整体总结

游戏主循环对游戏的影响远远超乎你的想象。我们讨论了 4 个可能的实现方法,其中有一个方案是要坚决避免的,那就是可变帧率来决定游戏速度的方案。

一个恒定的帧率对移动设备而言可能是一个很好的实现,如果你想展示你的硬件全部的实力,那么最好使用 FPS 独立于游戏速度的实现方案。

如果你不想麻烦的实现一个预言函数,那么可以使用最大帧率的实现方案,只是要找到一个帧率大小的平衡点。

现在,你可以着手编写你梦寐以求的游戏了!

Koen Witters

Snort源代码编译 _ 采坑之旅(for Windows VS2015)     系统环境:Windows7 sp1 x64     编译环境:VS2015 SP1     Snort版本:2.9.12     daq版本:2.0.6     Snort官网:https://www.snort.org/downloads#snort-downloads 背景     最近需要实现一个类似网络防火墙的产品,主要参考Snort源码,先花了点时间简单读了下网上比较流行的《... 阅读详情

相关推荐

告别数据丢失焦虑:用Python手把手实现Reed-Solomon码(附完整代码)

本文详细介绍了如何使用Python实现Reed-Solomon纠错码(RS码),帮助开发者有效防止数据丢失。通过基础编解码实战、文件保护方案和高级性能优化技巧,读者可以轻松掌握这一前向纠错技术,应用于物联网、文件存储和网络传输等场景,提升数据可靠性。

weixin_42527160的博客 223

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

译自:https://dewitters.com/dewitters-gameloop/ 1. 引言   游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。   由于我身为游戏程序员,我见过许许多多的手机小游戏的代码。这些代码给我展示...

Zzz的专栏 1万+

Mac上Office合法安装与激活全指南:2021/2024/M365区别解析

Office是微软办公套件的核心产品,其在macOS平台的部署逻辑与Windows截然不同——不依赖传统密钥激活,而是基于Microsoft账户与设备标识的云端绑定机制。理解这一原理,是解决‘无法验证开发者’‘打不开’‘功能受限’等常见问题的前提。Office 2021代表永久许可模型,Office 2024 LTSC面向企业离线场景,Microsoft 365则是持续订阅服务,三者在授权验证方式、更新策略与系统兼容性上存在本质差异。实际应用中,需结合macOS版本、芯片架构(Intel/Apple Sil

weixin_33491377的博客 1254

游戏架构其六:游戏主循环

绚丽的大型游戏背后,都存在着一个主循环,能根据游戏的进度控制游戏的状态。主循环管理游戏的正常运行,管理着游戏运行失败该如何处理,对某些不能运行的情况给予杀死等等。另外,在MMORPG中,主循环同样也是AI的管理者,时刻根据游戏的运行状态,调度出不同的AI运行,增强了游戏的可玩性和趣味性。同时主循环对于关卡控制,游戏画面渲染,声音管理,资源管理也有所掌控。总之,主循环对于大型游戏是不可或缺的一部分~

Blary的专栏 2165

408计算机复试专业课问答汇总

408计算机复试专业课问答汇总

weixin_45930223的博客 3698

高速DAC设计与实现--AD9122

目录 芯片简介: 功能配置设计 高速DAC软件驱动设计 芯片简介: AD9122 是一款双通道16位高性能数模转换器(DAC),在800MSPS工作条件下其无杂散动态范围(SFDR)高达72dBc,最高可提供1200 MSPS采样速率。 高速DAC--AD9122电路原理图 硬件设计的电路原理图如上图所示,AD9122具备针对直接变频传输应用进行优化的特性,包括复数数字调制以及增益与失调补偿。DAC输出经过优化后可直接与模拟正交调制器无缝接口,便于后期使...

独木舟216的博客 1万+

游戏主循环(Game Loop)详解

每一个复杂的应用程序的核心都是一个循环(Loop) - 贯穿于一个应用程序生活周期的是一部分代码不断的重复执行时间.这个循环(Loop),可以就说是主循环。主循环的主要作用是:协调程序的行为(事件)和建里应用程序的中枢。   游戏主循环(Game Loop):游戏(Game)的开发也不例外,也是有主循环(Game Loop)的,游戏主循环(Game Loop)是每个游戏中最重要的一部分。游戏都...

weixin_34107739的博客 626

基于bootstrap+Java的图书管理系统(任务书)

10] 倪甜弟,周晓波,王相喜.基于JSP图书馆自习室预约系统的设计与实现[J].现代计算机, 2024, 30(9):117-120.DOI:10.3969/j.issn.1007-1423.2024.09.023.[2] 陈明雪,赵勇,周小丽,等.基于Node.js和Bootstrap的图书管理系统设计与研究[J].现代信息科技, 2021, 5(24):4.[9] 杨婷婷.基于VOSviewer的图书馆管理系统研究的可视化分析[J].现代信息科技, 2023, 7(3):123-126.

毕业作品网站 647

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

欢迎转载:http://blog.youkuaiyun.com/fylz1125/article/details/8518737 终于抽时间把这个游戏写完了。由于没有自拍神器,所以把它移植到了Android上,用我的戴妃跑的很欢啊。自此,我算是完成了一个功能比较完善的游戏了。 麻雀虽小,五脏俱全,该有的都有,不该有的估计也有,嘿嘿。这几天把写这个游戏的经历和学习过程整理一下,多写几篇博客,就当做记笔记...

移动开发记录 335

深入解析YT8521S千兆以太网PHY芯片的设计与调试要点

本文深入解析了YT8521S千兆以太网PHY芯片的设计与调试要点。重点剖析了硬件设计中的电源方案、RGMII接口电平配置(尤其是1.8V电平方案)以及PCB布局布线等关键细节,并提供了从硬件检查、驱动配置到性能测试的完整调试流程,帮助工程师规避常见陷阱,实现稳定可靠的千兆网络连接。

weixin_29190573的博客 687

STM32F103C8T6飞控入门:从零开始,用HAL库和MPU6050搭建你的第一架四轴无人机

本文详细介绍了如何使用STM32F103C8T6和MPU6050模块从零开始搭建四轴无人机飞控系统。通过硬件选型、电路设计、HAL库配置、姿态解算算法实现以及PID控制等步骤,帮助创客和嵌入式爱好者快速入门飞控开发。文章还提供了实用的调试技巧和常见问题解决方案,适合想要掌握四旋翼无人机核心技术的开发者。

weixin_42524750的博客 266

GTK+主循环(main loop)的工作原理 [zt]

GTK+主循环(main loop)的工作原理GTK+主循环(main loop)的工作原理 转载时请注明出处和作者联系方式:http://blog.youkuaiyun.com/absurd作者联系方式:Li XianJing <xianjimli at hotmail dot com>更新时间:2007-3-17 我们知道GUI应用程序都是事件驱动的。这些事件大部分都来自...

weixin_34007020的博客 934

OceanBase容量统计:租户、数据库、表大小

🍎 数据库版本:OceanBase V4。

Sebastien23的博客 1401

Cocos2d-x 动手实现游戏主循环

由于Cocos2d-x封装的很好,所以对于很多新手,他们只知道先new一个场景,在场景上添加布景或精灵,然后用Director的runWithScene便可以运行游戏了。如果给一个精灵加个动作,精灵就会动,如果给布景层添加个定时器,游戏会定时执行。你知道为什么会这样吗? 作为一个游戏开发者,我觉得进入游戏这一行业之前,一定要先搞清楚“游戏主循环”这个东东,可惜我到现在才来研究这个东东。或许网上关于Cocos2d-x游戏主循环的讲解一大把,但是这篇文章,我会教你怎么来实现游戏主循环。

wxc237786026的专栏 2487

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

游戏主循环知识积累

1. 引言   游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。   由于我身为游戏程序员,我见过许许多多的手机小游戏的代码。这些代码给我展示了五彩缤纷的游戏主循环实现方法。你可能要问:“这么简单的一个小玩意还能做到千奇百怪...

diebaoshu9621的博客 162

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

游戏帧循环(游戏主循环)

游戏运行时候会不断按照游戏逻辑规则重新绘图,反复处理用户输入、处理定时事件、绘图,直到游戏结束。 Cocos2d-x引擎也是通过不断绘图来进行游戏的,默认的帧率在AppDelegate.cpp中显示为60帧每秒,也就是每秒执行了60次用户输入、定时时间、绘图等。 抄录Cocos2d-x高级教程中内容如下: 游戏乃至图形界面的本质是不断地绘图,然而绘图并不是随意的,任何...

sylalak123的博客 1309

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

青瓷引擎 - 游戏主循环

青瓷引擎游戏主循环的实现。

armoonxm的博客 616

写一个好的游戏主循环

原文地址:http://www.koonsolo.com/news/dewitters-gameloop/ [转于Oiramario]  游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。 由于我身为游戏程序员,我见过许许

唐俊鑫的专栏 3353

关于游戏的主循环

原文地址http://hi.baidu.com/xiongharry/blog/item/e3f8e987a5c1a63766096e75.html<br /><br />http://dewitters.koonsolo.com/gameloop.html<br />引言<br />游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。<br />由于

优秀技术文章收录 1713

网络游戏中的主循环

引言: 网络游戏作为一种复杂度较高的软件,从其设计角度还是有一些共性的,比方说几乎所有的网游都会有一个主循环。由于游戏需要根据输入、游戏内状态的改变来不间断地更新游戏画面,所以游戏的主循环往往看起来像一个“死循环”,那么这个“死循环”是如何工作的? 主循环主要做什么? 1.处理游戏逻辑(输入、AI、事件处理) 2.执行渲染操作(更新游戏画面) 注:对于

“亚”人深致,不忘初“辛” 447

翻译]游戏主循环

原文地址 http://dewitters.koonsolo.com/gameloop.html 游戏主循环 引言 游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。 由于我身为游戏程序员,我见过许许多多的手机小...

weixin_30760895的博客 99

cocos2d-x游戏开发(三)游戏主循环

终于抽时间把这个游戏写完了。由于没有自拍神器,所以把它移植到了Android上,用我的戴妃跑的很欢啊。自此,我算是完成了一个功能比较完善的游戏了。 麻雀虽小,五脏俱全,该有的都有,不该有的估计也有,嘿嘿。这几天把写这个游戏的经历和学习过程整理一下,多写几篇博客,就当做记笔记了。 首先还是就我个人的理解,讲讲游戏引擎的处理流程。 其实游戏逻辑简单化就是一个死循环,如下:

炫_愛羊的专栏 5204

游戏主循环基础例子 GameLoop

游戏主循环基础例子 GameLoop 这里比较简单,直接发代码好了 import time from loguru import logger from core import GetDeltaTime, SetLastFrameTime FPS = 60 # 帧 g_IsRunning = False g_IsPause = False def init(*args, **kw...

hunter_wyh 1024

游戏主循环FPS

游戏主循环 引言 游戏主循环是每个游戏的心跳,输送着整个游戏需要的养分。不幸的是没有任何一篇好的文章来指导一个菜鸟游戏程序员如何为自己的程序供养。不过不用担心,因为你刚好不小心看到了这篇,也是唯一一篇给予这个话题足够重视的文章。 由于我身为游戏程序员,我见过许许多多的手机小游戏的代码。这些代码给我展示了五彩缤纷的游戏主循环实现方法。你可能要问:“这么简单的一个小玩意还能做到千奇百怪?”事实就

cbbbc 1252
上一篇: 系统开发建议
下一篇: 拍卖行竞拍存储过程,存在什么问题呢?
comeon_data
博客等级 码龄22年 15粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值