虚幻4的C++开发真的编译实在是太慢了,改一点点东西就编译好几分钟,有没有什么办法可以提高编译效率的?

您所在的位置:网站首页 ue4打包exe不能启动 虚幻4的C++开发真的编译实在是太慢了,改一点点东西就编译好几分钟,有没有什么办法可以提高编译效率的?

虚幻4的C++开发真的编译实在是太慢了,改一点点东西就编译好几分钟,有没有什么办法可以提高编译效率的?

2023-03-30 17:58| 来源: 网络整理| 查看: 265

首先,你要搞清楚慢的不是C++,慢的是UE4。本人亲测,VS2019,很普通的C++项目没有什么乱七八糟的套娃宏和套娃模板,C++17以上标准,I9 7900X + SSD,开Unity Build + 多线程,在50W行以内的代码量编译时间会是以秒为单位的。再大一点也充其量是以分钟为单位,现在MSVC在编译方面的努力是真心没得黑。

UE首先最慢的是Shader,这个是毫无征兆的慢,简单来说,同样的Shader功能,自己用裸DX编译器FXC,编译出来的体积单位是K,编译时间是秒甚至分秒,我编译50+个shader pass用了差不多4s-5s左右,我把Unreal自带的常用的4个着色模型,各种来自Unity的和UE的后处理和着色Shader,以及生成Mipmap,完成GPU遮挡剔除和视锥剔除等工作的Compute Shader的编译结果以及这些Shader用到的贴图和Buffer属性以及Render State的序列化,都打包到了同一个文件夹,总共15个文件,其中每个文件可能含有多个Pass和Kernel,这是不压缩的体积:

你在UE里打包Shader,体积和时间都得照着这个百倍以上走,所以我的方案很简单,用几天时间搭建一套自己的Shader编译流程,比如本人用2天半时间写了一个很简单的Win32控制台程序,可以精确编译单个Shader,也可以批处理编译一堆Shader,用到的属性像Unity Shaderlab一样列出来,打包的是纯二进制文件,读取时直接用STL的IO库读取即可,在DX12 API上可以直接打包出ID3DBlob并以此生成PSO,单单这个组件做成DLL给其他任何引擎用也是完全可行的,更何况Unreal完全开源,在资源层和渲染层之间夹杂私货不困难,想在那套人神共愤的毛线团材质上自己引进一套Shader系统,可谓天时地利人和、跨平台编译方面本人实在没什么研究不能强答,不过最近小伙伴 @SaeruHikari 正在做类似的研究,这里坐等一波研究成果。

C++层的慢这个没什么好办法,只能是把一些重逻辑的工作拿出去写成库,再就是换个好点的电脑。。Unreal的增量编译还是聊胜于无的,如果CPU和硬盘稍微给力一点,一般编译时间并不是不可以接受。

编译工具的源码在这了,代码量比较小,原理也很简单,非常容易理解:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3