鸿蒙(API 12 Beta6版)超帧功能开发【顶点标记】

概述

OpenGTX是GPU Turbo X的开放式入口,根据游戏开发者主动提供的游戏过程中的关键信息,使能LTPO(动态帧率/刷新率)等游戏加速方案,助力游戏开发者打造高画质、高流畅、低功耗极致体验。LTPO通过动态感知游戏渲染状态、游戏场景、设备状态等关键信息,动态调整游戏的帧率/刷新率以及设备的SOC/DDR频率。

1

业务流程

LTPO的主要业务流程如下:

2

  1. 用户进入游戏。
  2. 游戏应用调用[HMS_OpenGTX_CreateContext]接口创建OpenGTX上下文实例。
  3. 游戏应用调用[HMS_OpenGTX_SetConfiguration]接口初始化配置实例属性,包含LTPO模式、目标帧率、包名、游戏类型、分辨率、游戏关键线程等属性。
  4. 游戏应用调用[HMS_OpenGTX_Activate]接口激活OpenGTX上下文实例。
  5. 游戏切换不同游戏场景后调用[HMS_OpenGTX_DispatchGameSceneInfo]接口发送游戏场景信息,包含场景类型、指定帧率、调度帧率范围、当前分辨率等信息。
  6. 游戏应用在每帧渲染前调用[HMS_OpenGTX_DispatchFrameRenderInfo]接口发送游戏帧渲染信息,包含游戏主相机的位置和欧拉角。
  7. 游戏应用在每帧渲染前如遇到网络时延档位变化,调用[HMS_OpenGTX_DispatchNetworkInfo]接口发送游戏网络信息,包含服务器IP地址、网络时延等信息。
  8. 游戏应用正常绘制。
  9. 一帧送显。
  10. 每帧结束,将帧尾决策帧率、决策设备频率通知到设备。
  11. 用户退出游戏。
  12. 游戏应用调用[HMS_OpenGTX_DestroyContext]接口销毁OpenGTX上下文实例并释放内存资源。

开发步骤

本节介绍OpenGTX的开发接入,从流程上分别阐述每个步骤的实现和调用。

设置项目配置项

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

"metadata": [{"name": "GraphicsAccelerateKit_LTPO","value": "true"}
]

头文件引用

引用Graphics Accelerate Kit OpenGTX头文件:opengtx_base.h。

// 引用OpenGTX头文件 opengtx_base.h
#include <graphics_game_sdk/opengtx_base.h>

编写CMakeLists.txt

find_library(# Sets the name of the path variable.opengtx-lib# Specifies the name of the NDK library that you want CMake to locate.libopengtx.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${opengtx-lib} ${GLES-lib} ${hilog-lib}
)

OpenGTX初始化

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

  1. 调用[HMS_OpenGTX_CreateContext]接口创建OpenGTX上下文实例。
// 创建OpenGTX上下文实例
OpenGTX_Context *context_ = HMS_OpenGTX_CreateContext(nullptr);
if (context_ == nullptr) {return false;
}
  1. 调用[HMS_OpenGTX_SetConfiguration]接口属性配置,包含LTPO模式、目标帧率、包名、游戏类型、分辨率、游戏关键线程等属性。
// 初始化OpenGTX接口调用错误码
OpenGTX_ErrorCode errorCode = OPENGTX_SUCCESS;
// OpenGTX属性配置结构体
OpenGTX_ConfigDescription config;
// LTPO调度模式
config.mode = ADAPTIVE_MODE;
// 游戏设置目标帧率
config.targetFPS = 120;
// 游戏包名
config.packageName = (char*)"OpenGTX";
// 游戏版本
config.appVersion = (char*)"1.1.0";
// 引擎类型
config.engineType = UNREAL;
// 引擎版本
config.engineVersion = (char*)"4.26.2";
// 游戏类别
config.gameType = RPG;
// 游戏最高画质等级
config.pictureQualityMaxLevel = HD;
// 游戏设置最大分辨率
config.resolutionMaxValue = OpenGTX_ResolutionValue { 1280, 720};
// 游戏逻辑线程
config.gameMainThreadId = 11;
// 游戏渲染线程
config.gameRenderThreadId = 11;
// 游戏运行其他关键线程
config.gameKeyThreadIds[0] = 0;
config.gameKeyThreadIds[1] = 0;
config.gameKeyThreadIds[2] = 0;
config.gameKeyThreadIds[3] = 0;
config.gameKeyThreadIds[4] = 0;
// 游戏图形API是否为Vulkan
config.vulkanSupport = false;
// 初始化OpenGTX实例,配置OpenGTX属性
errorCode = HMS_OpenGTX_SetConfiguration(context_, &config);
if (errorCode != OPENGTX_SUCCESS) {return false;
}
  1. 调用[HMS_OpenGTX_Activate]接口激活OpenGTX上下文实例。
// 激活OpenGTX上下文实例
errorCode = HMS_OpenGTX_Activate(context_);
if (errorCode != OPENGTX_SUCCESS) {return false;
}
  1. 调用[HMS_OpenGTX_Deactivate]接口去激活OpenGTX上下文实例。(在需要关闭OpenGTX功能时调用此接口。去激活后,调用[HMS_OpenGTX_DispatchGameSceneInfo]等接口将不会生效)。
// 去激活OpenGTX上下文实例
errorCode = HMS_OpenGTX_Deactivate(context_);
if (errorCode != OPENGTX_SUCCESS) {return false;
}

OpenGTX关键信息更新

  1. 游戏切换不同游戏场景后调用[HMS_OpenGTX_DispatchGameSceneInfo]接口发送游戏场景信息,包含场景类型、指定帧率、调度帧率范围、当前分辨率等信息。
// OpenGTX游戏场景信息结构体
OpenGTX_GameSceneInfo gameSceneInfo;
// 游戏场景类型ID
gameSceneInfo.sceneID = OTHERS_SCENE;
// 游戏场景描述
gameSceneInfo.description = (char*)"其他场景";
// 游戏场景推荐帧率
gameSceneInfo.recommendFPS = 60;
// 游戏场景最小帧率
gameSceneInfo.minFPS = 30;
// 游戏场景最大帧率
gameSceneInfo.maxFPS = 90;
// 屏幕分辨率 高度
gameSceneInfo.resolutionCurValue.height = 360;
// 屏幕分辨率 宽度
gameSceneInfo.resolutionCurValue.width = 7680;
// OpenGTX接收游戏场景信息
errorCode = HMS_OpenGTX_DispatchGameSceneInfo(context_, &gameSceneInfo); 
if (errorCode != OPENGTX_SUCCESS) {return false;
}
  1. 每帧渲染前调用[HMS_OpenGTX_DispatchFrameRenderInfo]接口发送游戏帧渲染信息,包含游戏主相机的位置和欧拉角。
// OpenGTX游戏渲染信息结构体
OpenGTX_FrameRenderInfo frameRenderInfo;
// 主相机位置
frameRenderInfo.mainCameraPosition = { 0.0f, 0.0f, 0.0f };
// 主相机欧拉角
frameRenderInfo.mainCameraRotate = { 0.0f, 0.0f, 0.0f };
// OpenGTX接收游戏渲染信息
errorCode = HMS_OpenGTX_DispatchFrameRenderInfo(context_, &frameRenderInfo);
if (errorCode != OPENGTX_SUCCESS) {return false;
}
  1. 每帧渲染前如遇到网络时延档位变化,调用[HMS_OpenGTX_DispatchNetworkInfo]接口发送游戏网络信息。包含服务器IP地址、网络时延等信息。
// OpenGTX游戏网络信息结构体
OpenGTX_NetworkInfo networkInfo;
// OpenGTX游戏网络时延结构体
OpenGTX_NetworkLatency networkLatency;
// 网络总时延
networkLatency.total = 50;
// 网络上行时延
networkLatency.up = 10;
// 网络下行时延
networkLatency.down = 40;
// 游戏网络时延
networkInfo.networkLatency = networkLatency;
// 游戏服务器IP地址
networkInfo.networkServerIP = (char*)"10.10.10.10";
// OpenGTX接收游戏网络信息
errorCode = HMS_OpenGTX_DispatchNetworkInfo(context_, &networkInfo); 
if (errorCode != OPENGTX_SUCCESS) {return false;
}

销毁OpenGTX实例

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

  1. 调用[HMS_OpenGTX_DestroyContext]接口销毁OpenGTX实例,释放内存资源。
// 销毁OpenGTX上下文实例并释放内存资源
errorCode = HMS_OpenGTX_DestroyContext(&context_);
if (errorCode != OPENGTX_SUCCESS) {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.ppmy.cn/news/1525604.html

相关文章

ACL 2024:交叉领域情感分析——论文阅读笔记

前言 阅读了一篇ABSA的论文&#xff0c;在这里写下自己的一些理解小笔记&#xff0c;可能有点小乱&#xff0c;原文在这下面&#xff1a; 论文链接&#xff1a;Refining and Synthesis: A Simple yet Effective Data Augmentation Framework for Cross-Domain Aspect-based Sen…

vue2响应式系统是如何实现的(手写)

引言 喜欢请点赞&#xff0c;支持点在看。 关注牛马圈&#xff0c;干货不间断。 忆往昔 回头看&#xff0c;已经使用vue2多年&#xff0c;虽然也掌握了其他几种前端框架&#xff0c;但对vue2是真爱。 核心概念 Object.defineProperty Vue 2的响应式系统核心是使用了Object.de…

深入理解java并发编程之aqs框架

跟synchronized 相比较&#xff0c;可重入锁ReentrankLock其实原理有什么不同&#xff1f; 所得基本原理是为了达到一个目的&#xff1b;就是让所有线程都能看到某种标记。synchronized通过在对象头中设置标记实现了这一目的&#xff0c;是一种JVM原生的锁实现方式。而Reentran…

​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​

1. 请尽可能详细地说明&#xff0c;进程和线程的区别&#xff0c;分别有哪些应用场景&#xff1f;进程间如何通信&#xff1f;线程间如何通信&#xff1f;你的回答中不要写出示例代码。 进程和线程是操作系统中的两个基本概念&#xff0c;它们在计算机系统中扮演着不同的角色&…

《数据结构(C语言版)第二版》第八章-排序(8.5-归并排序、8.6基数排序、8.7 外部排序)

8.5 归并排序 (Merging Sort) 【基本思想】 将两个或两个以上的有序表合并成一个有序表的过程。 将两个有序表合并成一个有序表的过程称为2-路归并&#xff0c;2-路归并最为简单和常用。 假设初始序列含有n个记录&#xff0c;则可看成是n个有序的子序列&#xff0c;每个子序列…

Git换行符自动转换参数core.autocrlf的用法

core.autocrlf 是 Git 中用于控制换行符自动转换的配置选项。它有以下几个可能的值&#xff1a; 1. true 作用&#xff1a;在 checkin 时将 CRLF 转换为 LF&#xff0c;在 checkout 时将 LF 转换为 CRLF。适用场景&#xff1a;适用于 Windows 用户&#xff0c;希望在本地文件…

如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)

一、简述 在我们编写控制台应用程序时&#xff0c;默认情况下程序的打印输出会在控制台窗口中进行显示&#xff0c;我们在写服务功能时在窗口中会不断打印消息输出&#xff0c;这个时候如果使用鼠标点击了控制台窗口&#xff0c;会阻塞程序的继续运行&#xff0c;导致我们的程…

Python安装:Mac 使用brew 安装Python2 和 Python3

安装python ## python2 brew install python ## python3 brew install python3出现错误 Error: An unexpected error occurred during the brew link step The formula built, but is not symlinked into /usr/local Permission denied dir_s_mkdir - /usr/local/Frameworks …

uniapp媒体

uni.previewImage实现图片放大预览 // 图片预览函数function onPreview(index) {// 收集所有图片的urlvar urls pets.value.data.map(item > item.url)// 预览图片uni.previewImage({current: index, // 当前预览的图片索引urls: urls // 所有图片的url数组})}

HarmonyOS】ArkTS学习之基于TextTimer的简易计时器的elapsedTime最小时间单位问题

本文旨在纪录自己对TextTimer使用过程的疑惑问题 我在查看教程时候&#xff0c;发现很多博客在onTimer(event: (utc: number, elapsedTime: number) > void) 这里提到elapsedTime&#xff1a;计时器经过的时间&#xff0c;单位为毫秒。我不清楚是否为版本问题。 在我查看ver…

编写XBOX控制器实现鼠标键盘输入

1.核心部分, XINPUT输入封装 XInput封装https://mp.csdn.net/mp_blog/creation/editor/1420701282.对话框窗口编写 Win32 对话框封装-CSDN博客https://blog.csdn.net/Flame_Cyclone/article/details/142110008?spm1001.2014.3001.5501 3.使用到的其他封装 字符串编码转换与…

Azure web app has no access to openai private endpoint in virtual network

题意&#xff1a;"Azure Web 应用无法访问虚拟网络中的 OpenAI 私有端点。" 问题背景&#xff1a; I am trying to host a web application similar to a private ChatGPT instance within a secluded virtual network, ensuring that theres no external internet …

以太网--TCP/IP协议(二)

上文中讲述了IP协议&#xff0c;本文主要来讲一下TCP协议。 TCP协议 &#xff08;1&#xff09;端到端通信 直接把源主机应用程序产生的数据传输到目的主机使用这 些数据的应用程序中&#xff0c;就是端到端通信。 &#xff08;2&#xff09;传输层端口 公认端口&#xff0…

CCF刷题计划——训练计划(反向拓扑排序)

训练计划 计算机软件能力认证考试系统 这道题70分还是很好拿的。后面30分需要用到 反向拓扑排序 &#xff0c;相对而言就麻烦点&#xff0c;需要逆序遍历。不着急&#xff0c;我们慢慢来。首先给出70分的代码。 本题可以学到&#xff1a;反向拓扑排序 70分题解&#xff1a;…

红黑树的删除

文章目录 前言一.删除的节点左子树右子树都有二.删除的节点只有左/右子树删除调整操作 三.删除的节点没有孩子1.删除的节点为红色2.删除的节点为黑色1).兄弟节点为黑色(1).兄弟节点至少有一个红色的孩子节点LL型RR型RL型LR型 (2).兄弟节点没有孩子或所有孩子为黑色 2).兄弟节点…

【贪心算法】贪心算法

贪心算法简介 1.什么是贪心算法2.贪心算法的特点3.学习贪心的方向 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.什么是贪心算法 与其说是…

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中&#xff0c;不同电脑的配置和操作系统&#xff08;如Win11与Win7&#xff09;可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行&#xff0c;需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下&a…

Integer 缓存

在 Java 中&#xff0c;如果你通过 new Integer(value) 显式创建一个 Integer 对象&#xff0c;以下几点需要注意&#xff1a; 内存中的 Integer 对象 缓存范围&#xff1a; Java 自动缓存的 Integer 对象范围是从 -128 到 127。这些对象在类加载时被创建并存储在内存中。 使…

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器&#xff08;案例&#xff1a;获取用户真实IP地址&#xff09; (★) 补充1&#xff1a;不同类型的客户端如何设…

使用@test-library/react的screen中的方法和直接使用getByText,getByTestId等的区别?

在 React Testing Library 中&#xff0c;screen 对象和直接使用 getByText, getByTestId 等方法之间的主要区别在于它们的使用方式和上下文。然而&#xff0c;从功能的角度来看&#xff0c;它们实际上是相互关联的&#xff0c;因为 screen 对象提供了一组封装好的查询方法&…