文档管理中心

OpenGTX功能开发

概述

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

业务流程

LTPO的主要业务流程如下:

  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的开发接入,从流程上分别阐述每个步骤的实现和调用。详细代码请参考OpenGTX Sample

设置项目配置项

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

收起
自动换行
深色代码主题
复制
  1. "metadata": [
  2. {
  3. "name": "GraphicsAccelerateKit_LTPO",
  4. "value": "true"
  5. }
  6. ],

头文件引用

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

收起
自动换行
深色代码主题
复制
  1. // 引用OpenGTX头文件 opengtx_base.h
  2. #include <graphics_game_sdk/opengtx_base.h>

编写CMakeLists.txt

收起
自动换行
深色代码主题
复制
  1. find_library(
  2. # Sets the name of the path variable.
  3. opengtx-lib
  4. # Specifies the name of the NDK library that you want CMake to locate.
  5. libopengtx.so
  6. )
  7. find_library(
  8. # Sets the name of the path variable.
  9. GLES-lib
  10. # Specifies the name of the NDK library that you want CMake to locate.
  11. GLESv3
  12. )
  13. find_library(
  14. # Sets the name of the path variable.
  15. hilog-lib
  16. # Specifies the name of the NDK library that you want CMake to locate.
  17. hilog_ndk.z
  18. )
  19. target_link_libraries(entry PUBLIC
  20. ${opengtx-lib} ${GLES-lib} ${hilog-lib}
  21. )

OpenGTX初始化

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

  1. 调用HMS_OpenGTX_CreateContext接口创建OpenGTX上下文实例。如果返回nullptr,则说明OpenGTX上下文实例创建失败,或当前硬件设备不支持开启OpenGTX。

    收起
    自动换行
    深色代码主题
    复制
    1. // 创建OpenGTX上下文实例
    2. OpenGTX_Context *contextGtx_ = HMS_OpenGTX_CreateContext(nullptr);
    3. if (contextGtx_ == nullptr) {
    4. return false;
    5. }
  2. 调用HMS_OpenGTX_SetConfiguration接口属性配置,包含LTPO模式、目标帧率、包名、游戏类型、分辨率、游戏关键线程等属性。

    收起
    自动换行
    深色代码主题
    复制
    1. // 初始化OpenGTX接口调用错误码
    2. OpenGTX_ErrorCode errorCode = OPENGTX_SUCCESS;
    3. // OpenGTX属性配置结构体
    4. OpenGTX_ConfigDescription config;
    5. // LTPO调度模式
    6. config.mode = SCENE_MODE;
    7. // 游戏设置目标帧率
    8. config.targetFPS = OGBT_TARGET_FPS_90;
    9. // 游戏包名
    10. config.packageName = OGBT_PACKAGE_NAME.data();
    11. // 游戏版本
    12. config.appVersion = OGBT_APP_VERSION.data();
    13. // 引擎类型
    14. config.engineType = OTHERS_ENGINE;
    15. // 引擎版本
    16. config.engineVersion = OGBT_ENGINE_VERSION.data();
    17. // 游戏类别
    18. config.gameType = MOBA;
    19. // 游戏最高画质等级
    20. config.pictureQualityMaxLevel = UHD;
    21. // 游戏设置最大分辨率
    22. config.resolutionMaxValue = OpenGTX_ResolutionValue { OGBT_RES_HEIGHT, OGBT_RES_WIDTH};
    23. // 游戏逻辑线程
    24. config.gameMainThreadId = OGBT_GAME_MAIN_THREAD_ID;
    25. // 游戏渲染线程
    26. config.gameRenderThreadId = OGBT_GAME_RENDER_THREAD_ID;
    27. // 游戏运行其他关键线程
    28. config.gameKeyThreadIds[0] = OGBT_GAME_DEFAULT_THREAD_ID;
    29. config.gameKeyThreadIds[1] = OGBT_GAME_DEFAULT_THREAD_ID;
    30. config.gameKeyThreadIds[2] = OGBT_GAME_DEFAULT_THREAD_ID;
    31. config.gameKeyThreadIds[3] = OGBT_GAME_DEFAULT_THREAD_ID;
    32. config.gameKeyThreadIds[4] = OGBT_GAME_DEFAULT_THREAD_ID;
    33. // 游戏图形API是否为Vulkan
    34. config.vulkanSupport = true;
    35. // 初始化OpenGTX实例,配置OpenGTX属性
    36. errorCode = HMS_OpenGTX_SetConfiguration(contextGtx_, &config);
    37. if (errorCode != OPENGTX_SUCCESS) {
    38. GOLOGE("HMS_OpenGTX_SetConfiguration execution failed, error code: %d.", errorCode);
    39. return false;
    40. }
  3. 调用HMS_OpenGTX_Activate接口激活OpenGTX上下文实例。

    收起
    自动换行
    深色代码主题
    复制
    1. // 激活OpenGTX上下文实例
    2. errorCode = HMS_OpenGTX_Activate(contextGtx_);
    3. if (errorCode != OPENGTX_SUCCESS) {
    4. GOLOGE("HMS_OpenGTX_Activate execution failed, error code: %d.", errorCode);
    5. return false;
    6. }
  4. 调用HMS_OpenGTX_Deactivate接口去激活OpenGTX上下文实例。(在需要关闭OpenGTX功能时调用此接口。去激活后,调用HMS_OpenGTX_DispatchGameSceneInfo等接口将不会生效)。

    收起
    自动换行
    深色代码主题
    复制
    1. // 去激活OpenGTX上下文实例
    2. errorCode = HMS_OpenGTX_Deactivate(contextGtx_);
    3. if (errorCode != OPENGTX_SUCCESS) {
    4. GOLOGE("HMS_OpenGTX_Deactivate execution failed, error code: %d.", errorCode);
    5. }

OpenGTX关键信息更新

  1. 游戏切换不同游戏场景后调用HMS_OpenGTX_DispatchGameSceneInfo接口发送游戏场景信息,包含场景类型、指定帧率、调度帧率范围、当前分辨率等信息。

    收起
    自动换行
    深色代码主题
    复制
    1. // OpenGTX游戏场景信息结构体
    2. OpenGTX_GameSceneInfo gameSceneInfo;
    3. // 游戏场景类型ID
    4. gameSceneInfo.sceneID = OTHERS_SCENE;
    5. // 游戏场景描述
    6. gameSceneInfo.description = OGBT_DESCRIPTION.data();
    7. // 游戏场景推荐帧率
    8. gameSceneInfo.recommendFPS = OGBT_RECOMMEND_FPS;
    9. // 游戏场景最小帧率
    10. gameSceneInfo.minFPS = OGBT_MIN_FPS;
    11. // 游戏场景最大帧率
    12. gameSceneInfo.maxFPS = OGBT_MAX_FPS;
    13. // 屏幕分辨率 高度
    14. gameSceneInfo.resolutionCurValue.height = OGBT_RES_HEIGHT;
    15. // 屏幕分辨率 宽度
    16. gameSceneInfo.resolutionCurValue.width = OGBT_RES_WIDTH;
    17. // OpenGTX接收游戏场景信息
    18. errorCode = HMS_OpenGTX_DispatchGameSceneInfo(contextGtx_, &gameSceneInfo);
    19. if (errorCode != OPENGTX_SUCCESS) {
    20. GOLOGE("HMS_OpenGTX_DispatchGameSceneInfo execution failed, error code: %d.", errorCode);
    21. return false;
    22. }
  2. 每帧渲染前调用HMS_OpenGTX_DispatchFrameRenderInfo接口发送游戏帧渲染信息,包含游戏主相机的位置和欧拉角。

    收起
    自动换行
    深色代码主题
    复制
    1. // OpenGTX游戏渲染信息结构体
    2. OpenGTX_FrameRenderInfo frameRenderInfo;
    3. // 主相机位置
    4. frameRenderInfo.mainCameraPosition = {0.0f, 0.0f, 0.0f};
    5. // 主相机欧拉角
    6. frameRenderInfo.mainCameraRotate = {0.0f, 0.0f, 0.0f};
    7. // OpenGTX接收游戏渲染信息
    8. errorCode = HMS_OpenGTX_DispatchFrameRenderInfo(contextGtx_, &frameRenderInfo);
    9. if (errorCode != OPENGTX_SUCCESS) {
    10. GOLOGE("HMS_OpenGTX_DispatchFrameRenderInfo execution failed, error code: %d.", errorCode);
    11. return false;
    12. }
  3. 每帧渲染前如遇到网络时延档位变化,调用HMS_OpenGTX_DispatchNetworkInfo接口发送游戏网络信息。包含服务器IP地址、网络时延等信息。

    收起
    自动换行
    深色代码主题
    复制
    1. // OpenGTX游戏网络信息结构体
    2. OpenGTX_NetworkInfo networkInfo;
    3. // OpenGTX游戏网络时延结构体
    4. OpenGTX_NetworkLatency networkLatency;
    5. // 网络总时延
    6. networkLatency.total = OGBT_NETWORK_LATENCY_TOTAL;
    7. // 网络上行时延
    8. networkLatency.up = OGBT_NETWORK_LATENCY_UP;
    9. // 网络下行时延
    10. networkLatency.down = OGBT_NETWORK_LATENCY_DOWN;
    11. // 游戏网络时延
    12. networkInfo.networkLatency = networkLatency;
    13. // 游戏服务器IP地址
    14. networkInfo.networkServerIP = OGBT_NETWORK_SERVER_IP.data();
    15. // OpenGTX接收游戏网络信息
    16. errorCode = HMS_OpenGTX_DispatchNetworkInfo(contextGtx_, &networkInfo);
    17. if (errorCode != OPENGTX_SUCCESS) {
    18. GOLOGE("HMS_OpenGTX_DispatchNetworkInfo execution failed, error code: %d.", errorCode);
    19. return false;
    20. }

销毁OpenGTX实例

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

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

收起
自动换行
深色代码主题
复制
  1. // 销毁OpenGTX上下文实例并释放内存资源
  2. errorCode = HMS_OpenGTX_DestroyContext(&contextGtx_);
  3. predictionPaused_ = (errorCode == OPENGTX_SUCCESS);
  4. if (errorCode != OPENGTX_SUCCESS) {
  5. GOLOGE("HMS_OpenGTX_DestroyContext execution failed, error code: %d.", errorCode);
  6. return false;
  7. }
在 指南 中进行搜索
请输入您想要搜索的关键词