高通个别驱动创建Buffer耗时高问题的解决
前言
最近在优化游戏的时候,发现在在高通特定驱动版本的机器上(855,855+等),创建VB的耗时跟VB的数量成正比,这个应该是驱动的bug。跟官方人员确认过,确实是有这个问题,他们给的解决方案是减少Buffer的数量,经过一轮优化后,Buffer数量减少了将近30%,但是这个耗时的问题还是没能解决,在正常机型上创建100个VB的开销大约在几ms的时间,但是在有问题的机器上可以达到30多ms。那这个问题有没有可能解决呢?是有方法的,这里也把解决过程记录下,给遇到相关问题的人做个参考。
解决方案
尝试1
首先想到的是像内存管理一样预创建特定大小的Buffer,在后面所有使用到的地方直接从Pool里面去取,然后调用glBufferSubData去更新,这个时候Buffer的创建开销确实大缩短了,在framepro中基本上看不到Buffer创建的耗时,但是耗时开销转移了!转移到了创建纹理相关的操作上!!!而且耗时跟你预创建Buffer的数量成正比。

创建VB开销小了很多

创建纹理开销显著增加
那这个方案看起来是行不通的。
尝试2
既然是跟Buffer数量成正比,那就直接减少Buffer数量,尝试像Vulkan、Metal、D3D12来管理内存,思路就是像内存管理一样创建特定大小的大Buffer,然后使用ringbuffer的方式来管理内存,通过glMapBufferRange来局部更新内容。
理论上是完全成立的,但是在实际的时候还是有不少小坑需要处理。一开始使用glMapBufferRange (GL_MAP_INVALIDATE_RANGE_BIT | GL_MAP_UNSYNCHRONIZED_BIT ) 来更新buffer,但是发现性能出奇的差,不过同样的操作在另外一个联发科的机器上就没有问题,可能跟驱动的实现有关。
我们在来看另外一个标记GL_MAP_UNSYNCHRONIZED_BIT,这个标记的意思就是你驱动别做同步了,我自己保证数据的正确性。
GL_MAP_UNSYNCHRONIZED_BIT indicates that the GL should not attempt to synchronize pending operations on the buffer prior to returning from glMapBufferRange. No GL error is generated if pending operations which source or modify the buffer overlap the mapped region, but the result of such previous and any subsequent operations is undefined.
看到这个标记感觉应该能跑通了,我们使用这个标记并配合RingBuffer来实现内存的管理,这里为了保证数据准确有两个实现方式,一个是确保RingBuffer足够大,不会出现数据被写的情况,另外一个是加一个Fence来做同步,小于一定数量的时候强制等GPU执行完成。
一些处理细节:
- 因为Index Buffer相关的接口不是所有的都支持offset,所以Index buffer走预创建Buffer的方式。
- Shader里面会访问texture buffer,这个时候需要使用offset来做,为了减少Shader的修改,我们这部分数据也采用预创建buffer的方式来处理。
优化效果
优化前:

优化后:

可以看到优化前有很多峰值,优化后基本上看不到创建Buffer的开销,创建纹理的开销也正常。
总结
因为我们是大世界游戏,所以Buffer数量比较多,容易触发这个问题。不知道有没有人遇到这个问题,以及你们是如何解决的,欢迎一起讨论,解决的方式比较Trick,这里就把它记录下来。
参考
- https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glMapBufferRange.xhtml
高通个别驱动创建Buffer耗时高问题的解决的更多相关文章
- 高通 display 驱动【转】
高通display驱动 0. 关键字 MDSS : 高通平台lcd multimedia Display sub system DSI: Display Serial Interface qcom,m ...
- 高通LCD驱动调试
本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...
- (转)Unity导出Android在高通骁龙800以上CPU概率性崩溃解决方法研究
Android上的奇葩问题真的是太多了,开始测试反馈说游戏在某些Android手机上随机crash,后来经过详细的测试发现随机闪退的手机都是搭载了高通骁龙800以上的CPU.然后连上真机当crash的 ...
- 高通Camera驱动分析【转】
本文转载自:http://blog.csdn.net/liwei16611/article/details/53955711 1.Sensor slave配置 结构体msm_camera_sensor ...
- 高通GPIO驱动(DTS方式)
gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...
- 【转】高通平台android 环境配置编译及开发经验总结
原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...
- 高通Android display架构分析
目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...
- 高通Android display分析【转】
本文转载自:http://blog.csdn.net/zhangchiytu/article/details/6777039 高通7系列硬件架构分析 如上图,高通7系列 Display的硬件部分主要由 ...
- 小米手机(HM1SW)高通开发android程序全过程
小米手机(HM1SW)开发android程序全过程 修改历史: 2016年5月9日 -------- 整理文档 a.增加了手机基本信息. b.增加360手机助手连接说明 2016年2月26日 - ...
- 高通android开发摘要
一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...
随机推荐
- 点亮LED灯_STM32第一课
基本原理 初始化Hal库 HAL_Init(); 系统时钟 SystemClock_Config(); GPIOB初始化:GPIOB模式为推挽输出,GPIO引脚为Pin_5.0.1代表红绿蓝LED ...
- day115:MoFang:种植园我的背包&种植园道具购买
目录 1.我的背包 2.道具购买 1.我的背包 1.在种植园点击背包按钮打开我的背包 在种植园打开背包,orchard.html,代码: <!DOCTYPE html> <html& ...
- Redis(七)缓存穿透、缓存击穿、缓存雪崩以及分布式锁
应用问题解决 1 缓存穿透 1.1 访问结构 正常情况下,服务器接收到浏览器发来的web服务请求,会先去访问redis缓存,如果缓存中存在数据则直接返回,否则会去查询数据库里面的数据,然后保存在red ...
- Spring很常用的@Conditional注解的使用场景和源码解析
你好,我是刘牌! 介绍 今天要分享的是Spring的注解@Conditional,@Conditional是一个条件注解,它的作用是判断Bean是否满足条件,如果满足条件,则将Bean注册进IOC中, ...
- 京东小程序接入ARVR的技术方案和性能调优
作者:京东零售 戴旭 京东小程序是一个开放技术平台,正在被越来越多的头部品牌选择,用于站内私域流量的营销和运营.诸如各种日化.奢侈品等品牌对ARVR有较多的诉求,希望京东小程序引擎提供一些底层能力,叠 ...
- 【Lua】VSCode 搭建 Lua 开发环境
前言 最近在找工作,基本所有的岗位都会问到 Lua(甚至拼 UI 的都要求会 Lua),咱能怎么办呢,咱也只能学啊-- 工欲善其事,必先利其器.第一步,先来把环境配置好吧! 当前适用版本: LuaBi ...
- SQL Server 2022 AlwaysOn新特性之包含可用性组介绍
由于技术能力有限,文章仅能进行简要分析和说明,如有不对的地方,请指正,谢谢. SQL Server的容灾功能一直弱于Oracle和MySQL,无法自动同步元数据(用户.登录名.权限.SQL 代理作业. ...
- 小程序 TS 封装API
通俗易懂不说废话,拿去用,看两遍就能理解. 1 const { baseUrl } = require('./env').dev; 2 const token = wx.getStorageSync( ...
- TypeScript FromData添加数组
本文解决的是,如何向FromData添加对象数组. 在FormData中添加数据并使用Axios向后台请求数据,参数是列表对象File[] 结果接口请求时,数据变成了字符串: 试试直接使用File[] ...
- LeetCode 654:最大二叉树
先立个flag吧,坚持每日刷题的小目标,希望自己能坚持下来,如果有需要一起打卡的uu,可以一起监督哈,在菜鸡的路上慢慢变好 题目:最大二叉树 给定一个不重复的整数数组 nums . 最大二叉树 可以用 ...