Urho3D资源

资源包括Urho3D中在初始化或运行时从海量存储加载的大部分内容:

  • Animation
  • Image
  • Model
  • Material
  • ParticleEffect
  • ScriptFile
  • Shader
  • Sound
  • Technique
  • Texture2D
  • Texture2DArray
  • Texture3D
  • TextureCube
  • XMLFile
  • JSONFile

它们由ResourceCache子系统管理和加载。与所有其他类型化对象一样,资源类型由32位类型名称散列(C++)或类型名称(脚本)标识。必须为每个资源类型注册对象工厂。
资源本身由其文件路径(相对于注册的资源目录或包文件)标识。默认情况下,引擎注册资源目录Data和CoreData,或包Data.pak和CoreData.pak(如果存在)。
如果加载资源失败,将记录错误并返回空指针。
从缓存请求资源的典型C++示例,在本例中,是UI元素的纹理。请注意,使用方便模板参数来指定资源类型,而不是使用类型哈希。
  healthBar->SetTexture(GetSubsystem<ResourceCache>()->GetResource<Texture2D>("Textures/HealthBarBorder.png"));
脚本中的相同内容如下(注意使用属性而不是setter函数):
  healthBar.texture = cache.GetResource("Texture2D", "Textures/HealthBarBorder.png");
还可以手动创建资源并将其存储到资源缓存中,就像从磁盘加载资源一样。
可以按资源类型设置内存预算:如果资源消耗的内存超过允许的数量,则如果不再使用,最旧的资源将从缓存中删除。默认情况下,内存预算设置为无限。

资源的后台加载

通常,当使用GetResource()请求资源时,它们会立即加载到主线程中,这可能需要几毫秒才能完成所有所需的步骤(从磁盘加载文件、解析数据、必要时上传到GPU),因此会导致帧速率下降。
如果事先知道需要什么资源,可以通过调用BackgroundLoadResource()请求在后台线程中加载这些资源。加载完成后,将发送事件E_RESOURCEBACKGROUNDLOADED;它会告诉你加载是成功还是失败。根据资源的不同,只有加载过程的一部分可以移动到后台线程,例如,完成GPU上载步骤总是需要在主线程中进行。请注意,如果为排队等待后台加载的资源调用GetResource(),则主线程将暂停,直到其加载完成。

异步场景加载功能LoadAsync()、LoadAsyncJSON()和LoadAsyncXML()具有在继续加载场景内容之前先后台加载资源的选项。通过指定load_resources_only模式,它还可以用于仅加载资源而不修改场景。这允许为快速实例化准备场景或对象预制文件。
最后,可以配置每帧完成后台加载资源所花费的最大时间(以毫秒为单位),请参阅SetFinishBackgroundResourcesMs()。

实现后台加载

  在编写新的资源类型时,后台加载机制需要实现两个函数:BeginLoad()和EndLoad()。BeginLoad()可能在后台线程中调用,并且应该在不违反多线程规则的情况下尽可能多地执行工作(如文件I/O)。EndLoad()应执行主线程完成步骤,例如GPU上载。任一步骤都可以返回false,以指示加载资源失败。
如果一个资源依赖于其他资源,那么为其编写高效的线程加载可能会很困难,因为后台加载时不允许在BeginLoad()中调用GetResource()。有几个选项:允许通过在BeginLoad()内调用BackgroundLoadResource()来对新的后台加载请求进行排队,或者如果所需的资源不需要永久存储在缓存中,并且可以安全地在主线程外加载(例如,Image或XMLFile,它们不具有任何GPU端数据),则可以在BeginLoad内调用GetTempResource()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乘小舟舟,游大世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值