大家好,欢迎来到 Crossin 的编程教室。
你小时候有没有玩过这样一种玩具:一块硬纸,一面画着一只鸟,一面画着一个笼子。硬纸下粘上一根细棒。用手来回转动细棒,让硬纸的两面快速交替出现,就会看见鸟被关在了笼子里。

这种现象被称为视觉暂留,又称余晖效应。人眼的性质使得光信号在进入之后,会保持一小段时间,这段时间大约是0.1~0.4秒。电影、动画便是利用这种现象得以实现,把一幅幅静态画面快速连续播放,形成看上去连续的活动画面。
游戏也不例外。电子游戏本质上就是:不断显示一张张静态画面,只不过这些画面会根据玩家操作实时变化。
所以,无论是超级马里奥、王者荣耀,还是各种大型 3D 游戏,它们背后其实都有一个类似的核心结构。
来看一段用 Python 里的知名游戏库 pygame(需安装)写的一个“空游戏”代码:

这段代码虽然只显示了一张背景图片,完全没有任何游戏功能,但这已经是一个最基本的游戏代码框架了。
注意代码中一个 while True 的循环,注释为“游戏主循环”。这就是游戏中最核心的主体部分。
程序会在一秒钟内执行几十次甚至上百次这个循环。每循环一次,就相当于生成了一张新的静态画面,然后快速连续地显示出来,于是玩家就会感觉画面是连续运动的。
与动画不同,游戏中不仅要把一幅幅画面播放出来,还需要处理玩家的操作与游戏中内容的交互。所以在这个 while 主循环中,程序通常会不断重复做几件事:
然后进入下一帧循环。
在以上代码的主循环里,做了对退出事件的响应:
for event in pygame.event.get():
if event.type == pygame.QUIT:
#接收到退出事件后退出程序
pygame.quit()
exit()然后把图像绘制到窗口中:
screen.blit(background, (0,0))最后,把整个窗口画面更新:
pygame.display.update()如果你看过“黏土动画”,那么就可以把整个游戏过程想象成拍摄黏土动画的过程:
这一切都由计算机在极短时间内处理完成,于是玩家感觉整个世界是在连续运行的。
尽管这是非常简单的游戏逻辑,但在核心原理上,绝大多数游戏都是相通的。即使现在很多游戏已经可以通过游戏引擎、甚至 AI 自动生成部分代码,它们底层仍然离不开这个循环。
有些大型 3D 游戏,需要在一次循环内完成大量工作,比如复杂的物理计算、光影渲染、角色 AI、网络同步等等。如果电脑性能不足,这些计算花费的时间就会变长,于是单位时间内能够完成的循环次数就减少了,游戏刷新画面的频率也会下降。这也就是我们常听说“一个游戏的帧率低”的原因,这种时候你就会感到游戏不流畅。
很多人口中所说的“游戏优化不好”,本质上就是:游戏为了生成每一帧画面,需要做的事情太多了,导致计算机无法及时完成。
而关闭游戏特效、降低画质,其实就是在减少每一帧需要处理的工作量。
例如减少光影计算、降低模型精度、减少粒子效果、缩小贴图分辨率等等。这样一来,计算机就能更快完成一次主循环,于是帧率提高,画面也就变得更流畅了。
这些操作,有很多是依赖于 GPU 计算出的,关于这点我在上次的文章中也有过介绍:CPU vs. GPU - 一个诸葛亮顶不住一万个臭皮匠
以上就是对于电子游戏核心原理的简单介绍。
如果你是个对游戏开发感兴趣的新手,可以看看我之前写过的 pygame 系列教程:
Pygame 入门 - 仿微信打飞机游戏
如何开发一个打飞机游戏
虽然现在的 AI 写这种小游戏只是一句提示词的事,但是通过代码实现游戏可以让你对游戏的底层逻辑有更深刻的理解。
如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~
作者:Crossin的编程教室
本文分享自 Crossin的编程教室 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!