Kanzi 4.0.0 迁移指南

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

备注

根据您的工程对本文所述更改的依赖程度,在 Kanzi 4.0.0 上重新组建一个新工程可能比迁移更省力。

升级到 Visual Studio 2022

Kanzi 不再支持适用于 Visual Studio 2017 和 2019 的 Kanzi Engine 库。

对于带有 Kanzi Engine 插件的 Kanzi Studio 工程,请使用 Visual Studio 2022 重新构建插件,并将插件 DLL 导入 Kanzi Studio 工程。

构建系统的更改

  • 所有平台都已迁移为使用 CMake 而不是 SCons。

引入 Kanzi Graphics

Kanzi Graphics 的引入改变了 Kanzi 应用程序与 Kanzi 渲染子系统交互的方式。

Renderer 类中的大多数函数已被移除。请改为使用 Kanzi Graphics API 和所配置的后端(Open GL、Open GL ES 或 Vulkan)。

Kanzi Graphics 由以下主要部分组成:

  • 使用 gfx::create 函数和 GraphicsCreateInfo 结构体创建对象。

  • Kanzi 将 GraphicsCommands 记录到命令缓冲区中,Kanzi Graphics 后端针对特定的图形 API 处理这些命令。

  • 对于带有 Kanzi Engine 插件的 Kanzi Studio 工程,需要将插件 DLL 重新导入到 Kanzi Studio 工程中。

  1. 使用 Kanzi 4.0.0 重新构建插件。

  2. 在 Library > Kanzi Engine Plugins 中,删除 Kanzi Engine 插件并导入更新后的 Kanzi Engine 插件。

  • 删除了以下类、成员或函数:

    • kanzi::acquireUniformLocation

    • kanzi::getUniformElementCount

    • kanzi::GLBufferHandle

    • kanzi::GLFramebufferHandle

    • kanzi::GlGraphicsLogScope

    • kanzi::GlGraphicsAdapter

    • kanzi::GlGraphicsAdapterCallGles

    • kanzi::GlGraphicsAdapterCallOpenGl

    • kanzi::GlGraphicsAdapterCheckForErrors

    • kanzi::GlGraphicsAdapterLogger

    • kanzi::GLGraphicsOutput

    • kanzi::GLProgramHandle

    • kanzi::GLRenderbufferHandle

    • kanzi::GlRenderState::acquireUniformLocation

    • kanzi::GlRenderState::allocateValues

    • kanzi::GlRenderState::RenderValueUnion

    • kanzi::GlRenderState::RenderValueInfo

    • kanzi::GlRenderState::TextureRenderValue

    • kanzi::GlRenderValueBase

    • kanzi::GLShaderHandle

    • kanzi::GLTextureHandle

    • kanzi::GlTextureRenderValue

    • kanzi::Mesh::bind

    • kanzi::Mesh::bindAttribute

    • kanzi::Mesh::bindAttributes

    • kanzi::Mesh::bindIndicies

    • kanzi::Renderer::getActiveGraphicsContext

    • kanzi::Renderer::getActiveSurfaceVendor

    • kanzi::Renderer::getUniformLocationSlow

    • kanzi::Renderer::getUniformArrayLength

    • kanzi::Renderer::setUniformIntArray

    • kanzi::Renderer::setUniformFloatArray

    • kanzi::Renderer::setUniformVecArray

    • kanzi::Renderer::setUniformColorArray

    • kanzi::Renderer::setUniformMatArray

    • kanzi::Renderer::setUniformInteger

    • kanzi::Renderer::setUniformFloat

    • kanzi::Renderer::setUniformVec2

    • kanzi::Renderer::setUniformVec3

    • kanzi::Renderer::setUniformVec4

    • kanzi::Renderer::setUniformColorRGBA

    • kanzi::Renderer::setUniformMatrix3x3

    • kanzi::Renderer::setUniformMatrix4x4

    • kanzi::Renderer::setActiveScalar

    • kanzi::Renderer::getActiveScalar

    • kanzi::Renderer::calculateProjectionCameraWorldMatrix

    • kanzi::Renderer::applyFixedUniformTime

    • kanzi::Renderer::applyFixedUniformWindowSize

    • kanzi::Renderer::applyTransformationUniform

    • kanzi::Renderer::applyTransformation

    • kanzi::Renderer::applyTextureSizeUniforms

    • kanzi::Renderer::applyTexture

    • kanzi::Renderer::detachTexture

    • kanzi::Renderer::setUniformTexture

    • kanzi::Renderer::generateTexture

    • kanzi::Renderer::deleteTexture

    • kanzi::Renderer::setTextureAddressingMode

    • kanzi::Renderer::setTextureSwizzleMask

    • kanzi::Renderer::setTextureSwizzleEachChannel

    • kanzi::Renderer::deleteShaderProgram

    • kanzi::Renderer::deleteShader

    • kanzi::Renderer::generateFramebuffer

    • kanzi::Renderer::deleteFramebuffer

    • kanzi::Renderer::invalidateFramebufferAttachments

    • kanzi::Renderer::framebufferRenderbuffer

    • kanzi::Renderer::generateRenderbuffer

    • kanzi::Renderer::deleteRenderbuffer

    • kanzi::Renderer::bindRenderbuffer

    • kanzi::Renderer::renderbufferStorage

    • kanzi::Renderer::generateBuffer

    • kanzi::Renderer::setVertexBufferData

    • kanzi::Renderer::setIndexBufferData

    • kanzi::Renderer::setVertexBufferSubData

    • kanzi::Renderer::setIndexBufferSubData

    • kanzi::Renderer::deleteBuffer

    • kanzi::Renderer::BufferAccessMode

    • kanzi::Renderer::mapVertexBuffer

    • kanzi::Renderer::unmapVertexBuffer

    • kanzi::Renderer::mapIndexBuffer

    • kanzi::Renderer::unmapIndexBuffer

    • kanzi::Renderer::enableVertexAttributeArray

    • kanzi::Renderer::disableVertexAttributeArray

    • kanzi::Renderer::getActiveShaderHandle

    • kanzi::Renderer::getActiveShaderAttributeMap

    • kanzi::Renderer::beginMaterialSetup

    • kanzi::Renderer::endMaterialSetup

    • kanzi::Renderer::pushStatistics

    • kanzi::Renderer::popStatistics

    • kanzi::Renderer::getIndexCount

    • kanzi::Renderer::getTriangleCount

    • kanzi::Renderer::getVertexCount

    • kanzi::Renderer::getInstanceCount

    • kanzi::Renderer::getBatchCount

    • kanzi::Renderer::getShaderSwitchCount

    • kanzi::Renderer::getUniformSendCount

    • kanzi::Renderer::getTextureSwitchCount

    • kanzi::Renderer::getFramebufferSwitchCount

    • kanzi::Renderer::getBufferSwitchCount

    • kanzi::Renderer::getHeavyweightCallCount

    • kanzi::Renderer::getHalfFloatVertexAttributeSupport

    • kanzi::Renderer::getTexStorageSupport

    • kanzi::Renderer::getGLFormatTriplet

    • kanzi::Renderer::clearUniformCaches

    • kanzi::Renderer::TextureUnitInfo

    • kanzi::Renderer::RenderingChangeStateFlag

    • kanzi::Renderer::refreshRenderContext

    • kanzi::Renderer::enableState

    • kanzi::Renderer::disableState

    • kanzi::Renderer::setState

    • kanzi::Renderer::getState

    • kanzi::Renderer::setBlendMode

    • kanzi::Renderer::getBlendMode

    • kanzi::Renderer::setCullMode

    • kanzi::Renderer::getCullMode

    • kanzi::Renderer::setDepthTest

    • kanzi::Renderer::getDepthTest

    • kanzi::Renderer::setLineWidth

    • kanzi::Renderer::getLineWidth

    • kanzi::Renderer::clear

    • kanzi::Renderer::resetClearTarget

    • kanzi::Renderer::addClearTarget

    • kanzi::Renderer::getClearMode

    • kanzi::Renderer::addClearColor

    • kanzi::Renderer::removeClearTarget

    • kanzi::Renderer::isClearEnabled

    • kanzi::Renderer::setClearColor

    • kanzi::Renderer::setClearDepthValue

    • kanzi::Renderer::setClearStencil

    • kanzi::Renderer::setColorWriteMode

    • kanzi::Renderer::getColorWriteMode

    • kanzi::Renderer::setViewport

    • kanzi::Renderer::getViewport

    • kanzi::Renderer::setScissorTest

    • kanzi::Renderer::getScissor

    • kanzi::Renderer::setVertexBuffer

    • kanzi::Renderer::setIndexBuffer

    • kanzi::Renderer::drawBuffers

    • kanzi::Renderer::setVertexCount

    • kanzi::Renderer::setIndexCount

    • kanzi::Renderer::setIndexData

    • kanzi::Renderer::setInstanceCount

    • kanzi::Renderer::setActiveTextureUnit

    • kanzi::Renderer::bindTexture

    • kanzi::Renderer::setTextureImage2D

    • kanzi::Renderer::setTextureSubImage2D

    • kanzi::Renderer::textureStorage

    • kanzi::Renderer::generateMipMaps

    • kanzi::Renderer::setTextureFilter

    • kanzi::Renderer::setTextureCompare

    • kanzi::Renderer::setTextureMaximumLevel

    • kanzi::Renderer::createShader

    • kanzi::Renderer::createShaderProgram

    • kanzi::Renderer::attachShaderToProgram

    • kanzi::Renderer::detachShaderFromProgram

    • kanzi::Renderer::bindAttributeToLocation

    • kanzi::Renderer::linkShaderProgram

    • kanzi::Renderer::compileSourceShader

    • kanzi::Renderer::deployBinaryShader

    • kanzi::Renderer::deployBinaryProgram

    • kanzi::Renderer::loadProgramFromCache

    • kanzi::Renderer::saveProgramToCache

    • kanzi::Renderer::getCacheFilePath

    • kanzi::Renderer::updateSettings

    • kanzi::Renderer::getProgramBinary

    • kanzi::Renderer::isFramebufferComplete

    • kanzi::Renderer::framebufferTexture2D

    • kanzi::Renderer::applyVertexAttributeArrays

    • kanzi::Renderer::setVertexBufferPointer

    • kanzi::Renderer::setVertexBufferPointer

    • kanzi::Renderer::setActiveShaderHandle

    • kanzi::Renderer::setActiveFramebuffer

    • kanzi::Renderer::setColorBufferCount

    • kanzi::Renderer::getActiveFramebuffer

    • kanzi::Renderer::beginVertexArray

    • kanzi::Renderer::setVertexArrayData

    • kanzi::Renderer::endVertexArray

    • kanzi::Renderer::getCurrentVertexArrayFlags

    • kanzi::Renderer::getCurrentVertexArrayAttributeData

    • kanzi::Renderer::isShaderBinaryFormatSupported

    • kanzi::Renderer::isProgramBinaryFormatSupported

    • kanzi::Renderer::applyAttributePointer

    • kanzi::Renderer::supportsTexStorage

    • kanzi::Renderer::setHasTessellationShader

    • kanzi::Renderer::setFillMode

    • kanzi::Renderer::readPixels

    • kanzi::Renderer::setPixelStorePack

    • kanzi::Renderer::setPixelStoreUnpack

    • kanzi::Shader::UniformProperty::uniformLocation

    • kanzi::Shader::hasSamplersWithoutProperties

    • kanzi::Shader::getTextureUniformLocation

    • kanzi::Texture::deployImages

    • kzsGlGraphicsContextCreate

    • kzsGlGraphicsContextDestroy

    • kzsGlGraphicsContextSetActive

    • kzsGlGraphicsContextGetAdapter

    • kzsGlGraphicsContextIsKhrDebugSupported

    • kzsGlGraphicsContextGetVendor

    • kzsGlGraphicsContextGetSurfaceClientAPI

    • kzsGlGraphicsContextGetAPI

    • kzsGlIsExtensionSupported

    • kzsGlGraphicsContextSetLogging

    • kzsGlGraphicsContextGetLogging

    • kzsGlGraphicsContextGetDumpStateOnDrawCalls

    • kzsGlGraphicsContextSetErrorChecking

    • kzsGlGraphicsContextSetDebugCallback

    • kzsGlGraphicsContextGetGlesSymbols

    • kzsGlGraphicsContextGetOpenGlSymbols

  • kanzi::GlRenderState 类已重命名为 RenderState,以移除特定于平台的 “Gl” 前缀,因为渲染状态抽象并非 OpenGL 所特有。

    头文件也已从 kanzi/core.ui/graphics3d/render_state.hpp 移至 kanzi/core.ui/graphics/render_state.hpp。

  • 删除了以下具有直接替代项的函数:

    已移除了

    改用

    kanzi::captureCurrentFramebufferToImage

    captureFramebuffer

    kanzi::captureScreenToImage

    captureFramebuffer

    kanzi::GPUBuffer::getNativeHandle

    GPUBuffer::getHandle

    kanzi::Mesh::getNativeVertexBufferHandle

    Mesh::getVertexBufferHandle

    kanzi::Mesh::getNativeIndexBufferHandle

    Mesh::getIndexBufferHandle

    kanzi::Mesh::getNativeInstanceBufferHandle

    Mesh::getInstanceBufferHandle

    kanzi::Renderbuffer::getNativeHandle

    Renderbuffer::getHandle

    kanzi::Renderer::applyFixedUniforms

    RenderState::updateFixedFunctionUniforms

    kanzi::Renderer::getMaximumVertexAttributeCount

    gfx::getDeviceProperty (gfx::DevicePropertyId::MaxVertexAttributes)

    kanzi::Renderer::setActiveGLGraphicsOutput

    Renderer::setActiveGraphicsOutput

  • 删除了 kanzi::Geometry::drawTextured 和 kanzi::Geometry::drawUntextured 函数。如果您使用这些函数,您可以按如下方式更改代码

    if (isTextured())
    {
        geometry.drawTextured(renderer, transform, GraphicsPrimitiveTypeTriangleStrip, material);
    }
    else
    {
        geometry.drawUntextured(renderer, transform, GraphicsPrimitiveTypeTriangleStrip, material);
    }
    

    至 (To)

    renderer.setMatrix(FixedMatrixWorld, transform);
    renderState.updateTransformationUniforms(renderer);
    
    renderState.draw(renderer, geometry);
    

Renderer API 的更改

  • 删除了 Renderer3D 类。Kanzi 使用 Renderer3D 类在 3D rendering 期间存储临时属性,并为 Preview 提供调试功能。

    此版本的 Kanzi 进行了以下移动:

    在您的应用程序代码中,将所有对 Renderer3D 的使用更改为使用 Renderer。这包括所有以 Renderer3D 作为参数传递的虚函数。

    将这些函数从 Renderer3D 类移动到 Renderer 类:

    由于与移除 Renderer3D 类相关的重构,移除了这些函数。大多数被移除的函数与调试 (Debug) 渲染相关:

    • Renderer::bindFramebuffer

    • Renderer::setActiveFramebufferCallback

    • Renderer::setDefaultFramebuffer

    • Renderer3D::addVertexAndNormalToFloatArrays

    • Renderer3D::addVertexToFloatArray

    • Renderer3D::applyBoolProperty

    • Renderer3D::applyColorMaterial

    • Renderer3D::applyColorProperty

    • Renderer3D::applyFloatProperty

    • Renderer3D::applyIntProperty

    • Renderer3D::applyMaterial

    • Renderer3D::applyMaterialStrict

    • Renderer3D::applyMatrix3x3Property

    • Renderer3D::applyMatrix4x4Property

    • Renderer3D::applyPropertyType

    • Renderer3D::applySRT2DProperty

    • Renderer3D::applySRT3DProperty

    • Renderer3D::applyStencilSettings

    • Renderer3D::applyTextureProperty

    • Renderer3D::applyVector2Property

    • Renderer3D::applyVector3Property

    • Renderer3D::applyVector4Property

    • Renderer3D::calculateNormal

    • Renderer3D::drawBoxSolidNormal

    • Renderer3D::drawLayerOutlineQuad

    • Renderer3D::drawLayerQuad

    • Renderer3D::drawLayerQuadWithMaterial

    • Renderer3D::drawLineList

    • Renderer3D::drawPrimitives

    • Renderer3D::drawOrientedBoundingBoxSolidNormal

    • Renderer3D::drawPrimitiveBufferTextured

    • Renderer3D::drawPrimitiveBufferUntextured

    • Renderer3D::drawPrimitivesNormal

    • Renderer3D::drawSelectionIndicator

    • Renderer3D::drawQuad

    • Renderer3D::drawTrajectory

    • Renderer3D::drawUntexturedLayerQuad

    • Renderer3D::drawViewportQuadWithTextureSpan

    • Renderer3D::getActiveGLGraphicsOutput

    • Renderer3D::getClearColorOverride

    • Renderer3D::getFloatBuffer

    • Renderer3D::getResourceManager

    • Renderer3D::isBoundingBoxVisualizationEnabled

    • Renderer3D::isColorWriteDisabled

    • Renderer3D::isSkeletonVisualizationEnabled

    • Renderer3D::printInfo

    • Renderer3D::removeClearColorOverride

    • Renderer3D::setActiveGLGraphicsOutput

    • Renderer3D::setBoundingBoxVisualizationEnabled

    • Renderer3D::setClearColorOverride

    • Renderer3D::setDefaultOrthoProjection

    • Renderer3D::setDisableColorWrite

    • Renderer3D::setFramebufferCallback

    • Renderer3D::setLogging

    • Renderer3D::setSkeletonVisualizationEnabled

    • Surface::attach

    • Surface::attachOverride

    请改用 DebugVisualization 和 DebugVisualizationStorage 类来绘制和存储节点的调试可视化。

    DebugComposer 自动使用的标准 DebugRenderRegistry::DebugObjectRenderingFunction 已更改为:

    void (*DebugObjectRenderingFunction)(Renderer& renderer, DebugRenderStorage& storage, DebugVisualization* visualization, NodeSharedPtr object);
    

    您可以访问 storage 为 Node 创建调试可视化结构。如果您已在上一帧中执行过此操作,则 visualization 参数不为空,您可以使用它。存储在 DebugVisualization 中的几何体会一直保留,直到您从场景图中移除该 Node。

  • 移除了 Surface::Usage 枚举。

  • RenderTargetMode 已弃用,并已从 Texture 中移除。因此:

合并 kanzi::Mesh 中的索引缓冲区

将 kanzi::Mesh 的索引缓冲区合并为 Mesh 对象自身中的一个缓冲区,不再由每个 kanzi::Mesh::Cluster 各自拥有索引缓冲区。因此,与索引缓冲区相关的 API 调用移至 Mesh 本身,或移除了其中的 Cluster 参数。从 kanzi::Mesh::CreateInfo::Cluster 构造函数中移除了索引缓冲区类型和句柄参数,因为它们现在直接属于 kanzi::Mesh::CreateInfo。如有需要,请使用 Mesh::getClusterIndexOffset 获取在主索引缓冲区中的字节偏移量。

已移除了

改用

kanzi::Mesh::getClusterIndexType

Mesh::getIndexType

kanzi::Mesh::getClusterIndexData

Mesh::getIndexData

kanzi::Mesh::CreateInfo::Cluster::setIndexCount

直接设置 kanzi::Mesh::CreateInfo::Cluster::indexCount 和 kanzi::Mesh::CreateInfo::Cluster::indexOffset 成员。

从以下函数中移除了群集索引参数:

kanzi::Mesh::mapIndexData

Mesh::setIndexData

Mesh::setIndexSubData

平台 API 的更改

  • 重命名了多个引用 OpenGL 上下文 API 的实体。

已移除了

改用

kanzi::platform::OpenGLPlatform

kanzi::platform::GlContextApi

kanzi::platform::createDefaultOpenGLPlatform

kanzi::platform::createDefaultGlContextApi

  • 位于 kanzi/core/platform/cpp/win32/string_conversion.hpp 中的 Win32 string 实用工具已从 kanzi 命名空间移至 win32

  • 所有依赖于平台的窗口和输入代码均已移至单独的 library (kzplatform)。

Data-Driven Exclusive Activity Host 的更改

Data-Driven Exclusive Activity Host 现在仅支持从数据源创建的活动,不再支持手动添加的活动。请改用 Exclusive Activity Host。

列表框的更改

列表框节点的更改

在 Grid List Box 节点中,默认的方向导航键不再移动项选择。在 List Box 节点中,默认的方向导航键现在会在可聚焦的列表项之间移动按键焦点。

例如,要使用 ↑ 和 ↓ 键滚动 Grid List Box,请将列表项设为可聚焦。请参阅 在 List Box 节点中处理键焦点。。

ActivityCodeBehind 类的更改

  • 在 Kanzi C++ API 的 ActivityCodeBehind 类中,将 onActive、onInactive、onActivating 和 onDeactivating 回调替换为 ActivityCodeBehind::onStatusChange。

    要迁移您的 Kanzi 应用程序,请将 onActive、onInactive、onActivating 和 onDeactivating 回调的内容移至 ActivityCodeBehind::onStatusChange 回调。例如,如果您从 ActivityCodeBehind 派生,请将

    void onActive() override
    {
       kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("Activity status changed: Active"));
    }
    

    至 (To)

    void onStatusChange(ActivityConcept::Status status) override
    {
       switch(status)
       {
          case ActivityConcept::Status::Active:
             kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("Activity status changed: Active"));
             break;
       }
    }
    
  • 在 Kanzi C++ (ActivityCodeBehind) 和 Kanzi Java API (ActivityCodeBehind) 中,均移除了 registerStatusChange、registerStatusChangeOverride、unregisterStatusChange 和 unregisterStatusChangeOverride。

    要迁移您的 Kanzi 应用程序,请将已注册的状态更改回调的内容移至 ActivityCodeBehind::onStatusChange 回调。

    例如:

    如果您从 ActivityCodeBehind 派生,请将

    void registerStatusChangeOverride() override
    {
       registerStatusChange(ActivityConcept::Status::Active, [](ActivityConcept::StatusChangedMessageArguments&)
       {
          kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("Activity status changed: Active"));
       });
    }
    

    至 (To)

    void onStatusChange(ActivityConcept::Status status) override
    {
       switch(status)
       {
          case ActivityConcept::Status::Active:
             kzLogInfo(KZ_LOG_CATEGORY_GENERIC, ("Activity status changed: Active"));
             break;
       }
    }
    

    如果您从 ActivityCodeBehind 派生,请将

    @Override
    protected void registerStatusChangeOverride()
    {
       registerStatusChange(ActivityStatus.Active, (messageArguments) -> {
          Log.info("Activity status changed: Active");
       });
    }
    

    至 (To)

    @Override
    protected void onStatusChange(ActivityStatus status)
    {
       super.onStatusChange(status);
       switch(status)
       {
          case Active:
             Log.info("Activity status changed: Active");
             break;
       }
    }
    

ActivityElementImpl 和 ActivityHostConceptImpl 类的更改

File API 的更改

在 File 类中,将以下成员函数更改为在匿名数据缓冲区操作中使用 byte 而不是 char:

函数

签名

File::read

void File::read(byte* buffer, uintmax_t count)

File::tryRead

uintmax_t File::tryRead(byte* buffer, uintmax_t count)

File::write

void write(const byte* buffer, uintmax_t count)

此更改也适用于继承 File 类的 ReadOnlyDiskFile、ReadOnlyMemoryFile 和 WriteOnlyDiskFile 类中的函数。

捏合操纵器的更改

在 PinchManipulator 类中:

  • 移除了以下不起作用的成员函数和变量:

    • 函数:

      • setRotationRecognitionThreshold

      • setScaleRecognitionThreshold

    • 变量:

      • m_rotateThreshold

      • m_rotating

      • m_scaleThreshold

      • m_scaling

  • 将以下成员变量设为私有:

    • m_normalizedReferenceVector

    • m_previousMiddle

    • m_referenceScale

    • m_touchIdA

    • m_touchIdB

对应用程序配置的更改

  • 移除了枚举值 MultisamplePreference::MultisamplePreferenceImplicit。这同时移除了应用程序配置文件选项

    MultisamplePreference = "implicit"
    

    这反映了一项更广泛的更改,即从 Kanzi Engine 中移除了对隐式多重采样的支持。从现在起,Kanzi 仅在您使用 Renderbuffer blit 或可显式访问的样本时才应用多重采样。渲染结果可见,因为此选项面向的是旧版 GPU。

  • 修改了应用程序配置,使其按照通行做法接受带双短划线前缀的命令行参数。用于选择图形后端的新参数为:

    • --gles

    • --opengles

    • --gl

    • --opengl

    • --vk

    • --vulkan

    用于选择窗口系统的新参数为:

    • --egl

    • --wgl

    • --glx

    您可以在应用程序配置文件中使用不带双短划线的相同参数。

  • Kanzi 现在仅接受 false、true、0 和 1 作为布尔配置选项的有效值。

  • TracingInterval 配置选项已重命名。

    已移除了

    改用

    TracingInterval

    TracingTimeInterval

    configuration.tracingConfiguration.recurringInterval

    configuration.tracingConfiguration.recurringTimeInterval

    请参阅 TracingTimeInterval

对合成堆栈的更改

简化了 CompositionStack 的使用,现在要求使用由 Renderer 拥有的实例。

  • 从 CompositionStack 中移除了 apply 函数。所有推送和弹出操作都会自动应用,无需额外的函数调用。

已移除了

改用

kanzi::CompositionStack::apply3D kanzi::CompositionStack::apply

无需任何操作。

kanzi::CompositionStack::apply2D

Renderer::setOrthographicProjection

kanzi::CompositionStack::applyPerspective2D

使用 FixedMatrixCamera 和 FixedMatrixProjection 多次调用 Renderer::setMatrix。

kanzi::CompositionStack::applyColorBlend2D kanzi::CompositionStack::applyColorBlend3D kanzi::CompositionStack::applyColorBlend

无需任何操作。

kanzi::CompositionStack::invalidateColorBlend

不再支持。

kanzi::CompositionStack::applyComposition2D kanzi::CompositionStack::applyComposition3D kanzi::CompositionStack::applyComposition

无需任何操作。

kanzi::CompositionStack::invalidateComposition

不再支持。

kanzi::CompositionStack::applyDepthStencil2D kanzi::CompositionStack::applyDepthStencil3D kanzi::CompositionStack::applyDepthStencil

无需任何操作。

kanzi::CompositionStack::invalidateDepthStencil

不再支持。

kanzi::CompositionStack::applyRasterization2D kanzi::CompositionStack::applyRasterization3D kanzi::CompositionStack::applyRasterization

无需任何操作。

kanzi::CompositionStack::invalidateRasterization

不再支持。

对状态机的更改

更改了状态机在状态更改时发送属性更改通知和更新绑定的方式。以前,每次状态更改都会在移除旧状态的属性时发送一个通知,并在添加新状态的属性时再发送一个通知。现在,状态更改只发送一个通知,其中包含新状态的新属性值。如果状态更改带有 Transition 动画,则在 Transition 期间 Kanzi 会像以前一样发送属性通知,但不会在 Transition 开始时发送由状态更改引起的冗余通知。

使用 API 创建状态机时:

对属性和绑定的更改

属性和绑定中布尔值的字符串转换结果现在为小写的 true 或 false,而不再是 1 或 0 以及 True 或 False。

要将您的 Kanzi 应用程序从早期版本迁移过来,确保所有与布尔值进行比较的字符串值为小写的 true 或 false。

对挂起处理的更改

添加了 WakeupSignalSource 类,其功能替代了以下已删除的函数:

  • EventSource::getNativeEventHandle

  • KeyMapEventFilter::getNativeEventHandle

  • KeyRepeatGenerator::getNativeEventHandle

对事件处理的更改

添加了 Application::setInputEventHandle 函数,用于替代从 Application::appendEventSource 中删除的功能。

对 kzuEngine 的更改

删除了以前已弃用的与 kzuEngine 相关的功能:

  • Application::getEngine 函数

  • Application::m_engine 成员

  • kzuEngine 结构体

  • 所有以 kzuEngine 开头的函数

  • kzu_engine.h 头文件

对 Scroll View 消息的更改

删除了 Scroll View 和 Grid List Box 节点使用的以下已弃用的消息和消息处理程序:

请参阅 滚动功能。

对多个 Kanzi Engine API 的更改

更新了多个 Kanzi Engine API 的参数和返回类型,改为使用 size_t 数据类型,而不是 unsigned int。

将 kanzi::optional 和 kanzi::string_view 更改为 C++17 std 实现。在上一版本 Kanzi 中使用 Boost 实现的平台上,请迁移这些类的参数和返回类型。

将 kanzi::byte 更改为 C++17 std 实现。在上一版本 Kanzi 中使用 unsigned char 的平台上,请迁移这些类的参数和返回类型。

更改了针对 kanzi::string_view 参数的 trim 实现,使其与其他参数类型一样直接原地修改输入。

Wayland IVI 后端上的表面不透明度设置现在解释为浮点数,而不是整数。请参阅 wayland::IviSurfaceProps::opacity 和 wayland::IviLayerProps::opacity。

将函数 surfaceColorSpaceNameToEnum 从 libkzcoreui 移至 libkzplatform。

对 C 包装器头文件的更改

移除了头文件 kzs_string.hpp、kzs_arg.hpp 和 kzs_memory.hpp。

已移除了

改用

kzsStrcat

kzsStrncmp

等等

strcat

strncmp

等等

kzsStringFormatList

kzsStringFormatGetLength

kanzi::format

kzsStringFindNextCharacter

string_view::find

kzsStringGetUTF8ByteCount

kzsStringWriteUnicodeCharacter

kzsStringGetUnicodeCharacter

stringToUnicodeVector

对旧版文件 API 的更改

移除了头文件 kzs_file.hpp 和 kzs_resource_file.hpp。

请改用 ReadOnlyDiskFile。

对焦点消息的更改

移除了焦点系统使用的以下已弃用消息和消息处理器:

已移除了

改用

ScopeBroughtToFrontMessage

FocusManager::OverlayBroughtToFrontMessage

ScopeSentToBackMessage

FocusManager::OverlaySentToBackMessage

请参阅 焦点处理中的更改。

对 Android 应用程序模板的更改

Kanzi Android 应用程序模板已升级到 Gradle 8.13、Android Gradle Plugin 8.12.1 和 Java 语言版本 11。

要迁移现有的应用程序:

  1. 在 <ProjectName>/Application/configs/platforms/android_gradle/gradle/wrapper/gradle-wrapper.properties 中,替换:

    distributionUrl=https\://services.gradle.org/distributions/gradle-<version>-bin.zip
    

    通过

    distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip
    
  2. 在 <ProjectName>/Application/configs/platforms/android_gradle/build.gradle 中,替换:

    dependencies {
        classpath 'com.android.tools.build:gradle:<android-gradle-plugin-version>'
        classpath 'com.rightware.gradle:kanzi:<kanzi-gradle-plugin-version>'
    }
    

    通过

    dependencies {
        classpath 'com.android.tools.build:gradle:8.12.1'
        classpath 'com.rightware.gradle:kanzi:0.9.0'
    }
    
  3. 在 <ProjectName>/Application/configs/platforms/android_gradle/app/build.gradle:

    • 更新 Java 兼容性:

      android {
          compileOptions {
              sourceCompatibility JavaVersion.VERSION_11
              targetCompatibility JavaVersion.VERSION_11
          }
      }
      
    • 更新 Kotlin JVM 目标:

      android {
          kotlinOptions {
              jvmTarget = '11'
          }
      }
      
    • 如果您有自定义 Java 插件,请更新 exportJar 任务:

      替换 (Replace)

      task exportJar(type: Jar) {
           // ... rest of the task configuration
           from("build/intermediates/javac/${buildType.name}/classes/")
           // ... rest of the task configuration
       }
      

      通过

      task exportJar(type: Jar) {
          // ... rest of the task configuration
          from("build/intermediates/javac/${buildType.name}/compile${buildType.name.capitalize()}JavaWithJavac/classes/")
          // ... rest of the task configuration
      }
      

对 Android NDK 版本的更改

要将 Kanzi 应用程序设置为使用当前的 Android NDK 版本,请在应用程序的 build.gradle 文件中将 ndkVersion 设置为 26.3.11579264。

Kanzi Studio Android 包导出的更改

从 Kanzi Studio 构建 Android 包时,Kanzi Studio 现在根据工程的 Binary File Name 属性导出 cfg 文件。

要迁移应用程序,请更新 binaryFileName 或 kzbPathList 的定义。

弃用 Page 和 Page Host 节点

Page 和 Page Host 节点已被弃用,并将在 Kanzi 的下一个版本中移除。要创建可导航的用户界面,您必须手动重新创建 Kanzi Studio 工程和 Kanzi 应用程序,改为使用 Activity 和 Activity Host 节点。

要创建和检查 Activity Host 和 Activity 节点,以及模拟 Activity 激活,请使用 Activity Browser 窗口。请参阅 使用 Activity Browser。

使用以下 Activity Host 节点替换 Page Host 节点:

  • 一个 Exclusive Activity Host 一次只能激活其一个子活动。当一个 Exclusive Activity Host 的子活动处于活动状态时,该活动主机的所有其他活动都处于非活动状态。例如,您可以使用一个 Exclusive Activity Host 在应用程序中切换视图。

    请参阅 独占活动主机。

  • Parallel Activity Host 可以同时激活多个子活动。当您激活一个活动时,Parallel Activity Host 会将该活动置于前台。

    请参阅 并行活动主机。

  • 您可以使用列表数据源和 Data-Driven Exclusive Activity Host 从数据对象的内容中创建具有 Activities 的 UI 部分。例如,您可以在数据源中定义菜单的内容,并使用 Data-Driven Exclusive Activity Host 在您的应用程序中创建菜单。

    请参阅 数据驱动独占活动主机。

用 Activity 节点替换 Page 节点。

要了解 Activities,请参阅:

文本渲染的更改

变形数据的更改

以前版本的 Kanzi 使用单独的 kanzi::Morph 对象,该对象继承 Mesh,并将其他网格引用为混合起点和终点的变形目标。从 Kanzi 4.0.0-beta2 版本开始,变形数据表示为相对于基础网格的差异。对多个网格的使用已被移除,整个 kanzi::Morph 类概念也已移除。

网格现在可以包含一个内部 Mesh::MorphData 对象,该对象包含差异数据。可以通过 const kanzi::Mesh::MorphData* kanzi::Mesh::getMorphData() const 访问此数据。对于形状数量足够少、符合常见的 16 个特性通道限制的变形,Kanzi Studio 将网格数据作为顶点缓冲区 blob 导出到 Mesh::MorphData 中。需要更多通道的变形数据将根据选定使用的变形形状,存储为直接分配给 Model3D 的数据纹理。

使用旧的变形固定 Uniforms kzMorphDataTexture、kzMorphIndices 和 kzMorphWeights 的着色器现在在 Studio 中被标记为已弃用。

对变形权重的更改

在以前版本的 Kanzi 中,当您为 Model3D 节点设置变形网格时,Kanzi Engine 会用 kanzi::Morph 中的默认权重覆盖变形权重。从 Kanzi 4.0.0-beta1 开始,变形权重会被保留。

要复现旧的行为,请将 Model3D::MeshProperty 设置为 nullptr,然后分配新的 kanzi::Morph。

在以前版本的 Kanzi 中,变形权重由单独的变形运行时处理,该运行时是 kanzi::Model3D 节点的子对象。从 Kanzi 4.0.0-beta1 开始,变形权重只是一个范围。

要设置变形权重,请将包含元素数量正确的 kanzi::TypedValueRange<float> 的 AbstractRangeSharedPtr 分配给 Model3D::MorphingProperty。可以从 Mesh::MorphData 读取权重的最大数量。

即使未分配任何权重,Kanzi Engine 也会创建一个填充了默认权重的类值源,只要应用程序开发人员未分配更高级别的值或绑定,就会使用该值源。

以前使用 kanzi::MorphWeightAnimationTimeline 为变形权重创建动画的机制已被弃用。由于变形权重现在只是一个范围属性,请使用新引入的类型 RangeIndexAnimationTimeline。

已移除了

改用

  • kanzi::Model3D::MorphRuntime (特化类)

  • kanzi::MorphWeightAnimationTimeline

CubeMapRenderPass 的更改

CubeMapRenderPass 不再自动创建深度纹理。要创建深度纹理,请设置 CubeMapRenderPass::DepthFormatProperty。

除非您设置了 CubeMapRenderPass::DepthFormatProperty,或使用 CubeMapRenderPass::DepthTargetProperty 手动设置了深度纹理,否则为了节省内存并提高性能,Kanzi 只使用一个深度渲染缓冲区。Kanzi 会为 CubeMapRenderPass 中的每个面重复使用该深度渲染缓冲区。

标签的更改

在节点列表和标签不发生变化的情况下,使用标签进行 NodeList 过滤的性能已显著提高。如果未检测到更改,则可以完全跳过过滤阶段。

要检查节点中的标签,请使用 kanzi::Node::hasTag,而不是 PropertyObject::getProperty。标签仍设置为布尔属性,可以绑定,也可以使用 StateManager 或绑定进行设置。这些属性不再可继承,标签状态在节点层级中单独维护。

标签现在具有关联的更改标志类型 PropertyTypeChangeFlag::PropertyTypeChangeFlagTag。Studio 在导出工程时会自动设置该标志。用户需要导出现有工程,标签的更改才能生效。

辅助类 kanzi::Tag 已被移除。要创建新标签或访问现有标签,请使用 Node::acquireTag。要操作标签,请使用属性接口或辅助函数 Node::setTag 和 Node::removeTag。

纹理的更改

已移除过时的创建信息类型 kanzi::Texture::CreateInfoNode2DRenderTarget 和 Texture::CreateInfoRenderpassRenderTarget。请使用 Texture::CreateInfoRenderTarget。用于合成的纹理现在始终要么包含自己的帧缓冲区,要么由 Kanzi 在内部合并为单个帧缓冲区,例如在 CompositionTargetRenderPass 中。这些特定的单独创建场景已无必要,因此已被移除。

对光源 (Light) 属性的更改

已从光源节点 (Light node) 中移除这些属性。请改用摄像机节点 (Camera node) 中的属性。

已从光源节点 (Light node) 中移除

请改用摄像机节点 (Camera node) 中的

Shadow Projection Z Near

Z 近平面 (Z Near)

Shadow Projection Z Far

Z 远平面 (Z Far)

Shadow Projection Z Orthogonal Plane Size

正交片面尺寸 (Orthogonal Plane Size)

对 Progressive Rendering Viewport 2D 属性的更改

已移除了

改用

ProgressiveRenderingViewport2D.MultisampleLevel

Node2D.MultisampleLevel

对 Kanzi Studio 命令的更改

  • 更改了 SaveProject,使其接受目录路径而非文件路径。请将 SaveProject "C:\Example\directory\path\projectName.kzproj" 替换为 SaveProject "C:\example\directory\path\",或者替换为 SaveProject 以将工程保存到其现有位置。请参阅 SaveProject。

  • 更改了 NewProject,使其接受目录路径而非文件路径。请将 NewProject "C:\Example\directory\path\projectName.kzproj" 替换为 NewProject "C:\example\directory\path\" "projectName"。请参阅 NewProject。

  • 从 SaveProject 命令中移除了可选的 projectFileFormat 参数。

已移除的 API 成员

移除了以下在 Kanzi 早期版本中已弃用的 Kanzi Engine C++ API 成员:

已移除了

改用

Application::getInputManager

Screen::getInputManager

FocusManager::createFocusScopeInfo

FocusScope::create

FocusManager::isFocusFence

FocusManager::getFocusScopeType

FocusManager::isFocusScope

FocusManager::getFocusScopeType

FocusManager::setFocusFence

FocusManager::setFocusScopeType

FocusManager::setFocusScope

FocusManager::setFocusScopeType

FocusManager::trySetActiveFocus

FocusManager::trySetFocus

FocusManager::tryMoveActiveFocus

FocusManager::tryMoveFocus

InputManipulator::getTouchEventRoutingMode

InputManipulator::getEventRoutingMode

InputManipulator::setTouchEventRoutingMode

InputManipulator::setEventRoutingMode

Keyboard

KeyManipulator

rayPickHitTest(const Vector2& limits, OverlayScope& scope, Scene* scene, Camera* camera, int x, int y)

rayPickHitTest

KzuInputTouchPoint

TouchPoint

Light::isEnabled

Node::isVisible

Light::setEnabled

Node::setVisible

Node2D::setLayoutSize

Node2D::setSize

collectResourceUrlsFromPrefabTemplateNodeResourceDictionaryUrls

不可用

NodeComponent::NodeComponentMessageArguments

NodeComponent::NodeComponentTargetMessageArguments

InputManipulator::TouchEventRoutingMode

InputManipulator::EventRoutingMode

PopupScope

AutoClosingModalScope

另请参阅

Kanzi 4.0.0 版本说明

已知问题