UE5 Virtual Asset
UE5 Virtual Asset
Virtual Asset(虚拟资产)把资产的实际负载(payload)从 .uasset 里剥离出来,单独存到 Perforce 等后端,工程里只留引用。好处是减少冗余数据、加快项目加载和运行时效率,让协作流程更灵活。
一个强烈的个人建议:要用就在项目最开始就开。开发中途再回头虚拟化已有资产,会带来一堆不必要的麻烦(后面 Troubleshooting 里几条坑基本都是中途虚拟化踩出来的)。
参考文档:
- https://dev.epicgames.com/documentation/en-us/unreal-engine/overview-of-virtual-assets-in-unreal-engine
- https://dev.epicgames.com/documentation/en-us/unreal-engine/virtual-assets-quickstart-in-unreal-engine
- https://dev.epicgames.com/documentation/en-us/unreal-engine/backend-graphs-for-virtual-assets-in-unreal-engine
自动虚拟化
Virtual Asset 默认是关的。在项目的 DefaultEngine.ini 里加上下面这段就能启用:
[Core.ContentVirtualization]
SystemName=Default
[Core.VirtualizationModule]
BackendGraph=VABackendGraph_Example
[VABackendGraph_Example]
PersistentStorageHierarchy=(Entry=SourceControlCache)
CacheStorageHierarchy=(Entry=DDCCache)
SourceControlCache=(Type=p4SourceControl, DepotRoot=[asset location])
DDCCache=(Type=DDCBackend)
把 [asset location] 换成 Perforce 服务器上你想存虚拟化 payload 的路径(P4 后端地址形如 ssl:<p4-server>:1666),路径要用引号括起来。
启用后,之后新上传的资产默认会被转成虚拟资产。要确认是否成功虚拟化,在编辑器里看文件状态即可。
手动虚拟化
如果想手动虚拟化一批已有资产,可以用 UE5 自带的 UnrealVirtualizationTool.exe。这个工具需要自己编译。编译完后用下面的命令行手动虚拟化:
...\Engine\Binaries\Win64\UnrealVirtualizationTool.exe -ClientSpecName=[Workspace Name] -Mode=Changelist -Changelist=[Changelist Number]
# 示例
D:\Test_VirtualAssets\Engine\Binaries\Win64\UnrealVirtualizationTool.exe -ClientSpecName=<workspace> -Mode=Changelist -Changelist=17
执行成功后,日志会显示一系列 hash 子目录被自动上传到分支,里面是虚拟化资产打散后的 .upayload 文件。
Troubleshooting
下面几条都是实际踩过的坑。
手动虚拟化已有资产前先 check out 再 resave。 官方推荐:手动虚拟化之前,把所有要虚拟化的资产 check out 出来重新保存一遍,尤其是那种早期保存、格式较旧的资产,不重存容易出问题。
报错
not find payload_metainfo.txt。 往 P4 分支里上传一个空的payload_metainfo.txt文件即可。参考:https://dev.epicgames.com/documentation/en-us/unreal-engine/backend-graphs-for-virtual-assets-in-unreal-engine报错
'partitioned' client type has not been configured for this server。 完整报错大致是:Error in client specification. 'partitioned' client type has not been configured for this server. Storage location 'client.readonly.dir' needs to be set by the administrator. Failed to create temp workspace 'VASubmission-...' to use for payload submission Failed to push payload(s) to any backend Virtualization process failed with the following errors: Failed to push payloads需要找 IT / P4 管理员在 Perforce 后端服务器上开这个设置:
p4 configure set client.readonly.dir=/opt/perforce/servers/master/root/readonly验证方法:如果能成功创建上面那种类型的 workspace,说明问题解决了。
工具创建出 non-stream workspace 挡路。 在
[VABackendGraph]配置的SourceControlCache值里加上ClientStream指定 stream。参考:https://forums.unrealengine.com/t/asset-virtualization-how-and-when-an-asset-can-be-virtualized/840098虚拟化后 hash 目录全堆在分支根目录,和工程目录混在一起。 这个问题改 ini 设置当时没解决,后来在 UDN 上找到两个方案,都实测可行。
方案一,建一个 non-stream 的 P4 depot 专门存 payload,然后把 ini 里的
DepotRoot改成这个 depot 路径(需要上传payload_metainfo.txt):[Core.ContentVirtualization] SystemName=Default [Core.VirtualizationModule] BackendGraph=VABackendGraph_Example [VABackendGraph_Example] PersistentStorageHierarchy=(Entry=SourceControlCache) CacheStorageHierarchy=(Entry=DDCCache) SourceControlCache=(Type=p4SourceControl, DepotRoot="//VAData/VirtualData/") DDCCache=(Type=DDCBackend) MinPayloadLength=0 EnablePayloadVirtualization=true EnableCacheOnPull=true EnableCacheOnPush=true方案二,建一个 virtual stream 分支来控制文件实际提交的位置:
[Core.ContentVirtualization] SystemName=Default [Core.VirtualizationModule] BackendGraph=VABackendGraph_Example [VABackendGraph_Example] PersistentStorageHierarchy=(Entry=SourceControlCache) CacheStorageHierarchy=(Entry=DDCCache) SourceControlCache=(Type=p4SourceControl, DepotRoot="//UEtest/main/",ClientStream="//UEtest/VAdata_test",UsePartitionedClient=true) DDCCache=(Type=DDCBackend) MinPayloadLength=0 EnablePayloadVirtualization=true EnableCacheOnPull=true EnableCacheOnPush=true