《黑神话》是什么编程语言开发的?居然不是C++!

因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享

点击关注#互联网架构师公众号,领取架构师全套资料 都在这里233ee1ea7ce001e5375172a5755576b2.png

0、2T架构师学习资料干货分

上一篇:2T架构师学习资料干货分享

大家好,我是互联网架构师!

93da121cc18b31ad06fff09f3eba1bf9.jpeg

最近看到很多人讨论这个,也有一些分析的文章,但是我认为最靠谱的还是来自知乎的一篇分析, 作者把黑神话逆向,解包之后,得出的结论是:

黑神话的脚本方案是魔改的USharp,自己实现了mono/clr/il2cpp的运行模式,且支持全平台(PC/Mac/Linux/Android/iOS/PS5/XBox)。

以下是原文内容:

地址:https://zhuanlan.zhihu.com/p/715690420

作者:John

前言

《黑神话:悟空》上线了,第一时间下载体验了一下。然后很好奇他们用的是什么脚本方案,因为大型UE项目绝不可能纯C++开发,所以解包看了一下,也发现一点有意思的东西。

89ef5b1a0bec42fdc714c738ded16425.jpeg

黑神话文件目录

其实上线之前,他们官方就发了一个免费的测试工具,实际上这个测试工具是包含完整的代码的,只是剔除了大部分游戏资源。因为项目组不可能有精力从头搞一个新工程来做测试工具,剔除资源比剔除代码容易一万倍,程序员应该都懂。

引擎版本

首先是引擎版本,大家都知道他们一开始是UE4,UE5首发之后他们就切换到UE5了,所以引擎版本是UE5.0.0。之后虽然Epic发布了更新的UE5.0.3等版本,但是项目组一般不会轻易升级的。可能只是移植一些需要的代码过来,毕竟换引擎的话,以前的大量魔改不好迁移。

c191101fc09b6959f29792051c2344f6.jpeg

游戏入口exe

代码段大小

有一点值得注意的是,exe的大小达到了859MB,这个代码段大小不太正常。参考同样是UE开发的游戏,三角洲行动端游140MB,极品飞车集结端游105MB。感觉可能是包含了太多没用的插件代码或者没剔除一些不必要的符号?

脚本方案

在查看代码符号时,我发现了大量V8的字段,所以理所当然的以为竟然用了PuerTS,觉得项目组还挺跟随潮流。但是却搜不到PuerTS相关的符号,转而搜索js,发现代码中包含了Unreal.js插件。

35df635c737a5d507ab9929c0c408522.jpeg

62369c26867d2cd2fe67e12b04102062.jpeg

Unreal.js是一个N年前的插件,一直没维护,去年才加了UE5的支持。看起来黑神话对这个插件做了些修改。

就这样,我以为用的是Unreal.js,直到开始解包pak才发现并没有这么简单。

Pak解包

解包UE的Pak,一般要知道对应版本的引擎和AESKey,因为每个版本PakInfo结构不太一样。这里不太适合公开细节,略过。

直接说结果,我发现Pak中找不到类似js、ts、wasm的代码文件,所以可能他们继承了这个插件但是没有用。也可能是用其他方式存储了。

但是翻Pak文件我发现大量存在的两种二进制文件,.data.Data。小写开头的像是配置文件,大写开头的像是某种代码的二进制文件。

如下 .data 文件,就是物品的配置,看起来包含了物品的蓝图路径和其他配置内容,是类似protobuf的结构(因为存储的目录名是PBTable,在游戏行业使用PB存储配置是很常用的方式):

783e4c0c30b1bedeef66db7cea0cf2c0.jpeg

.data

如下.Data 文件看起来 就像是某种代码的二进制,但按我的经验js或者ts应该不是这样,倒像是一种自定义的状态机的样子(根据后续分析,确实是一种用于策划编辑的自定义蓝图结构):

c32f36bb2834d33c3ac69e879cccea16.jpeg

.Data

这就奇怪了,没有js代码,也没有找到类似luac的代码,但是既然有类似二进制的代码,那么是不是用了C#相关方案呢?比如USharp、UnrealCLR、UnrealSharp,直接在代码符号中搜索相关字符串果然找到了USharp,并且Pak中也有USharp.uplugin文件,所以可以确定用了USharp。

11808d945c5389647dcff57b904c070f.jpeg

SharpClass

上图可以看到蓝图节点中大量使用了SharpClass,也就是USharp的自定义UBlueprintGeneratedClass,用于运行时将C#中的自定义UClass动态生成UE的类型。

9f897526ab2dd7901739423f8135436f.jpeg

USharp.uplugin

但是,貌似没这么简单,因为USharp不支持UE5,并且不支持主机和移动端,但是黑神话包内的uplugin文件包含了这些平台。我想黑神话官方对USharp进行了大量的魔改和兼容。

但到这里我还是没搞清楚黑神话到底用了什么脚本方案,因为Pak中并没有找到js、lua或者USharp的dll文件。可是明明代码中用了Unreal.js和USharp插件。

别着急,继续往下看。

il2cpp

提到il2cpp,Unity开发者们都很熟悉,为了解决mono的兼容性和性能等问题推出的方案。

但是这是Unity专属的,跟黑神话有什么关系?在查看USharp相关符号时,我发现一个令人震惊的事实,黑神话所使用的USharp和原版并不一样,提供了USharp运行模式的切换,其中包含了主流的mono、clr,以及il2cpp!

bb6e1e28e1b6c48afcba1674cbb20843.jpeg

il2cpp

这些模式与设置都是原版USharp并不包含的内容,也就是说,项目组为了兼容性和性能做了大量优化和魔改,完全可以说基于USharp重新开发了一个C#的脚本方案,支持mono、clr和il2cpp。

那么既然Pak中没包含dll或者脚本,显然在Release版本中他们使用了il2cpp,所以,C#中定义的类型和各种符号都跑到了C++中,也就是最终的exe里面。这也是导致exe如此大的根本原因。

根据评论区的补充,黑神话的代码符号中除了il2cpp,还包含了Mono和UnityEngine的部分等dll,可以确定同时使用了Mono和Unity il2cpp的代码,但具体使用了哪种方式还没法确定。

d4b8caed7a472a77f2f33a7fb7cf3ca0.jpeg

C#符号

实际上如果打包成dll,可能只有几十MB,exe可以降到100MB,不过性能会略有损失。

总结

总结一下,黑神话的脚本方案是魔改的USharp,自己实现了mono/clr/il2cpp的运行模式,且支持全平台(PC/Mac/Linux/Android/iOS/PS5/XBox)。

此外,代码集成了Unreal.js但是貌似没用到,还使用了自研的某种状态机/行为树,配置表使用的是protobuf结构的二进制数据。

—  —

如喜欢本文,请点击右上角,把文章分享到朋友圈

1、2T架构师学习资料干货分享

2、10000+TB 资源,阿里云盘,牛逼!!

3、基本涵盖了Spring所有核心知识点总结

4、阿里员工:内推一个38岁研发,连简历都没评估过,这年龄找工作太难了,仿佛看到未来的自己

  · END ·

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描上方二维码关注一下,您的支持是我坚持写作最大的动力。

求一键三连点赞、转发、在看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值