GAMES104实录 | 引擎架构分层(中)

本期为GAMES104《现代游戏引擎:从入门到实践》视频公开课文字实录第5期。本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发。

课程共计22个课时,将介绍现代游戏引擎所涉及的系统架构,技术点,引擎系统相关的知识。为配合学习实践,课程组在 GitHub 上开源了小引擎Piccolo,上线1个月即获得了2900+star, 累计下载量已超过20000+。

以下内容为公开课视频转文字版本,为阅读通顺,有删减

引言

上节我们讲了游戏引擎的五层架构,这节课会真正给大家讲清楚现代游戏引擎的五层架构到底是什么,具体是怎么做的。

GAMES104实录 | 引擎架构分层(上)

学一个东西最好的方式是什么?是练习它。我们给小明同学出了一道难题:学了上节课,你觉得已经懂了游戏引擎怎么做,那就做个小小的挑战吧:在游戏中做一个可以动起来的角色,然后从下往上把这些代码写到游戏里面去。

小明想,既然知道了引擎的五层架构,我就要去想每一个功能模块到底怎么写。这其实是一个非常有意思的脑力劳动,同学们可以先停一下,回顾一下我们讲的游戏引擎的五层架构:平台层、核心层、资源层、功能层和工具层。

如果小明想做一个可以动起来的角色,在游戏引擎中的代码该怎么去写呢?这件事情比大家想象的稍微复杂一点。

在这一讲中,我会跟大家讲每一层是什么以及每一层的要点是什么。

我们就从小明的挑战“做一个动起来的角色”开始,逐步带领大家进入引擎的深水区航行。

01「资源层」

从资源(resource)到资产

首先,小明遇到的第一个挑战:好不容易求做美术的好朋友用3DMax做了一个很可爱的小角色,还做了很多的贴图和动画。那这些东西叫什么?叫resource,资源。

每一个数据的格式都是不一样的,有的是Max文件,有的是PSD文件,这些数据肯定不可能在引擎中一一打开。大家想想看,如果写个小软件,要加载个声音,我要去问你声音是什么格式?MP3还是WMV?但在游戏引擎那么复杂的环境里面,不可能去读这么多复杂的数据格式。

比如像PSD、Max、Maya这些数据格式,它们工具做得非常复杂,这些数据如果直接在游戏引擎中加载,效率会非常低。所以会做一步转换,会把这些数据全部转换成引擎的高效数据,这个转换发生之后,我们就把它叫做Asset(资产)。

从资源(resource)到资产,有一个很大的不同是什么呢?

举一个简单的例子,如果是一张贴图,无论是JPG还是PNG,它里面有很多的压缩算法,如果在GPU中

要找到与游戏相关的编号为 104 的内容,可能需要进一步澄清该编号的具体含义。以下是基于已知引用和专业知识的回答: ### 游戏版本控制中的资产编号 在 Unreal Engine 中,资产和包的版本管理是一个重要主题[^1]。如果提到的游戏编号(ID 或 version 104)是指某个特定资源或包的版本号,则可以推测这可能是通过引擎内部的版本控制系统定义的一个具体版本。Unreal Engine 提供了一种机制来跟踪资产的变化历史以及不同版本之间的差异。 然而,在实际开发过程中,“104”也可能表示某种自定义数据结构或者外部数据库条目的一部分。例如,某些开发者可能会使用整数作为唯一标识符来区分不同的关卡、角色模型或其他类型的可玩内容。 ### 关于DirectX 11编程环境配置注意事项 对于希望运行《Introduction to 3D Game Programming with DirectX 11》一书中示例程序的人士来说,需要注意的是原作者编写这些代码时所依赖的一些API已经过时。特别是涉及到纹理加载函数`D3DX11CreateShaderResourceViewFromFile`的部分,由于微软停止更新其旧版SDK组件如June 2010 DirectX SDK,因此建议采用更现代的方法替代原有调用方式][^[^23]。 一种推荐的做法是从DDS文件读取像素数据并手动创建SRV对象,如下所示: ```cpp #include <DDSTextureLoader.h> // 加载DDS格式图片到GPU内存中 Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> CreateTextureAndViews(ID3D11Device* device, const std::wstring& filename){ Microsoft::WRL::ComPtr<ID3D11Resource> texture; Microsoft::WRL::ComPtr<ID3D11ShaderResourceView> srv; HRESULT hr = DirectX::CreateDDSTextureFromFile(device,filename.c_str(),texture.GetAddressOf(),srv.GetAddressOf()); if(FAILED(hr)){ throw std::runtime_error("Failed to load texture"); } return srv; } ``` 此方法不仅解决了因缺少必要库而导致无法编译的问题,还提高了项目的长期维护价值。 ### 总结 如果没有更多上下文信息表明确切指向哪个平台上的哪款作品的话,“Game With ID Or Version 104”的查询结果难以精确给出。不过上述讨论涵盖了两种可能性——要么是在UE项目里边按照官方文档操作过的特殊修订本;要么就是针对某一本教程书籍实例改编后的产物之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值