5.从零开始手敲次世代游戏引擎(引擎概观)

2023-10-10 18:30

本文主要是介绍5.从零开始手敲次世代游戏引擎(引擎概观),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

上一篇我们在Linux上建立了Clang的编译环境。现在我们可以开始着手引擎的开发了。

软件开发有几种模式。传统的是瀑布式,就是先完成顶层的设计,然后进行细节设计和实现。这种方式有一个隐含的假设,那就是”成竹在胸”。好比一个造船厂,已经有着丰富的造船经验,对于新用户的新订单,虽然有着很多定制化要求,但是整体的技术已经十分稳定,就可以采用这种模式。另外一种常用的则是迭代开发,将每次迭代控制在一个较小可控的范围之内,每次迭代都产生一个比上一个版本进化了的,功能受限但是可执行的版本,日积月累,是一个不断试错的过程。这种方式就好比”摸着石子过河”,是一种探索式的开发方式,适用于开发经验不足的领域或者需求不定的领域。

– 脱线开始 –

本系列的目的主要是展示一个挑战的过程,就好比直播一个《血源》的游戏过程。展示也有两种方法,一种是先在线下将《血源》玩成割草游戏,然后上线展示;另外一种则是展示一个普通玩家的挑战学习过程。本系列的立意是后者。

这是因为很多事情,说是一回儿事情,做起来就是另外一回儿事情了。很多事情都是道理很简单但是操作起来就有无数的细节。就好比开发一个引擎是很难,但并不是难到里面写的都是外星文。事实上,知识都在那里,概念很多人也都知道,当代先进的商用引擎也都开源放在那里。建造一个引擎,甚至是打造一个主机平台,这里面主要是工程的问题。而这些问题,即使是开源,没有实际动手参与其中的,也很难知道。

所谓”工欲善其事,必先利其器”。在笔者的日常工作当中,遇到了很多不读平台文档,不做准备工作就开始匆匆上马开发的人员。最终他们都卡在了操作细节上,而不是所谓的大局观。有明明没有连上所有配线却在问为啥无法访问开发机的,有没有安装sdk却问编译为啥不通过的,有到了游戏快发布却不知道在哪里看控制台输出的log的,有不知道调试程序并不是一定要打包安装之后才可以进行的,有到了出补丁的时候却忘记了原始版本放在哪里的。这样的例子并不是少数。

– 脱线结束 –

虽然我们选用第二种方式,但是我们仍然需要有一个目标和基本方向。现实社会是复杂非线性的,任何模型只能是某种程度上的近似,迭代也只能发生在这个方向上。

下面就是关于这个引擎的一些基本考虑:

1。该引擎的设计意图是用于教学演示目的

2。因此代码应该简单易读

3。模块清晰,且容易替代,方便做各种改进和尝试

4。不依赖任何特定硬件,尽量使用标准技术

5。随时追加新校则(?)

指导本开发总体的主要书籍是

gameenginebook.com/

在具体的设计实现方面,尽量吸收当时能够获取到的最新信息。

同时当然十分欢迎感兴趣的朋友的加入。无论是通过评论的方式,投稿的方式,还是github的pull request的方式。

(– 题外话开始 –)

知乎的手机app写作功能还是十分受限,所以这两期格式上会比较单调。日后上pc修正。

(– 题外话结束 –)

一个游戏引擎的主体架构,可能随着游戏类型的丰富和游戏复杂度的提升,在最近的10-20年里有了很多的变化。比如2D到3D的进化,线性流程到开放世界的进化,确定性AI到不确定性AI的进化,卡通风格画面到电影品质画面的进化,单机到网络的变化,小团队制作到动则数百人大制作的变化,等等。

然而,如果从计算机硬件的角度来看,无论是哪种类型的游戏,其基本的流程又是十分类似的。获取外部的输入,执行某种策略,更新场景物体状态,绘制画面,输出画面。

从软件系统分类角度来看,游戏系统属于软实时系统。所谓软实时系统,就是它首先要求特定的任务在特定的时间片段内完成(保持一定的帧率)。但如果没有完成,也不会造成伤及人身的重大事故的系统。

在工业界,对于用于生产的实时系统,一般是采用实时操作系统。这种系统所执行的每个任务的执行时间都是事先设计好的。到了时间没有执行完,就会执行紧急措施。

在主机游戏开发领域,早期的游戏开发其实很类似这种情况。那时候的主机并没有什么游戏引擎的概念,连一个像样的操作系统也是没有的。游戏开发工程师们读着硬件的各种参数资料,数着byte和cycle,用一张庞大的spreadsheet计算着各种资源的存放位置和调用周期。这种风格的开发至少延续到PS2世代。在那个世代里,最强的是日本的开发商。因为他们有秋叶原,有极强的计划性。这些老头们现在仍然是日本大厂的中坚力量,然而他们显然已经被时代甩在了后面。

随着硬件的摩尔定律式的发展,游戏内容容量也出现雪崩式增长,这样的开发手法已经变得没有实际操作性了。人们已经不可能去一一指定所有的细节,取而代之的则是制定一些规则,让计算机按照这些规则自己去调度安排资源分配,这就是操作系统和引擎runtime开始导入到主机的一个重要原因。而这些是欧美的强项,游戏圈因此也出现了往欧美一边倒的局面。

另外一个方面,如此庞大的内容资源制作和管理也日渐成为游戏开发的核心问题。增加人力自然是一个办法,也是业界最先采用的方法。然而人是典型的非线性资源,每增加一个人带来的不仅仅是一个人的工资,更是增加了(n*(n-1))/2-((n-1)*(n-2))/2=n-1条沟通路径,和无数的不确定性,劳动生产率快速下降。

因此,队伍规模不能无限地扩张。于是下一个目标就是提高生产单位的生产率。加班加点从原来的忘我工作成为了现在的强制要求。

然而即使是这样也是不够的。疲劳在累积,到了一定程度人会作自由落体运动。新人补进来又是长长的适应周期。

所以剩下的办法就是改革生产工具,计算机不仅仅是用来跑游戏,还要用来写游戏。这就萌生了所谓游戏制作pipeline的概念,也是游戏制作走向工业化的标志。

知乎里有很多诸如“中国为什么没有AAA大作?”这样的问题,有很多大牛从很多方向做了解答。我觉得答得都很棒。但是我想加一条,那就是中国的游戏开发,甚至是更为广泛的软件开发,其生产工业化水平较低,这也是一个很重要的原因。

又跑远了。国内能写这种总结式批评文章的人太多,知乎上就一大把,我还是回到实际操作上。

当代引擎除了runtime,还有一个重要的组成部分就是editor。这个editor就是用来提高生产率的。在以前,游戏的各种资源必须由程序一个一个放进去。而有了editor,游戏本身的制作就可以交给程序以外的人员了。《古墓丽影4》开放了一个关卡编辑器,那个就是当代引擎editor部分的祖先之一。editor在计算机软件属于应用程序,和runtime的性质很不一样。但是,editor的性质和游戏却是很相近的。比如南梦宫的《坦克大战》,里面就是自带关卡编辑器的,而且这个编辑器小孩都能玩得很溜。

前面提到我们的引擎设计的一个要求是要跨平台。然而editor所要求的GUI部分是最难跨平台的部分之一,因为不同平台这部分的API实在是差得太远。但是我们既然要写一个跨平台游戏引擎,那么为什么不就用这个引擎来跑editor呢?这其实也是目前主流商用引擎比较广泛采用的一个办法。当然游戏的渲染引擎与GUI的绘制方式上有很多本质的差别,一些著名的商用引擎至今没有很好用的GUI控件,这个我们后面相关章节再讨论。

综合以上,我们可以确定开发顺序是先进行runtime的开发,然后是editor的开发。

根据上面写了的一般游戏的通用处理流程,我们可以很自然地想到我们将会需要下面这些模块:

1。输入管理模块,用来获取用户输入

2。策略模块,用来执行策略

3。场景管理模块,用来管理场景和更新场景

4。渲染模块,用来执行渲染和画面输出

5。音频音效模块,用来管理声音,混音和播放

6。网络通信模块,用来管理网络通信

7。文件I/O模块,用来管理资源的加载和参数的保存回复

8。内存管理模块,用来调度管理内存上的资源

9。驱动模块,用来根据时间,事件等驱动其它模块

10。辅助模块,用来执行调试,log输出等辅助功能

11。应用程序模块,用来抽象处理配置文件,特定平台的通知,创建窗口等需要与特定平台对接的部分

(– EOF –)



本作品采用知识共享署名 4.0 国际许可协议进行许可。

上一节(Linux环境搭建)                                                                  下一节(初步框架)

这篇关于5.从零开始手敲次世代游戏引擎(引擎概观)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/182259

相关文章

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

生信代码入门:从零开始掌握生物信息学编程技能

少走弯路,高效分析;了解生信云,访问 【生信圆桌x生信专用云服务器】 : www.tebteb.cc 介绍 生物信息学是一个高度跨学科的领域,结合了生物学、计算机科学和统计学。随着高通量测序技术的发展,海量的生物数据需要通过编程来进行处理和分析。因此,掌握生信编程技能,成为每一个生物信息学研究者的必备能力。 生信代码入门,旨在帮助初学者从零开始学习生物信息学中的编程基础。通过学习常用

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

Smarty模板引擎工作机制(一)

深入浅出Smarty模板引擎工作机制,我们将对比使用smarty模板引擎和没使用smarty模板引擎的两种开发方式的区别,并动手开发一个自己的模板引擎,以便加深对smarty模板引擎工作机制的理解。 在没有使用Smarty模板引擎的情况下,我们都是将PHP程序和网页模板合在一起编辑的,好比下面的源代码: <?php$title="深处浅出之Smarty模板引擎工作机制";$content=

BIRT--商业智能和报表工具,从零开始

1.简介 BIRT (Business Intelligence and Reporting Tools), 是为 Web 应用程序开发的基于 Eclipse 的开源报表系统,特别之处在于它是以 Java 和 JavaEE 为基础。BIRT 有两个主要组件:基于 Eclipse 的报表设计器,以及部署到应用服务器上的运行时组件。 2.下载 官网下载网址:http://download.ec

第四次北漂----挣个独立游戏的素材钱

第四次北漂,在智联招聘上,有个小公司主动和我联系。面试了下,决定入职了,osg/osgearth的。月薪两万一。 大跌眼镜的是,我入职后,第一天的工作内容就是接手他的工作,三天后他就离职了。 我之所以考虑入职,是因为 1,该公司有恒歌科技的freex平台源码,可以学学,对以前不懂的解解惑。 2,挣点素材钱,看看张亮002的视频,他用了6000多,在虚幻商城买的吸血鬼游戏相关的素材,可以玩两年。我

MySQL技术内幕_innodb存储引擎

MySQL技术内幕_innodb存储引擎 INNODB innodb中如果表没有主键 表是否由 非空唯一键,有则该字段为主键没有,则自动创建一个6字节大小的指针 innodb存储引擎的所有数据都存储在表空间中,表空间由段,区,页(块)组成。 如果启用了 innodb_file_per_table, 则每张表内的数据可以单独放在一个表空间中即使启用了上面参数,共享表空间也会因为 系统事务信息

Matter.js:Web开发者的2D物理引擎

Matter.js:Web开发者的2D物理引擎 前言 在现代网页开发中,交互性和动态效果是提升用户体验的关键因素。 Matter.js,一个专为网页设计的2D物理引擎,为开发者提供了一种简单而强大的方式,来实现复杂的物理交互效果。 无论是模拟重力、碰撞还是复杂的物体运动,Matter.js 都能轻松应对。 本文将带你深入了解 Matter.js ,并提供实际的代码示例,让你一窥其强大功能