# HarmonyOS 游戏场景感知:让你的游戏APP和系统更好地配合 什么是游戏场景感知你玩手机游戏的时候有没有遇到过这种情况玩着玩着手机变烫了然后游戏开始卡顿这是因为手机温度升高后系统会降低 CPU/GPU 的频率来降温导致游戏性能下降。游戏场景感知就是用来解决这个问题的。它让游戏可以和系统对话游戏告诉系统我现在在做什么系统告诉游戏设备现在状态怎么样。这样双方就能更好地配合既保证游戏流畅又不让手机过热。简单说游戏场景感知就像游戏和系统之间的一个对讲机让它们能实时沟通。核心功能游戏场景感知提供以下功能初始化场景感知建立游戏和系统之间的连接订阅设备信息实时监听设备状态变化比如温度更新游戏场景信息告诉系统游戏当前在做什么查询设备信息主动查询设备当前状态环境搭建硬件要求设备类型华为手机、平板和 PC/2in1HarmonyOS 系统HarmonyOS 5.0.2 Release 及以上软件要求DevEco Studio 版本DevEco Studio 5.0.2 Release 及以上HarmonyOS SDK 版本HarmonyOS 5.0.2 Release SDK 及以上搭建步骤安装 DevEco Studio去华为开发者官网下载安装配置开发环境确保网络环境正常设备调试使用真机进行调试项目结构├── entry/src/main/ets // 代码区 │ ├── entryability │ │ └── EntryAbility.ets // 程序入口类 │ └── pages │ └── Index.ets // 主界面 │ ├── gamePerformanceInit() // 初始化接口 │ ├── subscribeDeviceState() // 订阅设备信息接口 │ ├── unSubscribeDeviceState() // 取消订阅设备信息接口 │ ├── updateGameSceneInfo() // 更新游戏场景信息 │ └── queryDeviceInfo() // 查询设备信息 └── entry/src/main/resources // 资源文件目录这个项目结构很简单主要就是一个页面文件所有逻辑都在里面。整体流程概览下面是 ArkTS 版本游戏场景感知的核心使用流程低中高导入模块初始化场景感知订阅设备状态变化接收温度变化通知温度等级判断开启高画质开启中等画质降低画质更新游戏场景信息下面是游戏与系统交互的完整流程温度变化场景切换游戏结束游戏启动初始化场景感知服务订阅设备状态设备状态变化?调整游戏画质上报场景信息系统优化资源分配取消订阅第一步导入模块import{gamePerformance}fromkit.GameServiceKit;导入 Game Service Kit 模块。gamePerformance是游戏场景感知的核心接口。第二步初始化场景感知使用游戏场景感知之前需要先初始化。gamePerformanceInit(){letgamePageInfo:gamePerformance.GamePackageInfo{messageType:0,extra:,appVersion:1.0,bundleName:com.xxx.xxx.huawei}try{gamePerformance.init(gamePageInfo).then((){this.logTextgamePerformance initialized successfully.})}catch(err){leterrorerrasBusinessError;console.error(Failed to initialize gamePerformance. errCode is${error.code}, errMessage is${error.message});this.logTextFailed to initialize gamePerformance. errCode is${error.code}, errMessage is${error.message};}}gamePerformance.init()接收一个GamePackageInfo对象包含messageType消息类型0 表示初始化extra额外信息appVersion应用版本号bundleName应用包名初始化成功后游戏和系统之间的对讲机就建立起来了。第三步订阅设备信息订阅设备信息后当设备状态发生变化比如温度升高系统会主动通知游戏。privatesubscribeDeviceState(){try{gamePerformance.on(deviceStateChanged,(data:gamePerformance.DeviceInfo){console.info(Device temperature level change to${data.tempLevel}.);this.logTextDevice temperature level change to${data.tempLevel}.;});this.logTextSubscribe device state event succeeded.;console.info(Subscribe device state event succeeded.);}catch(err){leterrorerrasBusinessError;console.error(Subscribe device state change failed. errCode is${error.code}, errMessage is${error.message});this.logTextFailed to subscribe device state change event. errCode is${error.code}, errMessage is${error.message};}}gamePerformance.on(deviceStateChanged, callback)注册一个监听器。当设备状态变化时callback会被调用data里包含设备信息比如tempLevel温度等级。游戏可以根据温度等级来调整画质温度低可以开高画质温度高降低画质减少发热第四步取消订阅设备信息不需要监听设备状态时取消订阅。privateunSubscribeDeviceState(){try{gamePerformance.off(deviceStateChanged);this.logTextUnSubscribe device state event succeeded.;console.info(UnSubscribe device state event succeeded.);}catch(err){leterrorerrasBusinessError;console.error(Unsubscribe device state change failed. errCode is${error.code}, errMessage is${error.message});this.logTextFailed to unsubscribe device state change event. errCode is${error.code}, errMessage is${error.message};}}gamePerformance.off(deviceStateChanged)取消之前注册的监听器。第五步更新游戏场景信息游戏可以告诉系统当前在做什么系统会根据这些信息来优化资源分配。privateupdateGameSceneInfo(){try{letgameSceneInfo:gamePerformance.GameSceneInfo{messageType:2,extra:,sceneID:1111,importanceLevel:1111};gamePerformance.updateGameInfo(gameSceneInfo).then((){console.info(Update game scene info succeeded.);this.logTextUpdate game scene info succeeded.}).catch((error:BusinessError){console.error(Update game scene info failed. errCode is${error.code}, errMessage is${error.message});this.logTextFailed to update game scene info. errCode is${error.code}, errMessage is${error.message};});}catch(err){leterrorerrasBusinessError;console.error(Update game scene info failed. errCode is${error.code}, errMessage is${error.message});this.logTextFailed to update game scene info. errCode is${error.code}, errMessage is${error.message};}}gamePerformance.updateGameInfo()上报游戏场景信息messageType消息类型2 表示场景信息sceneID场景 ID标识游戏当前在哪个场景比如主菜单、战斗、过场动画importanceLevel重要性等级告诉系统这个场景有多重要系统会根据这些信息来调整资源分配。比如在重要战斗场景系统会优先保证性能在过场动画场景可以适当降低性能来省电。第六步查询设备信息除了被动接收通知游戏也可以主动查询设备状态。privatequeryDeviceInfo(){try{letgpuParam:gamePerformance.DeviceInfoParameter{deviceInfoType:gamePerformance.DeviceInfoType.GPU}letthermalParam:gamePerformance.DeviceInfoParameter{deviceInfoType:gamePerformance.DeviceInfoType.THERMAL}letgameInfos:ArraygamePerformance.DeviceInfoParameter[gpuParam,thermalParam];gamePerformance.getDeviceInfoByScope(gameInfos).then((deviceInfo:gamePerformance.DeviceInfo){console.info(Query device info succeeded, tempLevel is${deviceInfo.tempLevel});this.logTextQuery device info succeeded.});}catch(err){leterrorerrasBusinessError;console.error(Query device info failed. errCode is${error.code}, errMessage is${error.message});this.logTextQuery device info failed. errCode is${error.code}, errMessage is${error.message};}}gamePerformance.getDeviceInfoByScope()查询设备信息。可以指定要查询的设备信息类型DeviceInfoType.GPUGPU 状态DeviceInfoType.THERMAL温度状态返回的DeviceInfo包含设备的详细状态信息。实际应用场景游戏场景感知在实际游戏开发中有很多用途动态画质调整// 根据温度等级动态调整画质gamePerformance.on(deviceStateChanged,(data:gamePerformance.DeviceInfo){if(data.tempLevel3){// 温度高降低画质setGraphicsQuality(low);}elseif(data.tempLevel2){// 温度中等中等画质setGraphicsQuality(medium);}else{// 温度低高画质setGraphicsQuality(high);}});场景资源调度// 进入战斗场景告诉系统需要更多资源letbattleScene:gamePerformance.GameSceneInfo{messageType:2,extra:,sceneID:SCENE_BATTLE,importanceLevel:10// 高重要性};gamePerformance.updateGameInfo(battleScene);// 进入菜单场景告诉系统可以降低资源letmenuScene:gamePerformance.GameSceneInfo{messageType:2,extra:,sceneID:SCENE_MENU,importanceLevel:1// 低重要性};gamePerformance.updateGameInfo(menuScene);适用场景游戏场景感知特别适合以下场景大型 3D 游戏画面复杂需要动态调整性能竞技游戏对帧率要求高需要稳定的性能长时间游戏需要防止手机过热跨平台游戏需要适配不同设备的性能注意事项初始化顺序必须先调用init()初始化再使用其他接口订阅和取消订阅成对使用避免内存泄漏场景信息更新要及时更新场景信息让系统能正确调度资源错误处理每个接口调用都要处理错误保证游戏稳定性性能影响频繁查询设备信息会有性能开销要合理控制查询频率总结游戏场景感知是一个让游戏和系统更好配合的功能核心流程初始化场景感知服务订阅设备状态变化通知根据设备状态调整游戏画质更新游戏场景信息让系统优化资源分配主动查询设备信息了解设备当前状态不需要时取消订阅掌握了这些你就能让你的游戏在 HarmonyOS 上跑得更流畅、更省电。