Games104笔记---LE2--基础架构1:引擎架构分层整体Pipeline

目录

游戏引擎分层:

游戏引擎自身【五层架构】:

为什么要分层呢?

工具层:

核心功能:

功能层:

功能层的功能:

这里笔记作者举例Unity的循环:

资源层:

资源转换成资产:

这里笔记作者举例Unity的资产导入:

Unity导入资源工作流

核心层:

核心功能:

这里笔记作者举例UE核心层的循环:

平台层:

核心功能:

Mini Engine -Pilot

学习资料:


笔记导航:

LE7--渲染系统4:渲染管线,后处理:https://blog.csdn.net/m0_56399931/article/details/124790469

LE6--渲染系统3:游戏中的地形/天空/云渲染:LE6--渲染系统3:yo地形/天空/云渲染_This is MX的博客-CSDN博客

LE5--渲染系统2:光照、材质、Shadow:Games104笔记---LE5--渲染系统2:光照、材质、Shadow_This is MX的博客-CSDN博客

LE4--渲染系统1:渲染基础:Games104笔记---LE4--渲染系统1:渲染基础_This is MX的博客-CSDN博客_渲染系统

LE3--基础架构2:数据组织与管理:Games104笔记---LE3--基础架构2:数据组织与管理_This is MX的博客-CSDN博客

LE2--基础架构1:引擎架构分层整体Pipeline:Games104笔记---LE2--基础架构1:引擎架构分层整体Pipeline_This is MX的博客-CSDN博客

LE1--现代游戏引擎导论:Games104笔记---LE1--现代游戏引擎导论_This is MX的博客-CSDN博客

游戏引擎分层:

游戏引擎自身【五层架构】:

工具层--功能层--资源层--核心层--平台层

还有第三方库

为什么要分层呢?

这个其实很好想,主要还是解耦,降低复杂性,让下层独立于上层,便于管理。并且层次之间的调用一般只允许上层调用下层的接口,不允许下层调用上层的接口

工具层:

核心功能:

是更好地让开发者开发游戏,提高生成效率。比如地形编辑器,UI编辑器,Shader编辑器。

这一层还有一个重要的功能就是DCC,让其他软件的资产无损导入我们的引擎,需要做资产导出器,资产导入器

功能层:

功能层的功能:

核心功能是让世界动起来,入手点是tick点(ue:tick ,unity:update)

现代游戏引擎还需要考虑多线程,但是会有依赖关系,所以这种引擎架构其实并不好做,但是肯定是未来趋势

这里笔记作者举例Unity的循环:

资源层:

核心功能是管理资产的生命周期。

资源转换成资产:

通过定义一个元资源文件格式(例如。ast)来统一文件访问。通

过导入预处理来更快地访问资产。

构建一个复合资产文件来引用所有资源。

guid是一个额外的引用保护。

这里笔记作者举例Unity的资产导入:

Unity导入资源工作流

1.Unity 为资源分配唯一 ID。 2.Unity 创建 .meta 文件。 3.Unity 对资源进行处理。

为资源分配唯一 ID

Unity将检测到已添加新文件,向新添加的文件分配唯一ID,ID方便Unity引用资源,而不破坏任何内容

除了分配给资源的唯一 ID 外,.meta 文件还包含您在 Project 窗口中选择资源时在 Inspector 窗口中看到的所有导入设置的值。对于纹理,这包括 Texture Type、Wrap Mode、 Filter Mode 和 Aniso Level 导入设置。

如果更改资源的导入设置,则这些新设置将保存到资源附带的 .meta 文件中。随后,Unity 将根据更新的设置来重新导入资源,并在项目的 Library 文件夹中更新相应导入的“游戏就绪”数据。

创建 .meta 文件

.meta 文件必须与其相关的资源文件位于相同位置,因为它包含该资源的 ID,如果资源丢失其 .meta 文件(例如,如果在 Unity 的 Project 窗口之外移动或重命名该资源,但未更新其 .meta 文件),则对该资源的任何引用都会中断,并且 Unity 会为资源生成新的 .meta 文件。丢失重新生成之后,丧失的引用必须手动将脚本重新分配给游戏对象

对资源进行处理

Unity 读取并处理您添加到 Assets 文件夹的任何文件,将文件内容转换为可直接用于游戏的内部数据。资源文件本身保持不变,内部数据存储在项目的 Library 文件夹中。

核心层:

核心功能:

游戏引擎必须要数学库数学库,并且这个数学库需要有高效率,比如Carmack 计算 1/sqrt(x)。我们常常要考虑SIMD(单指令多数据指令)

游戏引擎有自己的内存管理。首先需要有一个自定义的数据结构和容器,减少产生内存碎片、减少cache miss、进行内存对齐。

并且要求代码质量很好。

这里笔记作者举例UE核心层的循环:

在这四百行的代码(不包含调用的代码)中他做了些什么呢?【参考向往佬的博客】

  • 开启线程和线程钩子心跳。
  • 更新渲染模块可每帧更新的物体(FTickableObjectRenderThread实例)。
  • 分析器(FExternalProfiler)帧同步。
  • 执行控制台的回调接口。
  • 刷新渲染命令(FlushRenderingCommands)。如果未开启单独的渲染线程,会在游戏线程执行渲染指令,随后调用ImmediateFlush确保命令队列提交绘制。在末尾会添加渲染栅栏(FRenderCommandFence)。
  • 触发OnBeginFrame事件。
  • 刷新线程日志。
  • 用GEngine刷新时间和处理最大帧率。
  • 遍历所有WorlContext的当前World,更新World内的场景的PrimitiveSceneInfo。
  • 处理RHI帧开头。
  • 调用所有场景的StartFrame。
  • 处理性能分析和数据统计。
  • 处理渲染线程的每帧任务。
  • 处理世界标尺缩放(WorldToMetersScale)。
  • 更新活动平台的文件。
  • 处理Slate模块输入。
  • GEngine的Tick事件。这个是主要的帧更新,很多逻辑都将在此处理。
  • 处理GShaderCompilingManager的异步编译结果。
  • 处理GDistanceFieldAsyncQueue(距离场异步队列)的异步任务。
  • 并行处理Slate相关的任务逻辑。
  • 处理可复制属性(ReplicatedProperties)。
  • 利用FTaskGraphInterface处理存储于ConcurrentTask的并行任务。
  • 等待渲染队列未解决的渲染任务。
  • 更新AutomationWorker模块。
  • 更新RHI模块。
  • 处理帧计数(GFrameCounter)和总的帧更新时间(TotalTickTime)。
  • 收集需要在下一帧被清理的物体。
  • 处理帧结束同步事件(FFrameEndSync)。
  • 更新Ticker、FThreadManager和GEngine的TickDeferredCommands。
  • 在游戏线程触发OnEndFrame。
  • 在渲染模块触发EndFrame事件。

平台层:

核心功能:

平台层的核心是做平台无关性。

做一层Render Hardware Interface,来让上层的同学在写代码的时候不需要考虑Graphics API的差异

并且需要统一硬件架构。

Mini Engine -Pilot

学习资料:

games104

unity docs

ue 源码

向往佬的博客

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值