Files
XCEngine/docs/api/XCEngine/Components/MeshRendererComponent/Deserialize.md

2.3 KiB
Raw Blame History

MeshRendererComponent::Deserialize

反序列化材质槽和渲染标志。

void Deserialize(std::istream& is) override;

当前实现行为

当前实现会先:

  1. 调用 ClearMaterials()
  2. 把默认值重置为:
    • castShadows = true
    • receiveShadows = true
    • renderLayer = 0

然后只解析:

  • materialPaths=<path0|path1|...>
  • materialRefs=<guid,localId,resourceType|...>
  • castShadows
  • receiveShadows
  • renderLayer

恢复顺序

1. 某槽位 materialRef 有效

这是当前项目材质恢复的主路径。

当前会先保存 m_materialRefs[i] = pendingMaterialRefs[i],然后分两种情况:

  • ResourceManager::IsDeferredSceneLoadEnabled() 为真
    • 先尝试 TryResolveAssetPath(materialRef, resolvedPath)
    • 成功时只恢复 m_materialPaths[i] = resolvedPath
    • 不立即同步加载材质
  • 若不在 deferred 模式,或 deferred 下未成功解析路径
    • 直接 Load<Material>(pendingMaterialRef)
    • 成功时从句柄反写 m_materialPaths[i]

2. 某槽位 materialRef 无效

这时只剩路径回退分支:

  • m_materialPaths[i] 不是 virtual scheme当前会直接清空该路径
  • 若是 virtual scheme 且处于 deferred 模式,则只保留路径
  • 若是 virtual scheme 且不在 deferred 模式,则调用 SetMaterialPath 走同步加载

已删除的旧心智

这页当前必须明确:

  • 不再读取历史 materials=
  • 不再把“没有 AssetRef 的普通项目路径”当作正式项目材质恢复协议

因此像下面这种旧式数据:

materialPaths=Assets/runtime.material;materialRefs=;

当前恢复后,这个普通路径会被清掉,而不是继续被保留。

与 deferred scene load 的关系

在 deferred 模式下,反序列化阶段通常只恢复:

  • m_materialRefs
  • m_materialPaths

真正材质句柄的兑现,往往留到后续:

这些访问器第一次被调用时,内部才会启动或收口异步材质加载。

相关文档