Crossin的编程教室

游戏开发的核心原理

大家好,欢迎来到 Crossin 的编程教室。

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

Image

这种现象被称为视觉暂留,又称余晖效应。人眼的性质使得光信号在进入之后,会保持一小段时间,这段时间大约是0.1~0.4秒。电影、动画便是利用这种现象得以实现,把一幅幅静态画面快速连续播放,形成看上去连续的活动画面。

游戏也不例外。电子游戏本质上就是:不断显示一张张静态画面,只不过这些画面会根据玩家操作实时变化。

所以,无论是超级马里奥、王者荣耀,还是各种大型 3D 游戏,它们背后其实都有一个类似的核心结构。

来看一段用 Python 里的知名游戏库 pygame(需安装)写的一个“空游戏”代码:

Image

这段代码虽然只显示了一张背景图片,完全没有任何游戏功能,但这已经是一个最基本的游戏代码框架了。

注意代码中一个 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()

如果你看过“黏土动画”,那么就可以把整个游戏过程想象成拍摄黏土动画的过程:

  • 每一次,screen.blit() 相当于去把人偶、布景移动一点点位置

  • pygame.display.update() 则是按下快门拍下一帧新的画面

  • 而 if event.type == pygame.QUIT: 就是在判断,导演是不是喊停收工了

这一切都由计算机在极短时间内处理完成,于是玩家感觉整个世界是在连续运行的。

尽管这是非常简单的游戏逻辑,但在核心原理上,绝大多数游戏都是相通的。即使现在很多游戏已经可以通过游戏引擎、甚至 AI 自动生成部分代码,它们底层仍然离不开这个循环。

有些大型 3D 游戏,需要在一次循环内完成大量工作,比如复杂的物理计算、光影渲染、角色 AI、网络同步等等。如果电脑性能不足,这些计算花费的时间就会变长,于是单位时间内能够完成的循环次数就减少了,游戏刷新画面的频率也会下降。这也就是我们常听说“一个游戏的帧率低”的原因,这种时候你就会感到游戏不流畅。

很多人口中所说的“游戏优化不好”,本质上就是:游戏为了生成每一帧画面,需要做的事情太多了,导致计算机无法及时完成。

而关闭游戏特效、降低画质,其实就是在减少每一帧需要处理的工作量。

例如减少光影计算、降低模型精度、减少粒子效果、缩小贴图分辨率等等。这样一来,计算机就能更快完成一次主循环,于是帧率提高,画面也就变得更流畅了。

这些操作,有很多是依赖于 GPU 计算出的,关于这点我在上次的文章中也有过介绍:CPU vs. GPU - 一个诸葛亮顶不住一万个臭皮匠

以上就是对于电子游戏核心原理的简单介绍。

如果你是个对游戏开发感兴趣的新手,可以看看我之前写过的 pygame 系列教程:

Pygame 入门 - 仿微信打飞机游戏

如何开发一个打飞机游戏

虽然现在的 AI 写这种小游戏只是一句提示词的事,但是通过代码实现游戏可以让你对游戏的底层逻辑有更深刻的理解。

如果本文对你有帮助,欢迎点赞、评论、转发。你们的支持是我更新的动力~

作者:Crossin的编程教室


Crossin的新书《码上行动:用ChatGPT学会Python编程》已经上市了。本书以ChatGPT为辅助,系统全面地讲解了如何掌握Python编程,适合Python零基础入门的读者学习。【点此查看详细介绍】
购买后可加入读者交流群,Crossin为你开启陪读模式,解答你在阅读本书时的一切疑问。
Crossin的其他书籍:

添加微信 crossin123 ,加入编程教室共同学习~
Image
感谢转发和点赞的各位~