Kanzi 3.9.6 迁移指南

使用此迁移指南将 Kanzi 应用程序从 Kanzi 3.9.5 更新到 Kanzi 3.9.6。

对 kanzi::variant 的更改

将 kanzi::variant 的 C++ typedef 从 boost::variant 更改为 boost::variant2。

boost::variant2 使用与 C++17 std::variant 相同的 API,但这与之前使用的 boost::variant API 不同。

例如,要迁移您的 Kanzi 应用程序:

  • 将 v.which() 替换为 v.index()。

  • 将 v.type() == typeid(T) 替换为 holds_alternative<T>(v)。

  • 从所有访问者类中移除 boost::static_visitor 的派生。

  • 将 v.apply_visitor(visitor) 和 apply_visitor(visitor, v) 替换为 visit(visitor, v)。

对头文件的更改

Kanzi Engine 现在使用更多的前向声明,并且不再在头文件 domain.hpp 和 metaclass.hpp 中包含不必要的 include。要迁移您的 Kanzi 应用程序,请包含缺失的头文件。

例如,以前可以使用 kanzi::TaskDispatcher 和 kanzi::ResourceDictionary 与

#include <kanzi/core.ui/domain/domain.hpp>

但现在您需要使用

#include <kanzi/core.ui/domain/domain.hpp>
#include <kanzi/core.ui/task_dispatcher/task_dispatcher.hpp>
#include <kanzi/core.ui/resource/resource_dictionary.hpp>

对 CMake 配置文件的更改

Cotire CMake 模块在 Kanzi 工作区中不再可用。如果您想继续使用该模块,可以从 https://github.com/sakra/cotire 或之前的 Kanzi 版本中获取。然而,我们建议您迁移您的 CMake 配置文件,以使用 CMake 3.16 版本开始提供的内置功能 target_precompile_headers。

Kanzi Java API 自定义 Resource Manager 协议的更改。

使用 Kanzi Java API 自定义 Resource Manager 协议时,资源现在位于 ObjectRef 实例之后,而不是使用非拥有的 Resource 引用。这确保了在资源仍在加载时,创建对象的生命周期不会被 JVM 垃圾收集器回收。

当实现同步加载时,ResourceManager.ProtocolHandler.Result 构造函数已更改为接受 ObjectRef<? extends Resource> 而不是简单的 Resource。更改使用此构造函数的代码以提供一个拥有的 ObjectRef 实例。

Kanzi 3.9.5

Kanzi 3.9.6

public Result(Resource resource)

public <TResultType extends Resource> Result(ObjectRef<TResultType> resource)

实现异步加载时,ResourceManager.LoadTask.getResult() 方法现在返回 ObjectRef<? extendes Resource>,而不是简单的 Resource。通常,LoadTask 实例在创建资源时就已能访问 ObjectRef。要使用该资源,请使用 clone() 方法返回该内部 ObjectRef 实例的克隆。

Kanzi 3.9.5

Kanzi 3.9.6

abstract public Resource getResult();

abstract public ObjectRef<? extends Resource> getResult();

添加了 ResourceManager.LoadTask.close() 方法,您可以在扩展类中重写该方法。如果需要,这允许显式清理内部 LoadTask 资源的内存。

画笔渲染的更改

为了提高使用基于图块渲染的 GPU 的性能,Kanzi 不再尝试在 2D 渲染期间避免清除帧缓冲区。

改进在 BrushRenderer 接口中引入了以下更改:

Kanzi 3.9.5

Kanzi 3.9.6

void updateRender(optional<int> blendMode, bool forceOpaque, bool translucencyHint)

void updateRender(optional<int> blendMode, bool translucencyHint)

virtual void updateRenderOverride(optional<int> blendMode, bool forceOpaque, bool translucencyHint) = 0;

virtual void updateRenderOverride(optional<int> blendMode, bool translucencyHint) = 0;

更改影响:

  • 从 BrushRenderer 派生的自定义类

  • 手动使用画笔渲染内容的应用程序代码

对着色器创建的更改

Kanzi 3.9.6 增加了对几何着色器和细分着色器的支持。改进在 ShaderProgram::CreateInfo 中引入了这些更改:

  • 将顶点和片段着色器特定字段替换为更通用的变体。

  • 将二进制数据类型从字符串更改为字节向量。

便利类 ShaderProgram::CreateInfoShaderSource 和 ShaderProgram::CreateInfoShaderBinary 保持不变。

Kanzi 3.9.5

Kanzi 3.9.6

string vertexShaderSource 和 string fragmentShaderSource

void addSourceShader(ShaderType type, string_view source) 或 void addSourceShader(ShaderType type, const char* source)

string separateShaderBinaryVertexData 和 string separateShaderBinaryFragmentData

void addBinaryShader(ShaderType type, ConstByteSpan binary)

string programBinaryData

vector<byte> programBinaryData

string combinedShaderBinaryData

vector<byte> combinedShaderBinaryData

对焦点和输入管理的更改

在 Kanzi 3.9.6 中,Node 知道其附加到的 Screen 节点,并且可以从该 Screen 获取 FocusManager 和 InputManager 实例。

引入了这些函数:

  • Node::getFocusManager() 和 Node::getInputManager() 获取与节点所属的 Screen 节点关联的 FocusManager 和 InputManager 实例。

  • Node::getScreen() 和 Node::setScreen() 获取和设置节点所属的 Screen 节点。

  • Screen::setFocusManager() 和 Screen::setInputManager() 将 FocusManager 和 InputManager 关联到 Screen 节点。

删除了以下函数:

  • Domain::getFocusManager()。请改用 Node::getFocusManager()。

  • Domain::getInputManager()。使用 Node::getInputManager() 代替。

从 Kanzi Android framework (droidfw) 访问 Kanzi Java API 的更改。

If the root node of the prefab displayed in a Kanzi view is a Screen node, the getRoot() method now returns the child of that Screen node. In previous versions of Kanzi, the method returned the Screen node. See 访问 Kanzi Java 和 Kotlin API.

对 KzuEngine 的更改

弃用 kzuEngine 结构,并将其功能移至 Application、Node、ResourceManager 和 Screen 类:

Kanzi 3.9.5

Kanzi 3.9.6

kzuEngineLoadBinary()

Application::loadKzbFile()

kzuEngineGetScreen()

Application::getScreen()

kzuEngineSetScreen()

Application::setScreen()

kzuEngineGetRootCompositionTarget()

Application::getRootCompositionTarget()

kzuEngineSetRootCompositionTarget()

Application::setRootCompositionTarget()

kzuEngineGetRenderingAreaOffset()

Application::getRenderingAreaOffset()

kzuEngineSetRenderingAreaOffset()

Application::setRenderingAreaOffset()

kzuEngineMeasurePerformance()

Application::measurePerformance()

kzuEngineGetFramesPerSecond()

Application::getFramesPerSecond()

kzuEngineRestoreNodeResources()

Application::restoreNodeResources()

kzuEngineInvalidateScreenLayout()

Node::invalidateMeasure()

kzuEngineInvalidateGPUResources()

ResourceManager::invalidateAllGPUResources()

kzuEngineSetScreenOrientation()

Screen::setWindowOrientation()

此更改使 kzuEngineCreate()、kzuEngineDelete() 和 Application::getEngine() 函数过时。

其他更改

  • 在 GatherLightsRenderPass::checkLightsModified() 函数中,引入了 lightRange 参数,该参数指定要检查的光范围。您可以在继承 GatherLightsRenderPass 的自定义渲染通道中使用此函数。

  • 在 PropertyAccessRange 中,adapt() 函数现在将范围引用作为输入,而不是 shared_ptr。

另请参阅

Kanzi 3.9.6 发行说明

已知问题