鸿蒙(API 12 Beta6版)超帧功能开发【ABR功能开发】
业务流程 基于相机运动感知策略的ABR主要业务流程如下: 用户进入ABR适用的游戏场景。 游戏应用调用[HMS_ABR_CreateContext]接口并指定图形API类型,创建ABR上下文实例。 游戏应用调用[HMS_ABR_SetTargetFps]接口初始化ABR实例,配置目标帧率属性,ABR结合目标帧率属性实时感知GPU负载状态。 游戏应用调用[HMS_ABR_SetScaleRange]
业务流程
基于相机运动感知策略的ABR主要业务流程如下:
- 用户进入ABR适用的游戏场景。
- 游戏应用调用[HMS_ABR_CreateContext]接口并指定图形API类型,创建ABR上下文实例。
- 游戏应用调用[HMS_ABR_SetTargetFps]接口初始化ABR实例,配置目标帧率属性,ABR结合目标帧率属性实时感知GPU负载状态。
- 游戏应用调用[HMS_ABR_SetScaleRange]接口初始化ABR实例,配置Buffer分辨率因子范围属性。
- 游戏应用调用[HMS_ABR_Activate]接口激活ABR上下文实例。
- 游戏应用调用[HMS_ABR_UpdateCameraData]接口并传入相机运动信息,包含相机旋转、位移信息。
- 游戏应用在使能ABR的Buffer渲染前调用[HMS_ABR_MarkFrameBuffer_GLES]接口,对Buffer进行标记。
- Buffer渲染处理。
- 绘制UI。
- 一帧送显。
- 用户退出ABR适用的游戏场景。
- 游戏应用调用[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整个生命周期。
- 调用[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;
}
- 调用[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;
}
- 调用[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;} ```
- 调用[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进行自适应渲染处理。
- 选择着色器处理耗时较高的Buffer,并在Buffer渲染前绑定帧缓冲。
// 创建帧缓冲对象
GLuint fbo;
glGenFramebuffers(1, &fbo);
// 绑定帧缓冲
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
- 调用[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);
}
- 执行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北向、南向开发环境搭建
- 《鸿蒙开发基础》
- 《鸿蒙开发进阶》
- 《鸿蒙开发实战》
《鸿蒙NEXT开发学习库》qr23.cn/FBD4cY
总结
鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。
并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿
更多推荐
所有评论(0)