效果工厂使用指南

一、快速开始

最简单的注册方式 - 一行代码:

// src/core/ge_factory_register.cpp

GE_FACTORY_REGISTER(GEGreyShaderFilter)

二、注册方式

2.1 集中注册(推荐)

所有效果注册集中在 ge_factory_register.cpp

// src/core/ge_factory_register.cpp

GE_FACTORY_REGISTER(GEGreyShaderFilter)
GE_FACTORY_REGISTER(GEMESABlurShaderFilter)

优点: 便于统一管理、查找和维护

2.2 分散注册(支持)

效果可在自己的 cpp 文件中注册:

// src/effect/filter/ge_grey_shader_filter.cpp

#include "core/ge_effect_factory.h"

namespace {
GE_FACTORY_REGISTER(GEGreyShaderFilter)
}

原理: 静态对象在 main() 前自动构造,调用 Register()


三、基础注册

3.1 Filter效果

GE_FACTORY_REGISTER(GEGreyShaderFilter)
GE_FACTORY_REGISTER(GEMESABlurShaderFilter)
GE_FACTORY_REGISTER(GEColorGradientShaderFilter)

3.2 Mask效果

GE_FACTORY_REGISTER_MASK(GERippleShaderMask)
GE_FACTORY_REGISTER_MASK(GEDoubleRippleShaderMask)

3.3 Shape效果

GE_FACTORY_REGISTER_SHAPE(GESDFRRectShaderShape)
GE_FACTORY_REGISTER_SHAPE(GESDFUnionOpShaderShape)

四、动态加载效果注册

4.1 纯动态加载

效果通过外部加载器动态加载,无内置实现:

GE_FACTORY_REGISTER_EXTERNAL(DOT_MATRIX, Drawing::GEDotMatrixShaderParams)
GE_FACTORY_REGISTER_EXTERNAL(HARMONIUM_EFFECT, Drawing::GEHarmoniumEffectShaderParams)

4.2 动态加载 + 内置回退

优先尝试动态加载,失败时使用内置实现:

GE_FACTORY_REGISTER_EXTERNAL_FALLBACK(MESA_BLUR,
    Drawing::GEMESABlurShaderFilterParams,
    GEMESABlurShaderFilter)

五、自定义注册

复杂效果需要自定义创建逻辑时使用。

示例:KAWASE_BLUR

源码位置: src/core/ge_factory_register.cpp:145-170

GE_FACTORY_REGISTER_CUSTOM(KAWASE_BLUR, [](auto ve) {
    auto params = ve->GetParams<Drawing::GEKawaseBlurShaderFilterParams>();
    if (!GERender::IsMesablurAllEnabled()) {
        return std::make_shared<GEKawaseBlurShaderFilter>(*params);
    }
    // 尝试动态加载或使用内置 MESA_BLUR
    ...
})

六、添加新效果

步骤1:确认 ParamType 定义

效果类头文件中:

DECLARE_GEFILTER_TYPEFUNC(GENewEffect, Drawing::GENewEffectParams);

步骤2:确认参数注册

ge_shader_filter_params.h 中:

GE_PARAMS_TYPE_INFO(GENewEffectParams, NEW_EFFECT, NewEffect);

步骤3:添加工厂注册

集中注册方式:ge_factory_register.cpp 中按字母序添加

分散注册方式: 在效果自己的 cpp 文件中添加

GE_FACTORY_REGISTER(GENewEffect)

步骤4:编译验证

hb build graphics_effect -i

步骤5:测试验证

hb build graphics_effect -t

七、常见问题

Q: "ParamType not found"

效果类缺少 ParamType 定义。

解决: 在效果类头文件中添加:

DECLARE_GEFILTER_TYPEFUNC(GEYourEffect, Drawing::GEYourEffectParams);

Q: "GetParams not found"

参数类型未注册或类型错误。

解决: 检查参数类型,确保 GE_PARAMS_TYPE_INFO 已注册。

Q: "No creator for type"

效果未在工厂注册。

解决:ge_factory_register.cpp 中添加对应注册。


八、关键文件

文件 路径 用途
工厂头文件 include/core/ge_effect_factory.h 类定义和注册宏
工厂实现 src/core/ge_effect_factory.cpp 工厂逻辑
效果注册 src/core/ge_factory_register.cpp 所有效果注册
工厂测试 test/unittest/ge_effect_factory_test.cpp TDD测试

文档版本: v1.0 最后更新: 2026-04-25 维护者: Graphics Effect Team