中年|Oculus优化减少UE4开发迭代时间


开发者迭代时间是一个主要的痛点 , 而Oculus针对这一情况对Unity的迭代时间进行了优化 , 并且正在努力减少UE4的迭代时间 。
1. 迭代代码时跳过APK版本
运行Gradle并生成更新的APK可能是一个耗时过程 。 当迭代代码改动时 , 这意味着用户需要等待代码编译和链接 , 然后再等待APK打包 。 Oculus的优化允许用户在迭代代码更改时绕过APK的重新打包 。
1.1 工作原理
现在你需要重新构建APK并包含更新的编译二进制文件 , Oculus对Oculus OS进行了更改 , 当在包设置中设置特殊flag并且应用程序可调试 , 如果存在相关名称的文件 , 库可以自动从应用程序的dataDir加载 , 而不是从已安装的包中加载 。
1.2 支持UE4
你可以依次通过Editor Preferences &gt General &gt Experimental找到这个选项 。
中年|Oculus优化减少UE4开发迭代时间
本文插图

另外 , 当在Android项目设置中启用Oculus设备时 , 你可以在Launch下拉菜单中找到这个选项 。
注意 , 这个选项绕过了正常的Android APK版本逻辑 。 如果你的更改需要生成新APK , 如Java更改或Android manifest更改 , 则需要临时禁用这个选项 。
1.3 支持原生开发
1.3.1 要求
元数据需要添加到Android manifest中 , 从而允许应用程序从dataDir加载库:

meta-data android:name=”com.oculus.extlib” android:value=http://news.hoteastday.com/a/”true”
另外 , 安装的APK包必须是可调试 。
这只是为了开发目的 。 Oculus Store将不接受启用这个flag的任何应用程序 。
1.3.2 使用说明
【中年|Oculus优化减少UE4开发迭代时间】如果你的APK包含一个名为libName的本地库 , 而你希望在不重新打包和重新安装整个APK的情况下对其进行修改 , 请参照以下步骤:
构建一个满足上述要求的APK并安装它编译代码和链接二进制文件可选地从二进制文件中剥离调试符号以减小文件大小(减少推送到设备的时间):llvm-strip –strip-debug -o lib-stripped.so lib.so停止运行应用程序:adb shell am force-stop [package_name]将lib推送到设备:adb push lib.so /sdcard/Oculus/Temp/lib.so复制到lib加载路径:adb shell run-as [package_name] cp /sdcard/Oculus/Temp/lib.so ./lib.so设置可执行flag:adb shell run-as [package_name] chmod +x ./lib.so启动应用程序
请注意 , 完成迭代后 , 在安装新的APK之前需要删除dataDir中的任何库 , 或者可以从dataDir加载旧库 , 而不是从包中加载 。 你可以通过首先使用adb uninstall[package\u name]卸载包或手动删除任何库 , 并通过adb shell run-as [package_name] rm *.so来自动完成 。
1.3.3 结果

测试是使用UE4提供的VR Template进行 。 平均来说 , 在不需要时绕过APK版本可以节省129秒 , 在启动时间方面提高了2.95倍 。
中年|Oculus优化减少UE4开发迭代时间
本文插图

2. 对UE4代码编译的FASTBuild支持
Oculus使用FASTBuild添加了对分布式代码编译的支持 。 FASTBuild是一种开放源代码构建系统 , 可促进类似于Incredibuild、distcc或SN-DBS的分布式工作 。 当可以利用远程计算资源时 , FASTBuild有助于大大加快大型代码的编译速度 。
MSVC和clang工具链目前都支持使用FASTBuild进行分布式编译 , 所以你可以用来编译Unreal Editor和任何Oculus VR游戏项目 。
2.1 要求
可通过端口31264进行远程工作的其他Windows计算机 。 Windows计算机应该在本地网络或通过VPN可用 , 因为FASTBuild的网络传输未加密 , 不应通过不安全的网络发送 。
请注意 , FASTBuild端口不应公开到公共网络 , 因为任何可以连接到它的人都可以运行任意命令 , 而这可能会带来安全性风险 。
2.2 使用说明

下载FASTBuild并以%PATH%将二进制文件解压缩到文件夹中 。 在远程windows计算机运行FBuildWorker.exe. 系统可能会提示你允许它通过Windows防火墙 。 打开后 , 你可以调整idle设置和要使用的cpu内核数 。 如FASTBUILD Network Distribution文档所述 , 通过FASTBUILD_BROKERAGE_PATH环境变量设置worker discovery 。 如果网络共享不可用 , 可以改为在FASTBUILD_workers环境变量中硬编码remote worker主机名或IP地址 , 用分号分隔 。 如果两者都可用 , 在UE4中Incredibuild优于FASTBuild , 所以你可能需要卸载前者才能使用FASTBuild 。 如果distribution不能正常工作 , 你可以使用FASTBuild的故障排除文档 。 如果需要 , 你可以使用另一个开源项目FASTBuild Dashboard来可视化版本 。
支持平台的代码编译现在应该能够生成FASTBuild配置文件 , 并将任务分发到remote worker 。
2.3 实现细节
这个实现基于开源项目Unreal_FASTBuild , 并经修改以用于更新的MSVC工具链和支持clang 。

现在会处理Unreal编译操作并确定要为FASTBuild生成的正确编译器工具链 , 并重写任何命令行参数以匹配FASTBuild要求 。 所有未编译的操作将在本地机器运行 , 如生成预编译的头文件 , 链接库 , 或生成最终的二进制文件 。 所述操作非常复杂 , 难以一般性支持转换为FASTBuild格式 , 并且无法从distribution或缓存中获益 。 由于FASTBuild不支持一个操作的多个输出 , 所以只有在生成过程完成后才能从FASTBuild报告文件中收集编译依赖项信息 , 这意味着如果在过程中取消生成 , 则不会保存相关结果 。
另外 , FASTBuild内置了对代码编译的缓存支持 , 如果所有输入都匹配完整的文件路径和chesksum , 则可以从缓存中检索对象文件 。 请注意 , 由于需要预处理所有编译单元以收集输入文件 , 所以不建议启用FASTBuild编译 , 除非至少有一个remote worker已启用 。
2.4 结果
测试在IntelXeon W-2135处理器(3.70Ghz 12线程)运行 。 计时包括所有预处理、预编译头文件生成、代码编译和链接 。


    推荐阅读