鸿蒙(API 12 Beta6版)超帧功能开发【ABR功能开发】

业务流程

基于相机运动感知策略的ABR主要业务流程如下:

  1. 用户进入ABR适用的游戏场景。
  2. 游戏应用调用HMS_ABR_CreateContext接口并指定图形API类型,创建ABR上下文实例。
  3. 游戏应用调用HMS_ABR_SetTargetFps接口初始化ABR实例,配置目标帧率属性,ABR结合目标帧率属性实时感知GPU负载状态。
  4. 游戏应用调用HMS_ABR_SetScaleRange接口初始化ABR实例,配置Buffer分辨率因子范围属性。
  5. 游戏应用调用HMS_ABR_Activate接口激活ABR上下文实例。
  6. 游戏应用调用HMS_ABR_UpdateCameraData接口并传入相机运动信息,包含相机旋转、位移信息。
  7. 游戏应用在使能ABR的Buffer渲染前调用HMS_ABR_MarkFrameBuffer_GLES接口,对Buffer进行标记。
  8. Buffer渲染处理。
  9. 绘制UI。
  10. 一帧送显。
  11. 用户退出ABR适用的游戏场景。
  12. 游戏应用调用HMS_ABR_DestroyContext接口销毁ABR上下文实例并释放内存资源。

开发步骤

本节阐述基于相机运动感知策略的ABR使用,从流程上分别阐述每个步骤的实现和调用,详细代码请参考图形开发Sample(ABR)。

设置项目配置项

在"src/main/module.json5"module层级中添加以下配置。

复制代码
"metadata": [
  {
    "name": "GraphicsAccelerateKit_ABR",
    "value": "true"
  }
]

头文件引用

引用Graphics Accelerate Kit ABR头文件:abr_gles.h。

复制代码
// 引用ABR头文件 abr_gles.h
#include <graphics_game_sdk/abr_gles.h>

编写CMakeLists.txt

复制代码
find_library(
    # Sets the name of the path variable.
    abr-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    libabr.so
)
find_library(
    # Sets the name of the path variable.
    GLES-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    GLESv3
)
find_library(
    # Sets the name of the path variable.
    hilog-lib
    # Specifies the name of the NDK library that you want CMake to locate.
    hilog_ndk.z
)

target_link_libraries(entry PUBLIC
    ${abr-lib} ${GLES-lib} ${hilog-lib}
)

ABR初始化

在应用创建Surface后会触发其事件回调函数Core::OnSurfaceCreated(),在该函数中完成ABR上下文实例创建、ABR属性配置和功能激活。其中ABR上下文实例负责管理ABR整个生命周期。

  1. 调用HMS_ABR_CreateContext接口创建ABR上下文实例,指定图形API类型。

    // 创建ABR上下文实例,指定图形API类型
    ABR_Context *context_ = HMS_ABR_CreateContext(RENDER_API_GLES);
    if (context_ == nullptr) {
    GOLOGE("HMS_ABR_CreateContext execution failed.");
    return false;
    }

  2. 调用HMS_ABR_SetTargetFps接口初始化ABR实例,根据游戏的目标帧率配置ABR的目标帧率属性。

    // 初始化ABR接口调用错误码
    ABR_ErrorCode errorCode = ABR_SUCCESS;

    // 初始化ABR实例,配置ABR的目标帧率属性。例如游戏目标帧率为120fps,则配置ABR的目标帧率属性为120fps
    errorCode = HMS_ABR_SetTargetFps(context_, 120);
    if (errorCode != ABR_SUCCESS) {
    GOLOGE("HMS_ABR_SetTargetFps execution failed, error code: %d.", errorCode);
    return false;
    }

  3. 调用HMS_ABR_SetScaleRange接口初始化ABR实例,配置Buffer分辨率因子范围属性。

    // 初始化ABR实例,配置Buffer分辨率因子范围属性,结合具体游戏分辨率、画质设置合适的范围// 例如设置ABR对Buffer分辨率进行0.5~1.0倍的自适应调整errorCode = HMS_ABR_SetScaleRange(context_, 0.5f, 1.0f);if (errorCode != ABR_SUCCESS) { GOLOGE("HMS_ABR_SetScaleRange execution failed, error code: %d.", errorCode); return false;}

  4. 调用HMS_ABR_Activate接口激活ABR上下文实例。

    // 激活ABR上下文实例
    errorCode = HMS_ABR_Activate(context_);
    if (errorCode != ABR_SUCCESS) {
    GOLOGE("HMS_ABR_Activate execution failed, error code: %d.", errorCode);
    return false;
    }

相机运动数据更新

在帧循环中,ABR根据获取的实时相机运动数据进行Buffer分辨率因子决策。

调用HMS_ABR_UpdateCameraData接口并传入相机运动信息,包含相机旋转、位移信息。

复制代码
// 相机运动数据结构体,设置每帧实时相机运动数据
ABR_CameraData cameraData;
cameraData.position = static_cast<ABR_Vector3>(camera_.GetPosition());
cameraData.rotation = static_cast<ABR_Vector3>(camera_.GetRotation());

// 每帧相机运动数据更新
errorCode = HMS_ABR_UpdateCameraData(context_, &cameraData);
if (errorCode != ABR_SUCCESS) {
    GOLOGE("HMS_ABR_UpdateCameraData execution failed, error code: %d.", errorCode);
    return false;
}

自适应渲染**

在帧循环中,ABR将对所标记的Buffer进行自适应渲染处理。

  1. 选择着色器处理耗时较高的Buffer,并在Buffer渲染前绑定帧缓冲。

    // 创建帧缓冲对象
    GLuint fbo;
    glGenFramebuffers(1, &fbo);
    // 绑定帧缓冲
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);

  2. 调用HMS_ABR_MarkFrameBuffer_GLES接口对Buffer进行标记。

    // 在Buffer渲染前调用,执行失败不影响Buffer正常渲染
    errorCode = HMS_ABR_MarkFrameBuffer_GLES(context_);
    if (errorCode != ABR_SUCCESS) {
    GOLOGE("HMS_ABR_MarkFrameBuffer_GLES execution failed, error code: %d.", errorCode);
    }

  3. 执行Buffer原有渲染流程。

销毁ABR实例

在Surface销毁时,会触发其事件回调函数Core::OnSurfaceDestroyed(),在该函数中完成ABR实例的销毁。

调用HMS_ABR_DestroyContext接口销毁ABR实例,释放内存资源。

复制代码
// 销毁ABR上下文实例并释放内存资源
ABR_ErrorCode errorCode = HMS_ABR_DestroyContext(&context_);
if (errorCode != ABR_SUCCESS) {
    GOLOGE("HMS_ABR_DestroyContext execution failed, error code: %d.", errorCode);
    return false;
}

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档 》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

总结

鸿蒙---作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关推荐
zd20057212 小时前
openharmony-x86-brew 移植记
鸿蒙系统
resh_people12 小时前
开源鸿蒙平台 KMP_CMP 三方库「Kermit」适配全流程
华为·开源·harmonyos
李游Leo14 小时前
HarmonyOS 7 EasyGo + ArkUI Navigation:平行视界主副页筛选事务与跨栏撤销一致性【鸿蒙心迹】
华为·harmonyos
HwJack2015 小时前
【共创稿事节】HarmonyOS 7空间应用的可用性测试和体验评估小方法分享
华为·harmonyos·可用性测试
m0_7381858215 小时前
Flutter 鸿蒙化实战:flutter_scankit 适配 OpenHarmony,华为 ScanKit 扫码
flutter·华为·harmonyos·鸿蒙
zhangfeng113316 小时前
Ag / Cu / Au / Ru / Ir / Rh银 铜 金 钌铱 铑 纳米尺度下的 导电性 + 扩散/迁移缺点
人工智能·华为·ai编程·npu
用户1179104883317 小时前
别让AI随便启动你的LSP:hmharness给语言服务器加SHA256门禁 GitHub:swsgbl/hmharness
ai编程·harmonyos
李游Leo20 小时前
HarmonyOS 7 + Share Kit-Window Kit:精准碰一碰屏幕坐标的窗口换算与落点拒绝【鸿蒙心迹】
华为·harmonyos
翼辉cto21 小时前
Compose Multiplatform KV 存储库 multiplatform-settings 的 OpenHarmony 鸿蒙化适配实战
华为·harmonyos
事圆则缓1 天前
Flutter 开发鸿蒙实战:从 OpenHarmony 适配版到 HAP 构建与插件接入
flutter·华为·harmonyos