鸿蒙(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 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

相关推荐
Random_index1 小时前
#Uniapp篇:支持纯血鸿蒙&发布&适配&UIUI
uni-app·harmonyos
鸿蒙自习室5 小时前
鸿蒙多线程开发——线程间数据通信对象02
ui·harmonyos·鸿蒙
SuperHeroWu77 小时前
【HarmonyOS】鸿蒙应用接入微博分享
华为·harmonyos·鸿蒙·微博·微博分享·微博sdk集成·sdk集成
期待未来的男孩7 小时前
华为FusionCube 500-8.2.0SPC100 实施部署文档
华为
岳不谢9 小时前
VPN技术-VPN简介学习笔记
网络·笔记·学习·华为
zhangjr05759 小时前
【HarmonyOS Next】鸿蒙实用装饰器一览(一)
前端·harmonyos·arkts
Industio_触觉智能10 小时前
如何在开源鸿蒙OpenHarmony开启SELinux模式?RK3566鸿蒙开发板演示
openharmony·selinux·开源鸿蒙·鸿蒙开发板·rk3566开发板
诗歌难吟46416 小时前
初识ArkUI
harmonyos
SameX16 小时前
HarmonyOS Next 设备安全特性深度剖析学习
harmonyos
郭梧悠17 小时前
HarmonyOS(57) UI性能优化
ui·性能优化·harmonyos