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

鸿蒙开发-Vulkan下也能自动省GPU?自适应可变速率着色

Vulkan 版自适应 VRS:用命令缓冲实现更灵活的着色率优化

如果你的图形引擎用的是 Vulkan 而不是 OpenGL ES,那自适应 VRS(Variable Rate Shading)的接入方式会有些不同。Vulkan 版的接口设计更符合 Vulkan 的风格——用句柄管理对象、用命令缓冲记录操作、用结构体传递参数。

这篇文章就来讲讲怎么在 Vulkan 环境下使用 XEngine 的自适应 VRS 特性。

Vulkan 版和 GLES 版有什么不同

最大的不同是 API 风格。GLES 版是直接调用函数,Vulkan 版是"创建对象 -> 录制命令 -> 销毁对象"的三步走模式。这和 Vulkan 本身的设计哲学是一致的:把操作记录到命令缓冲里,然后统一提交执行。

下面的流程图展示了 Vulkan 版自适应 VRS 的整体使用流程:

不支持

支持

查询扩展支持

是否支持自适应VRS?

退出或降级处理

创建 XEG_AdaptiveVRS 对象

每帧录制VRS命令到命令缓冲

提交命令缓冲执行

参数是否变化?

销毁旧对象并重建

退出时销毁对象

另外,Vulkan 版需要你通过HMS_XEG_EnumerateDeviceExtensionProperties接口来查询扩展支持,而不是 GLES 版的HMS_XEG_GetString

第一步:查询扩展支持

在 Vulkan 里查询 XEngine 扩展:

// 先查询支持的扩展数量uint32_tpropertyCount=0;HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,NULL);// 分配空间并查询扩展列表XEG_ExtensionProperties*properties=(XEG_ExtensionProperties*)malloc(sizeof(XEG_ExtensionProperties)*propertyCount);HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,properties);// 检查是否支持自适应 VRSbool supportsAdaptiveVRS=false;for(uint32_ti=0;i<propertyCount;i++){if(strcmp(properties[i].extensionName,XEG_ADAPTIVE_VRS_EXTENSION_NAME)==0){supportsAdaptiveVRS=true;break;}}free(properties);if(!supportsAdaptiveVRS){return;// 不支持}

HMS_XEG_EnumerateDeviceExtensionProperties接受三个参数:

  • physicalDevice:当前使用的 Vulkan 物理设备
  • pPropertyCount:指向扩展数量的指针。当pProperties为 NULL 时,返回支持的扩展数量
  • pProperties:指向XEG_ExtensionProperties数组的指针,用于接收查询结果

查询成功返回VK_SUCCESS,如果传入的数量不够则返回VK_INCOMPLETE

XEG_ADAPTIVE_VRS_EXTENSION_NAME的值是"XEG_adaptive_vrs"

第二步:创建 XEG_AdaptiveVRS 对象

Vulkan 的哲学是"万物皆对象"。自适应 VRS 也不例外,你需要先创建一个XEG_AdaptiveVRS句柄:

XEG_AdaptiveVRS adaptiveVRS=VK_NULL_HANDLE;XEG_AdaptiveVRSCreateInfo createInfo={.sType=XEG_STRUCTURE_TYPE_RT_SHADOWAO_CREATE_INFO,// 结构体类型// ... 其他创建参数};VkResult result=HMS_XEG_CreateAdaptiveVRS(device,&createInfo,&adaptiveVRS);if(result!=VK_SUCCESS){// 创建失败,处理错误return;}

HMS_XEG_CreateAdaptiveVRS有三个参数:

  • device:当前使用的VkDevice
  • pXegAdaptiveVRSCreateInfo:创建参数结构体的指针,不允许为空
  • pXegAdaptiveVRS:指向句柄的指针,创建成功后句柄会写入这里

当创建参数(比如分辨率、渲染区域等)发生变化时,你需要销毁旧对象、创建新对象。

第三步:录制自适应 VRS 命令

有了句柄之后,你可以在 Vulkan 命令缓冲里录制自适应 VRS 的计算命令:

// 准备描述信息XEG_AdaptiveVRSDescription description={// ... 每一帧需要更新的参数};// 录制命令到命令缓冲HMS_XEG_CmdDispatchAdaptiveVRS(commandBuffer,adaptiveVRS,&description);

HMS_XEG_CmdDispatchAdaptiveVRS有三个参数:

  • commandBuffer:当前记录命令的VkCommandBuffer,这个命令缓冲必须被提交到vkQueueSubmit才会真正执行
  • xegAdaptiveVRS:已创建的XEG_AdaptiveVRS对象
  • pXegAdaptiveVRSDescription:参数结构体的指针,不允许为空。这个结构体里的信息每一帧都需要更新

注意,这个函数只是把命令"录制"到命令缓冲里,并不会立即执行。你需要在合适的时候提交命令缓冲,命令才会真正运行。

第四步:销毁对象

当你不再需要自适应 VRS 的时候(比如游戏退出或者分辨率切换),记得销毁对象:

HMS_XEG_DestroyAdaptiveVRS(adaptiveVRS);

这一步很重要。Vulkan 不像 OpenGL 那样有自动的资源回收机制,你创建的每一个对象都需要手动销毁。

完整流程

// 1. 查询扩展支持uint32_tpropertyCount=0;HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,NULL);XEG_ExtensionProperties*properties=malloc(sizeof(XEG_ExtensionProperties)*propertyCount);HMS_XEG_EnumerateDeviceExtensionProperties(physicalDevice,&propertyCount,properties);bool supported=false;for(uint32_ti=0;i<propertyCount;i++){if(strcmp(properties[i].extensionName,XEG_ADAPTIVE_VRS_EXTENSION_NAME)==0){supported=true;break;}}free(properties);if(!supported)return;// 2. 创建对象XEG_AdaptiveVRS adaptiveVRS=VK_NULL_HANDLE;XEG_AdaptiveVRSCreateInfo createInfo={/* ... */};HMS_XEG_CreateAdaptiveVRS(device,&createInfo,&adaptiveVRS);// 3. 每帧:录制命令XEG_AdaptiveVRSDescription desc={/* 当前帧参数 */};HMS_XEG_CmdDispatchAdaptiveVRS(commandBuffer,adaptiveVRS,&desc);// 4. 退出时销毁HMS_XEG_DestroyAdaptiveVRS(adaptiveVRS);

和 GLES 版的对比

下面的流程图对比了 GLES 版和 Vulkan 版在执行方式上的差异:

Vulkan版

查询扩展

创建句柄对象

录制命令到命令缓冲

提交命令缓冲执行

手动销毁对象

GLES版

查询扩展

设置参数

直接调用函数执行

自动资源回收

方面GLES 版Vulkan 版
查询接口HMS_XEG_GetStringHMS_XEG_EnumerateDeviceExtensionProperties
参数设置HMS_XEG_AdaptiveVRSParameter逐个设置通过结构体传递
执行方式直接调用录制到命令缓冲
资源管理无显式销毁需要手动创建和销毁
对象模型XEG_AdaptiveVRS句柄

Vulkan 版的代码量确实比 GLES 版多一些,但换来的是更灵活的命令管理和更好的多线程支持。

使用建议

  1. 对象生命周期管理:创建参数变化时需要重建对象。建议用一个标志位来跟踪参数是否变化。

  2. 命令缓冲要提交HMS_XEG_CmdDispatchAdaptiveVRS只是录制命令,记得在合适的时候提交命令缓冲。

  3. 描述信息每帧更新XEG_AdaptiveVRSDescription里的信息每一帧都需要更新,因为着色率图是根据当前帧的输入动态计算的。

  4. 错误检查:创建函数返回VkResult,记得检查返回值是否为VK_SUCCESS

Vulkan 版自适应 VRS 适合那些已经用 Vulkan 做渲染引擎的项目。虽然接入成本比 GLES 版高一些,但能更好地融入 Vulkan 的渲染管线。

http://www.jsqmd.com/news/951453/

相关文章:

  • 优化 .NET WebAPI 的性能
  • 高效管理Obsidian图片:永久保存网络资源的终极方案
  • 如何5分钟搞定网易云插件安装:BetterNCM-Installer终极指南
  • 3分钟搞定番茄小说离线下载,打造你的个人数字图书馆 [特殊字符]
  • 从零到一:智能硬件电路设计全流程实战指南
  • 5分钟魔法变身:ImageToSTL让任何图片成为可触摸的3D浮雕
  • (Linux)线程理解与线程控制
  • 单火线智能开关改造:基于ESP8266与Domoticz的老房照明智能化方案
  • RapidOCR异构计算架构:实现10倍性能提升的实时文字识别技术突破
  • Multi-Agent协同机制:如何让智能体团队高效配合完成复杂任务
  • Sa-Token:一行代码搞定登录,Java鉴权框架还能这么简单
  • 3种高效方案:在ARM64设备上使用Box64运行Windows程序的完整指南
  • 终极免费SWF反编译工具:JPEXS Free Flash Decompiler完整使用指南
  • 实战指南:5步掌握RISC-V可视化处理器模拟器
  • DeepSeek V4发布
  • 重磅!2026论文AI生成免费工具终极测评榜单,查重不达标全额退款
  • 汽车OTA升级怎么保证安全?从固件签名到密钥全生命周期管理
  • 【jetson】训练图形分类推理模型
  • 衍射级次偏振态的研究
  • 【AI咨询落地实战指南】:20年专家亲授5大智能工具整合框架,错过再等3年?
  • 2026年买不锈钢瓦/铝镁锰瓦/彩石瓦被坑的5大陷阱:金宸伯全部帮你规避》 - 企业深度横评dyy6420
  • 大数据考试
  • OpenClaw + Kubernetes 运维:自动化配置生成,赋能高效应用管理
  • AI驱动的资金调度革命:3步实现转账自动化、风控实时化与审计可追溯化(附银行级API调用清单)
  • 终极优化:swinv2_tiny_window16_256.ms_in1k在NPU与CPU环境下的部署教程
  • 3分钟快速部署:Windows 11 24H2 LTSC应用商店完整解决方案
  • 从‘连连看’到人脸验证:聊聊Siamese Network(孪生神经网络)那些接地气的应用场景
  • 告别“假条截图+人工核验”时代:基于LLM的动态政策推理引擎上线实录(仅限首批200家内测企业)
  • 终极绘图神器:如何在Draw.io中3分钟集成Mermaid图表插件
  • 网卡绑定内核