Kanzi 3.9.7 迁移指南

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

NodeCompositor2D 和 NodeEffect2D 类中的更改

引入了 CompositionContentRequirements 结构体,其中包含设置合成和效果渲染目标要求的参数:

struct CompositionContentRequirements
{
   /// Required size of the source content to be used by the effect.
   Vector2 size;
   /// Whether the content requires alpha channel.
   bool alpha;
   /// Whether the content requires depth buffer.
   bool depth;
   /// Whether the content requires stencil buffer.
   bool stencil;
   /// MSAA sample count for content buffer.
   unsigned int numSamples;
};

NodeCompositor2D 类中的更改:

Kanzi 3.9.6

Kanzi 3.9.7

bool beginComposition(Renderer3D& renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, Vector2 requiredSize, bool alphaRequired, bool depthRequired, bool stencilRequired, bool drawFlagSet);

bool beginComposition(Renderer3D& renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, const CompositionContentRequirements& requirements, bool drawFlagSet);

请参阅 NodeCompositor2D::beginComposition。

TextureSharedPtr beginFinalComposition(CompositionStack& compositionStack, CompositionManager* compositionManager, Vector2 requiredSize, bool alphaRequired, bool depthRequired, bool stencilRequired, bool needsRender);

TextureSharedPtr beginFinalComposition(CompositionStack& compositionStack, CompositionManager* compositionManager, const CompositionContentRequirements& requirements, bool needsRender);

请参阅 NodeCompositor2D::beginFinalComposition。

void updateRender(Node2D& node, Vector2 actualSize, bool alphaRequired, bool depthRequired, bool stencilRequired, optional<int> blendMode, float opacity, bool translucencyHint);

void updateRender(Node2D& node, const CompositionContentRequirements& requirements, optional<int> blendMode, float opacity, bool translucencyHint);

请参阅 NodeCompositor2D::updateRender。

bool updatePersistentCompositionTarget(Node2D& node, TextureSharedPtr& managedCompositionTarget, Vector2 requiredSize, bool alphaRequired, bool depthRequired, bool stencilRequired);

bool updatePersistentCompositionTarget(Node2D& node, TextureSharedPtr& managedCompositionTarget, const CompositionContentRequirements& requirements);

请参阅 NodeCompositor2D::updatePersistentCompositionTarget。

NodeEffectRenderer2D 类中的更改:

Kanzi 3.9.6

Kanzi 3.9.7

void beginEffect(Renderer3D &renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, const Matrix3x3& worldTransform, Vector2 requiredSize, bool alphaRequired, bool depthRequired,  bool stencilRequired);

void beginEffect(Renderer3D& renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, const Matrix3x3& worldTransform, const CompositionContentRequirements& requirements);

请参阅 NodeEffectRenderer2D::beginEffect。

void beginEffectOverride(Renderer3D &renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, const Matrix3x3& worldTransform, Vector2 requiredSize, bool alphaRequired, bool depthRequired,  bool stencilRequired);

void beginEffectOverride(Renderer3D& renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, const Matrix3x3& worldTransform, const CompositionContentRequirements& requirements);

请参阅 NodeEffectRenderer2D::beginEffectOverride。

void beginInitialEffectPass(Renderer3D &renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, bool alphaRequired, bool depthRequired, bool stencilRequired);

void beginInitialEffectPass(Renderer3D& renderer, CompositionStack& compositionStack, CompositionManager* compositionManager, const CompositionContentRequirements& requirements);

请参阅 NodeEffectRenderer2D::beginInitialEffectPass。

更改为 Kanzi Java API

CallbackBindingProcessor

Kanzi Java API BindingProcessor 现在继承自 KanziObject 而不是 NativeObject。这意味着 Kanzi Java API CallbackBindingProcessor.create 现在返回 ObjectRef<CallbackBindingProcessor> 而不是 CallbackBindingProcessor。

对枚举属性的支持

Kanzi Java API 现在支持具有枚举数据类型的属性:

  • 在 setter 和 getter 函数中,您现在可以使用枚举值而不是整数。

    例如,您可以替换

    textNode.setProperty(TextBlock2D.FontHintingPreferenceProperty, 1); // FontHintingPreference::NativeHinting
    

    通过

    textNode.setProperty(TextBlock2D.FontHintingPreferenceProperty, FontHintingPreference.NativeHinting);
    
  • 在 KanziObject.getProperty 中,您不再需要将枚举属性的类作为第二个参数提供。

    例如,您可以替换

    Node.HorizontalAlignment value = node.getProperty(Node.HorizontalAlignmentProperty, Node.HorizontalAlignment.class);
    

    通过

    Node.HorizontalAlignment value = node.getProperty(Node.HorizontalAlignmentProperty);
    
  • 由于 Java 和 Kotlin 在接口继承方面的差异,内置枚举的访问方式有所不同。

    例如:使用 metadata.NodeMetadata.HorizontalAlignmentProperty 属性:

    • 这在 Java 和 Kotlin 中都适用:

      NodeEnums.HorizontalAlignment.Center;
      
    • 这仅在 Java 中有效:

      Node.HorizontalAlignment.Center;
      

删除了这些未使用的枚举:

  • Node3D.RenderMode

  • Node2D.RenderType

更改绑定的设置和移除

这些函数的返回类型从 AbstractBindingRuntimeSharedPtr 更改为 BindingRuntimeHandle:

BindingRuntimeHandle -> 运算符返回一个到 AbstractBindingRuntime 的链接。这样,绑定运行时函数的工作方式是相同的。

更改图形输出和桌面

在 Kanzi 3.9.7 中,您可以在使用 GBM 窗口系统的平台上设置您希望 Kanzi 应用程序使用的图形卡。引入的改进:

Kanzi 3.9.6

Kanzi 3.9.7

KANZI_COREUI_API GraphicsOutputSharedPtr makeLegacyGraphicsOutput(const struct KzsSurfaceProperties* surfaceProperties, const NativeWindowProperties* windowProperties);

KANZI_COREUI_API GraphicsOutputSharedPtr makeLegacyGraphicsOutput(const struct KzsSurfaceProperties* surfaceProperties, const NativeWindowProperties* windowProperties, const NativeDesktopProperties* desktopProperties);

请参阅 makeLegacyGraphicsOutput。

explicit LegacyGraphicsOutput(const struct KzsSurfaceProperties* surfaceProperties, const NativeWindowProperties* windowProperties);

explicit LegacyGraphicsOutput(const struct KzsSurfaceProperties* surfaceProperties, const NativeWindowProperties* windowProperties, const NativeDesktopProperties* desktopProperties);

请参阅 LegacyGraphicsOutput::LegacyGraphicsOutput。

KANZI_COREUI_API kzsError kzsDesktopCreate(struct KzsDesktop** out_desktop);

KANZI_COREUI_API kzsError kzsDesktopCreate(const kanzi::NativeDesktopProperties* desktopPropertiesRequested, struct KzsDesktop** out_desktop);

请参阅 kzs_desktop.h::kzsDesktopCreate。

KANZI_COREUI_API kzsError kzsDesktopNativeCreate(struct KzsDesktopNative** out_desktopNative);

KANZI_COREUI_API kzsError kzsDesktopNativeCreate(const kanzi::NativeDesktopProperties* desktopPropertiesRequested, struct KzsDesktopNative** out_desktopNative);

请参阅 kzs_desktop.h::kzsDesktopNativeCreate。

对 Java Code Behind 的更改

如果您的 Kanzi 应用程序基于某个 Android 模板,并且您想向该应用程序的 Kanzi Studio 项目添加 Java Code Behind,请迁移您的应用程序。

要迁移您的 Kanzi 应用程序:

  1. 在 Android Studio 中,打开您的 Kanzi 应用程序的 Android 应用程序。在主菜单中选择 File > Project Structure。在 Project Structure 窗口中,选择 Project 选项卡,并设置:

    • Android Gradle Plugin Version 到 7.2.2。

    • Gradle Version 到 7.3.3。

    单击 OK。

    ../../_images/migration-java-code-behind-project.png
  2. 在 app/src/main/AndroidManifest.xml 中,从 manifest 元素中删除 package 属性。

    例如,更改

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.myapplication">
    

    至 (To)

    <manifest xmlns:android="http://schemas.android.com/apk/res/android">
    
  3. 在 app/build.gradle 中,将 namespace 属性添加到 android 范围。

    新工具要求将 compileSdk 和 targetSdk 属性设置为 Android API 级别 31 或更高。

    android {
        namespace 'com.example.myapplication'
        compileSdk 31
    
        defaultConfig {
            applicationId "com.example.myapplication"
            minSdk 26
            targetSdk 31
    

如果您的应用程序已经有一个插件作为源项目或 Java Code Behind,请对其 AndroidManifest.xml 和 build.gradle 文件重复该过程。

对画笔渲染器的更改

Kanzi 3.9.7 简化了画笔渲染器,使其更加统一。改进引入了以下更改:

  • 移除了 GlBrushRenderer 基类,并将大部分功能从不同的画笔类移到了 BrushRenderer 基类。

  • 已移除 RenderValuePropertyNotificationHandler 类。

    由于所有笔刷现在都使用 kanzi::GlRenderState 存储渲染值,因此不再需要 RenderValuePropertyNotificationHandler 成员。Kanzi 现在会在渲染状态中自动将属性映射到 Uniforms。

如果您使用了早期版本的 Kanzi 来实现您自己的派生画笔类及其关联的画笔渲染器类,请使用以下说明将您的应用程序迁移到 Kanzi 3.9.7:

  • 与其继承 GlBrushRenderer,不如继承 BrushRenderer。

  • 这些函数的功能现在由基类提供:

    • getRenderOpacityValue()

    • getContentTextureValue()

    • getBlendModeValueOverride()

    • setBlendModeOverride()

    • setBlendModeFallback()

    如果您实现了这些函数中的任何一个,在大多数情况下,您可以直接删除这些实现。

  • 如果您实现了 bindOverride() 函数,请将其修改为使用形式 void bindOverride(Renderer3D&, PropertyObject*)。请参阅 BrushRenderer::bindOverride。

    属性对象是一个附加对象,用于获取属性的备用值。对于 MaterialBrush,这是材质,它允许您对材质中的属性更改做出反应。对于所有使用不可变材质的其他画笔,将此参数设置为 nullptr。

  • BrushRenderer::isChangeCounterSame 和 BrushRenderer::updateChangeCounter 函数现在是虚函数。

    如果笔刷使用可变材质,为了响应材质属性的更改,笔刷必须在这些函数中跟踪材质更改计数器。如果笔刷使用不可变材质,请勿实现这些函数。

PropertyObject API 的更改

为了提高 Kanzi Engine 代码质量,更改了 PropertyObject API。弃用了 PropertyObject::validatePropertyModifiers。请改用 PropertyObject::validatePropertyModifiersAndNotifyHandlers。

绑定 API 的更改

从 binding_processor_runtime.hpp 中移除了 m_lookupContext 类成员。

如果您的 Kanzi 应用程序实现了自定义绑定处理器运行时,请将 m_lookupContext 替换为 getBindingRuntime().getLookupContext()。

另请参阅

Kanzi 3.9.7 发行说明

已知问题