资源管理¶
在 Kanzi 中,资源是可以在应用程序的不同部分重用的项目。例如,Mesh Data 资源定义了 Model 节点的几何形状,您可以在不同的节点中使用相同的 Color Brush 来设置 Foreground Brush 或 Background Brush 属性。
Kanzi Resource Manager 使您能够在应用程序中组织和重用资源。
为节点设置资源¶
在 Kanzi 中,您可以直接使用资源 URL 或间接使用资源键将资源设置到节点。默认情况下,当您在 Kanzi Studio 中设置资源时,它会使用 URL 分配所有资源。如果您想在 Kanzi Studio 中使用间接设置,您需要在资源字典中为资源创建一个键,并在属性中选择该键。由于键查找是分层的,您可以通过在树中创建资源字典条目来定义键的解析方式。
使用资源键设置资源,您可以:
|
|
|
||
创建并应用不同的皮肤或主题来更改应用程序的外观。 |
创建不同版本的应用程序以适用于不同的语言和地区。 |
重写资源以模块化内容。 |
您可以共享资源以减少应用程序的内存和运行时需求。这使您能够重用相同的资源,或更改资源以便更改反映在整个应用程序中。例如,这样您可以共享一个动画画笔。
Kanzi 提供了许多工具来管理应用程序运行时的资源。在 Kanzi 中,您可以:
使用多个线程加载资源,以使用您设备中的多个核心并加快应用程序的启动或加载速度。请参阅 并行加载资源。
异步加载资源以提高应用程序的启动或响应速度。请参阅 异步加载节点预设资源。
从设备存储中选择图像。请参阅 从文件系统加载图像。
本地化您的应用程序。请参阅 本地化应用程序 和 教程:本地化您的应用程序。
创建并应用主题以更改应用程序的外观。请参阅 为您的应用程序设置主题。
找出资源是否正在使用,并卸载未使用的资源。这使您能够创建复杂的应用程序,其中并非所有资源都能同时放入内存。请参阅 设置 Kanzi Engine 如何处理未使用的资源。
Kanzi 资源类型¶
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
|||||||||
|
将资源资产导入到工程中¶
您可以直接在 Kanzi Studio 中创建一些资源(例如,画笔和动画)。对于某些资源,您必须导入在第三方工具中创建的资产(例如,纹理和网格)。请参阅 导入。
资源 URL¶
引用资源的最基本方式是使用 URL。URL 可以引用 kzb 文件内的资源或设备存储上的文件。当您在属性中设置资源时,需要提供资源的 URL。当您在 Properties 窗口中的 Kanzi Studio 中执行此操作时,Kanzi 会自动为您选择的资源执行此操作。当您使用 API 设置资源属性时,需要手动提供资源的 URL。要在项目中找到资源的 URL,请在 Kanzi Studio 中右键单击资源并选择 Copy .kzb URL。要引用设备存储上的文件,请使用 file:/// URL 格式。
使用 API 时,您可以直接指定资源对象。接受资源对象的节点通常提供一个接受此类对象的方法重载。 例如,要在 Image 节点中设置图像,请使用 Image2D::setImage。
资源字典 (Resource Dictionary)¶
资源字典是每个资源的键值对条目的集合。您可以在任何节点中定义资源字典。键提供了间接指定资源的方法:您可以指定一个键,而不是指定资源或节点的 URL。Kanzi 通过查找最近的资源字典动态解析资源,其中键定义了解析到哪个资源。当需要将键解析为项目时,解析过程从使用该键的节点开始检查资源字典:如果该节点的字典包含该键,则节点使用该键;如果不包含,则节点检查其父节点的字典,直到找到该键。此过程递归进行,直到节点树的根。如果节点未找到该键,则由节点决定接下来会发生什么。例如,如果一个 Image 节点不显示图像,这是一个有效的情况。Kanzi 在未找到资源时控制软失败,但在插件中,由插件的作者定义会发生什么。
默认资源¶
Kanzi 附带默认资源,使您能够更快地创建应用程序。例如,当您创建一个 Scene 时,Kanzi 提供默认渲染通道,当您创建一个 Text Block 或一个 Text Box 节点时,Kanzi 提供默认字体。如果您需要自定义默认的 Kanzi 资源,请创建或导入符合您需求的资源,并使用它们代替 Kanzi 默认资源。
当您从您的 Kanzi Studio 项目创建一个 kzb 文件时,默认的 Kanzi 资源默认包含在 kzb 文件中。
Resource manager¶
Resource Manager 管理资源的生命周期、加载和卸载。您可以使用 Kanzi API 访问 Resource Manager,并可以使用它来指定资源的生命周期策略以及移除未使用的资源。要指定资源是始终保留在内存中,还是在不需要时卸载,您需要指定一个策略。您可以为 Resource Manager 全局指定一个策略,或者为每个资源指定一个策略。如果策略是将资源保留在内存中,您可以根据应用程序的逻辑请求手动移除。例如,当您在应用程序中更改一个 Page 节点以加载大量资源到一个新的 Page 节点时,您可以手动移除资源。
Resource Manager 允许您定义在 Kanzi 应用程序中存储 GPU 资源的内存。例如,要在 Library > Materials and Textures > Textures 中为 Kanzi Studio 中的纹理设置此项,请选择一个纹理,并在 Properties 中设置 GPU Memory Type 属性:
GPU Only。资源被部署到 GPU 内存中,并在部署后立即从 RAM 中释放。Kanzi 将资源保留在 GPU 内存中,除非您在应用程序代码中释放它。
GPU and RAM。资源被部署到 GPU 内存中。Kanzi 将资源保存在 GPU 和 RAM 内存中,并根据平台和应用程序管理资源。Kanzi 自动管理资源的卸载。与仅使用 GPU 相比,这会消耗更多的 RAM,但在例如 Android 上提供更快的恢复时间。
RAM Only。资源仅在应用程序代码中指示时才部署到 GPU。Kanzi 将资源保留在 GPU 内存中,并在您在应用程序代码中释放它时卸载。
暂停和恢复¶
当您的 Kanzi 应用程序处于暂停状态 (MainLoopState::Paused) 时:
在 Android 上,默认情况下,不存储在 kzb 文件中的 GPU 资源会失效。如果您的应用程序使用自定义资源且不从 kzb 文件加载,请确保在需要时手动重新加载和重新部署这些资源。Kanzi 会自动恢复所有其他资源。
在其他平台上,Kanzi 默认情况下不会使 GPU 资源失效。
您可以在应用程序配置中设置当应用程序处于暂停状态时如何处理 GPU 资源。在 应用程序配置参考 中,请参阅 处理GPU资源。