游戏构建:Unreal 构建(四):Shader 编译噩梦——玩家为什么每次更新都要等二十分钟?
1、你是不是也见过这个场景? 玩某些 Unreal 游戏的时候,你一定经历过: 更新完游戏,兴奋地双击图标。然后屏幕上弹出一个窗口——「Compiling Shaders: 1 / 23847」。进度条缓慢蠕动,预计剩余时间:20 分钟。 你的表情:😐 为什么每次更新都要编译 Shader?为什么编译 Shader 这么慢?有没有办法不让玩家等...
一个开发出身的DevOps工程师
1、你是不是也见过这个场景? 玩某些 Unreal 游戏的时候,你一定经历过: 更新完游戏,兴奋地双击图标。然后屏幕上弹出一个窗口——「Compiling Shaders: 1 / 23847」。进度条缓慢蠕动,预计剩余时间:20 分钟。 你的表情:😐 为什么每次更新都要编译 Shader?为什么编译 Shader 这么慢?有没有办法不让玩家等...
1、Cook 完了,然后呢? 上一篇文章我们讲完了 Cook——Unreal 把编辑器里的「生资源」烹饪成了目标平台可用的「成品」。 Cook 完成后,你的项目目录下会多出大量的 Cooked 文件。贴图变成了 .utexture2D,模型变成了 .uasset 和 .uexp,Shader 变成了 .ushaderbytecode。这些都是平台原...
1、”Cook”这个名字怎么来的? 在 Unreal 的构建流程中,「Cook」是一个绕不过去的概念。 我一开始很疑惑——为什么要叫「Cook」?难道 Unreal 把资源处理比喻成做菜? 后来发现确实就是这样。Unreal 的工程师觉得,编辑器里的资源是「生食材」,需要经过「烹饪」才能变成各个目标平台可用的「成品」。 这个比喻其实很贴切。 ...
1、两个陌生的缩写 前五篇文章我们聊了 Unity 的构建体系。从 Build 按钮背后的八个阶段,到 AssetBundle 三代接口演进(第 0 代手写 → 第 1 代标记 → 第 2 代 SBP),再到 Addressables 和 IL2CPP 的跨平台方案。 今天开始,我们转战 Unreal。 如果你刚接触 Unreal 的构建,你会很...
1、为什么 C# 需要”转译”? C# 是一个托管语言。你写的 C# 代码编译后得到的不是机器码,而是 IL(Intermediate Language,中间语言)。运行时由 .NET Runtime 或者 Mono Runtime 来解释执行或者 JIT(Just-In-Time)编译执行。 在 PC 上,这毫无问题。Windows 自带了 .N...
1、从 SBP 到 Addressables:两种不同的升级路径 前两篇文章,我们聊了 AssetBundle 的底层接口演进:第 0 代(手工收集+不处理依赖)→ 第 1 代(标记包名 或 AssetBundleBuild[] 代码定义分包,自动依赖)→ SBP(精确增量构建,源码开放)。 SBP 是一条改动最小的升级路径——你只要换了底层打包接...
1、那个让构建时间砍半的东西 上一篇我们讲了 AssetBundle 的两代接口演进——从第 0 代「手写代码收集资源、不自动处理依赖」,到第 1 代的两条路线(标记包名 / AssetBundleBuild[] 代码定义分包)。 虽然第 1 代的 BuildAssetBundles 解决了依赖处理的可靠性问题,但它有两个硬伤。第一,增量构建的效率...
1、没有 AssetBundle 的日子 在讲 AssetBundle 的接口演进之前,先想象一下:如果 Unity 没有资源动态加载机制,游戏怎么做? 答案很简单——把所有资源都放在工程里,构建时全部打进安装包。 这听起来好像也没啥?但你想一个真实手游,场景几十个,角色几十个,每个角色几张贴图、一个模型、好几套动画……光是贴图可能就几百上千张。...
1、一个按钮引发的困惑 刚接触 Unity 构建的时候,我的心态是这样的: 之前用 Java 做了十年开发,构建就是 mvn clean package 或者 ./gradlew build。我知道编译器在干什么——.java 编译成 .class,打包成 .jar,完事。 打开 Unity,看到 File → Build Settings,里面...
1、换了个行业,换了对「构建」的理解 去年我换工作了。 从互联网行业跳到了游戏行业。开发语言从 Java 换成了 C# 和 C++。IDE 从 IntelliJ IDEA 换成了 Rider 和 Visual Studio。 坦白说,技术栈的切换比想象中顺利——毕竟编程语言说到底都是相通的。但有一个东西,让我结结实实地震惊了一下。 构建系统。 ...