百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

敲开游戏引擎的大门,聊聊引擎的来龙去脉

csdh11 2025-02-21 12:55 14 浏览

游戏引擎究竟是什么?恐怕就算是资深行业人士也很难三言两语说清楚。让我们一起来敲开游戏引擎的大门,聊聊引擎的来龙去脉。

1 什么是游戏引擎

什么是游戏引擎?其实这很难给出明确的定义。在很多游戏的宣传中,我们总会听到对游戏引擎的推崇。绚丽的特效,流畅的体验,似乎都是游戏引擎的功劳。在游戏玩家看来,游戏画面的表现力越好,游戏场面的震撼程度越大,游戏体验的真实感越强,底层的游戏引擎就可能越强大。

看看业界给出的一些定义。

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地写出游戏程序而不用从零开始。大部分游戏引擎都支持多种操作平台,如Linux、Mac OS X、Windows。游戏引擎包含渲染引擎(即“渲染器”,含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测系统、音效引擎、脚本引擎、电脑动画引擎、人工智能引擎、网络引擎以及场景管理引擎。

根据上述定义,在很多人看来,游戏引擎负责把很多已有的零部件组装起来,如同组装手机,CPU、屏幕、摄像头、主板等都是别人生产的,手机厂商按照自己喜欢样式组装一下就好了。

下面再看看Game Engine Architecture(中文书名《游戏引擎架构》,ISBN是978-7-121-22288-7)是怎么说的:

通常,游戏和其引擎之间的分界线是很模糊的。一些引擎有相当清晰的划分,一些则没有尝试把二者分开。在一款游戏中,渲染代码可能特别“知悉”如何画一只妖兽(Orc);在另一款游戏中,渲染引擎可能只提供多用途的材质及着色功能,“妖兽”可能完全是用数据去定义的。没有工作室可以完美地划分游戏和引擎。这不难理解,因为随着游戏设计的逐渐成形,这两个组件的定义会经常转移。

似乎游戏界引擎专家也无法真正给引擎下一个明确定义,虽然大家都知道什么是游戏引擎,却很难用三言两语把它表述出来。本节尝试用比喻的方式把它讲清楚。

假设我们穿越回20世纪80年代,我们的手中已经有整套的FC游戏《超级马里奥》(见图1(a))的代码,现在我们要开发另一款FC游戏《冒险岛》(如图1所示)。此时我们需要从零开始吗?显然,这两款游戏有着太多共性,都是一个游戏角色在横板卷动的地图上蹦来蹦去,都可以踩死怪物。当然,也有不同,画面不同,声音不同,关卡不同……但对于共同的功能,聪明的我们当然会重用一些现成的代码。而这种横板卷轴游戏模板的通用性非常好,目前游戏界对它的需求量也非常大,所以我们决定把这种特定类型游戏的核心功能提炼出来,供那些也要开发这种游戏的人使用。

(a)

(b)图1 《超级马里奥》与《冒险岛》游戏画面

后来,蹦蹦跳跳的游戏逐渐没落,即时战略游戏开始兴起,有人要开发即时战略游戏《红色警界》(如图2所示)。

图2 《红色警界》游戏画面

虽然游戏模板的代码能渲染2D动画、播放声音、处理鼠标键盘的按键响应,但无法用于即时战略游戏。因为玩家们想要的是多人联网,这就要求程序能够处理大量同屏2D动画,能够快速编辑适应即时游戏的关卡,能够运行无法与玩家和平相处的AI,甚至能够让游戏运行在不同的地方,比如PS1和PC。可是原有的游戏模板根本做不到这些。

直到有一天,卡马克设计了一款叫《DOOM》(中文名《毁灭战士》)的游戏(如图3所示),这简直就是PC(DOS系统)游戏史的一个里程碑。这款游戏漂亮的3D画面,让很多游戏爱好者在电脑房(很遗憾,那时只有局域网)“火拼”。

图3 《Doom》游戏画面

卡马克又写出了全3D的游戏《QUAKE》,而且支持当时最强大的3D加速卡,人们再次被震惊了。崇拜卡马克的人们用《QUAKE》的代码制作了新的射击游戏——《Counter-Strike》,也就是家喻户晓的CS。《QUAKE》的动画、渲染的程序也被拿来继续开发其他游戏。

故事总归是故事,但对于《冒险岛》来说,被复用的那部分《超级马里奥》代码其实就是最早的游戏引擎。不过它的技术没那么先进,功能也不甚强大,还缺乏顺应潮流的更新,以致最终销声匿迹了。但卡马克的代码则不同,它超越了当时人们的想象力。他不但为射击游戏制定了完整方案,而且实现的代码功能强大。其高度的复杂性和健壮性,甚至让很多人乐于用其中的某些模块去开发非射击类的游戏,结果不但节省开发时间而且游戏健壮性也不错。这几乎是一部简短的游戏引擎发展史。

我们为什么要如此辛苦地探讨引擎的定义?每个人心中都有自己的哈姆?雷特,对错已经没那么重要。开发属于我们自己的游戏,了解哪个引擎更强大以及什么引擎更适合,才是研究游戏引擎的真正意义所在。

2 那些年我们认识的引擎

关于引擎的第二个争论就是到底用哪个引擎。

从卡马克的时代开始,国外就有了关于游戏引擎的概念。根据游戏需求的不同,游戏厂商要么自己开发引擎,要么购买商业引擎。但真正的商业引擎不但必须有规范的开发流程,以便于定制化,而且要有后续的技术支持来帮助购买引擎的人解决遇到的各种问题,以保障购买者能够实现想要的功能。但能真正实现商业化的引擎也仅有少数几款。

商业引擎数量少,加之每款引擎的授权费用高昂,所以很多团队更愿意自己开发引擎。而几乎每一款知名游戏都有自己的引擎,比如育碧的《刺客信条》、EA的《战地》、科乐美的《实况足球》。但自家的引擎同样需要不断迭代,以保证跟上时代的发展,否则落后的游戏引擎终究会被淘汰。

在国内曾经技术匮乏的那个年代,Gamebryo和Ogre算是最早的两款引擎,Gamebryo是用得最多的商业引擎,Ogre是用得最多的非商业引擎。现如今,除了传统大厂商在自己迭代引擎之外,大部分厂商选择了商业引擎。国内厂商更是如此,在3D游戏引擎的选择上都很明确,手机端用Unity,PC端用Unreal Engine。这些引擎不同于以往特定类型的游戏引擎,它们耦合性很低,通用性更好。那些年风光的引擎如图4所示。

图4 那些年风光的引擎

游戏引擎曾经百花齐放,如今则大局已定。那么自研引擎是否已是明日黄花了呢?

其实这个问题没有明确的答案。如果你的团队有实力,时间相对充足,已经成功开发出游戏,那么迭代自研发当然可以;但如果项目时间紧,要开发的游戏类型与团队已有的引擎类型大相径庭,改动成本高于学习其他商业引擎的成本,那么不妨使用相对成熟的商业引擎。

3 引擎和游戏

这里并不是要讲游戏和引擎的关系,而是讨论开发引擎是否一定要依托于游戏。开发过游戏引擎的人,或多或少地想过这个问题。传统的游戏引擎都是依托游戏一代一代迭代发展起来的。对于游戏企业来讲,最终目的是做出游戏,所以游戏引擎的目标是为专属游戏服务。游戏需要什么特性,引擎就提供什么功能。商业引擎也是如此,如果一款游戏引擎没有支撑过任何成功游戏作品,大家是不敢去用的。毕竟使用游戏引擎的人一般不是专业引擎开发人员,出现问题后很难快速解决底层问题。就连Unreal Engine这样的引擎也要靠自己的《虚幻竞技场》来撑门面。目前,大部分引擎在内部使用,毕竟谁写的谁清楚,出了问题也能第一时间解决。

但是国外游戏引擎的开发氛围要好于国内,游戏引擎技术并没有完全被游戏牵着鼻子走,引擎技术也在反过来逐步推动游戏的发展。游戏引擎的开发者希望能持续地专注于引擎技术的开发,不会因过度依赖游戏而把引擎自身搞得一团糟。

不过到目前为止,还没有哪款引擎是能够满足以下几点要求的真正的万能架构:

  • 适合所有类型的游戏、所有的游戏功能;
  • 可以简单实现游戏设计者想到的各种离奇古怪的想法;
  • 极高的效率——事实证明,优化最好的引擎都是针对游戏本身的。

引擎开发者心目中的理想引擎或者说许多游戏企业的自研引擎目标是:底层维护分离,具有统一的架构,可以通过底层为不同游戏提供不同的支持。为此,引擎技术人员尽最大可能把游戏需要的技术都完好地集成到引擎中,做到一款引擎可以服务多款不同类型的游戏。

然而,理想和现实往往有一定的距离,大部分引擎就是为了一款游戏而生,最根本的原因就是人的成本(这里成本是指技术人员能力、管理者能力、设计游戏能力、招聘、营销等与人的价值有关的东西)。国外Unreal Engine算是做得比较好的,Unreal Engine 3是比较成功的游戏引擎,用它开发的各种类型的游戏有许多,Unreal Engine算是人力成本相对较低的引擎,国外开发人员的经验积累使得他们大多能把控Unreal Engine 3,而国内用Unreal Engine 3则是一败涂地,根本原因在于人的能力差异,很少人能把控它(这里不谈市场因素)。

所以理想引擎的开发不得不依赖游戏。但事无绝对,Unity传奇般地解决了人的问题,传奇般地实现了当时很多大企业都不敢做的事情。

抛开Unity易用性不说,它真正实现了引擎架构的组件化。更重要的是,许多人在为它开发功能,使用终极方式解决人的成本问题。这其实不是一个技术问题,即使有人曾经想过让很多人一起开发引擎,但谁又会想过这会成为现实呢?Unity自己没有耀眼的游戏。现在你几乎可以在网络上找到任何想要的内容,比如体素地形网格化、水流方向映射、反向动力学(Inverse Kinematics,IK)、材质树、技能编辑器,甚至大量的特效、模型、贴图、动画资源,铺天盖地的论坛、教程。Unity只提供底层的基础功能,大部分强大的功能是世界各地的人帮助它完成的,在它自己获益的同时,开发者也在获益。

Unity的出现几乎改变了整个商业引擎的格局,它的开放,它的易用性,它的开发流程,都完全超过当时人们的认知,导致一些设计观念陈旧的商业引擎加速地消亡。有能力转变的也只有Unreal Engine,虽然其庞大的代码库让它不能一下子实现转变,但它以快速的迭代不断追赶。Unity更强大的地方在于扩展,所有人都可以给它定制功能,这逼迫Unreal Engine不得不开源。开源的好处会让更多人关注它,给它定制更多的功能插件,许多问题可以轻松地在互联网上搜索到解决方案,这让它的社区也更加壮大。

本文摘自《游戏引擎原理与实践 卷1 基础框架》

  • 游戏引擎架构设计教程书籍
  • 腾讯游戏引擎设计师基于多年经验和积累的力作
  • 详尽示例,诠释游戏引擎制作与开发技术,Milo等游戏业内知名专家鼎力推荐

本书着重讲解游戏引擎的基础知识和工作原理,并结合配套的游戏引擎示例和详尽的代码,介绍游戏引擎开发的技术细节。

本书是第1 卷,主要涉及游戏引擎基础架构。全书共13 章,分别介绍游戏引擎原理、引擎和引擎编辑器、底层基础架构、数据结构、数学库、引擎初始化、应用程序架构、对象系统、资源管理、引擎设计的哲学理念、场景管理、静态模型导入和LOD 技术。本书未涵盖的游戏引擎话题将在卷2 中讲解。本书适合有一定的游戏开发基础和经验并且想要系统学习游戏引擎原理和引擎开发技术的读者阅读。

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...