乐于分享
好东西不私藏

破案了!你看不懂虚幻Lumen源码的究极原因!

破案了!你看不懂虚幻Lumen源码的究极原因!

在我们通常的认知中,把函数当成一个黑盒,当输入参数确定的时候,输出参数也是确定的

但是,这一切在分析虚幻渲染管线的时候都失效了,这或许就是分析虚幻管线困难的原因,因为你必须要读懂它的代码,你才能把渲染管线复刻出来,否则在分析阶段你都不知道你的代码是否正确。

最简单的情况

下面来举个例子,对于Lumen里的CardPageTile:0,1总共两个,这里为了介绍起来方便所以只放两个出来。多了就复杂了,就完辣。

想象一下现在并发的有两个线程来处理这两个数据,符合要求的条件下这两个数据会被放到待处理的WorkList里,那么即便是每一帧这两个数据都需要被放进WorkList的情况下,由于是并发对这两个Tile进行判断的,所以可能0会被先写入WorkList,也可能是1被先写入WorkList。

这就从微观层面造成了,在FPS程序中,第0帧、第1帧即便处理的是同样的0、1,但是它们被发配到WorkList的时候的顺序可能是不一样的,这就造成了WorkList这个中间结果在不同帧之间不一定完全一样,所以为了检测你自己写的逻辑是否跟虚幻的一样,那么你就需要对WorkList进行整体检测,因为WorkList里得到的数据并不是按照0、1这样的顺序写入的。

稍微复杂一点

CardPageTile只是最小单元,它的尺寸是8×8,所以我们实际从上往下处理的东西是Card、CardPage再然后才是CardPageTile。我这里写小作文的时候是按照逆向的思路去介绍的,完全没管什么原理不原理,自古万物都是先存在再被研究原理,现在的AI是如此,以前的电力系统也是如此,那么我们学习的时候首先会做出来,然后再去看所谓的原理,我认为可能是一种更加快速的学习方式。

所以是不是大佬们故意不给你讲过程,只介绍原理,骗你去点赞的呢?一定是这样的,没错,报警吧!

一个Card里有若干的CardPage,一个CardPage里有若干的CardPageTile,想象一下,从Card层级开始就并发处理了,这就导致了最终你拿到的用于生成画面的数据,完全是个乱的,因为每一步的输出都跟输入的位置(index)没有任何相关性。

更进一步

更进一步的来说,并发也就算了,在这个基础上,为了让硬件跑得更快,内存命中率更高,虚幻还会把线性的数据转成块状数据,这么一顿儿捣腾下来,无数代码就被塞进来了,结果就是:不知道它想干什么。

参考资料

  • • 《游戏引擎开发实践》2025资料片「Lumen教程制作中

后记

  • • 图形学技术冥想群:460926233
  • • 官方微信号:battlefireedu
  • • 官方网站:https://edu.battlefire.cn
  • • B站账号:东汉书院官方频道
Lumen逆向项目源码已经开源到Gitee仓库了!
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 破案了!你看不懂虚幻Lumen源码的究极原因!

评论 抢沙发

4 + 1 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮