当前位置: 首页 > article >正文

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

业务流程

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

1

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


http://www.kler.cn/a/301913.html

相关文章:

  • SobarQube实现PDF报告导出
  • sql注入之二次注入(sqlilabs-less24)
  • springboot实现简单的数据查询接口(无实体类)
  • (附项目源码)nodejs开发语言,212 个性化音乐推荐系统的设计与实现,计算机毕设程序开发+文案(LW+PPT)
  • STM32 串口输出调试信息
  • Kafka-Eagle的配置——kafka可视化界面
  • FastAPI+Vue3零基础开发ERP系统项目实战课 20240906 上课笔记 fastapi的各种练习
  • 【深度学习 transformer】基于Transformer的图像分类方法及应用实例
  • idea同时装了两个版本,每次打开低版本都需要重新激活破解
  • 性能测试-jmeter脚本录制(十五)
  • RK3568平台开发系列讲解(LCD篇)Framebuffer开发
  • 大佬,简单解释下“嵌入式软件开发”和“嵌入式硬件开发”的区别
  • 【Unity学习心得】如何使用Unity制作“饥荒”风格的俯视角2.5D游戏
  • 汽车驾校开设无人机培训机构技术分析
  • 第十七章 番外 共现矩阵
  • 经典文献阅读之--Multi S-Graphs(一种高效的实时分布式语义关系协同SLAM)
  • ubuntu20.04/22.04/24.04 docker 容器安装方法
  • RB-SQL:利用检索LLM框架处理大型数据库和复杂多表查询的NL2SQL
  • JAVAWeb-XML-Tomcat(纯小白下载安装调试教程)-HTTP
  • 算法设计(二)
  • 【Java OJ】弦截法求根(循环)
  • 针对网上nbcio-boot代码审计的actuator方法的未授权访问漏洞和ScriptEngine的注入漏洞的补救
  • 基线代理 AI 系统架构
  • 一个以细节见功底的JAVA程序
  • MySQL——数据库的高级操作(二)用户管理(2)创建普通用户
  • 春招审核新策略:Spring Boot系统实现