前言

最近在优化游戏的时候,发现在在高通特定驱动版本的机器上(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执行完成。

一些处理细节:

  1. 因为Index Buffer相关的接口不是所有的都支持offset,所以Index buffer走预创建Buffer的方式。
  2. Shader里面会访问texture buffer,这个时候需要使用offset来做,为了减少Shader的修改,我们这部分数据也采用预创建buffer的方式来处理。

优化效果

优化前:

优化后:

可以看到优化前有很多峰值,优化后基本上看不到创建Buffer的开销,创建纹理的开销也正常。

总结

因为我们是大世界游戏,所以Buffer数量比较多,容易触发这个问题。不知道有没有人遇到这个问题,以及你们是如何解决的,欢迎一起讨论,解决的方式比较Trick,这里就把它记录下来。

参考

  1. https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glMapBufferRange.xhtml

高通个别驱动创建Buffer耗时高问题的解决的更多相关文章

  1. 高通 display 驱动【转】

    高通display驱动 0. 关键字 MDSS : 高通平台lcd multimedia Display sub system DSI: Display Serial Interface qcom,m ...

  2. 高通LCD驱动调试

    本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...

  3. (转)Unity导出Android在高通骁龙800以上CPU概率性崩溃解决方法研究

    Android上的奇葩问题真的是太多了,开始测试反馈说游戏在某些Android手机上随机crash,后来经过详细的测试发现随机闪退的手机都是搭载了高通骁龙800以上的CPU.然后连上真机当crash的 ...

  4. 高通Camera驱动分析【转】

    本文转载自:http://blog.csdn.net/liwei16611/article/details/53955711 1.Sensor slave配置 结构体msm_camera_sensor ...

  5. 高通GPIO驱动(DTS方式)

    gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...

  6. 【转】高通平台android 环境配置编译及开发经验总结

    原文网址:http://blog.csdn.net/dongwuming/article/details/12784535 1.高通平台android开发总结 1.1 搭建高通平台环境开发环境 在高通 ...

  7. 高通Android display架构分析

    目录(?)[-] Kernel Space Display架构介绍 函数和数据结构介绍 函数和数据结构介绍 函数和数据结构介绍 数据流分析 初始化过程分析 User Space display接口 K ...

  8. 高通Android display分析【转】

    本文转载自:http://blog.csdn.net/zhangchiytu/article/details/6777039 高通7系列硬件架构分析 如上图,高通7系列 Display的硬件部分主要由 ...

  9. 小米手机(HM1SW)高通开发android程序全过程

    小米手机(HM1SW)开发android程序全过程 修改历史: 2016年5月9日  --------  整理文档 a.增加了手机基本信息. b.增加360手机助手连接说明 2016年2月26日  - ...

  10. 高通android开发摘要

    一部分是开源的,可以从codeaurora.org上下载,还有一部分是高通产权的,需要从高通的网站上下载. 将高通产权的代码放到:vendor/qcom/proprietary 1. 设置bms一些参 ...

随机推荐

  1. Looper 源码分析

    //可以看到我们的Looper是存放在线程独有的ThreadLocal进行隔离的    //也就是每个线程独有一份Looper    static final ThreadLocal<Loope ...

  2. mysql中innodb_open_files限制导致数据库异常重启

    问题描述:收到监控软件告警,提示数据库发生重启,进去查看,截止到6/27 10:00 之前,作为主节点的orch1先重启,然后故障转移到orch2和orch3节点上.在持续到6/27 9:00 左右, ...

  3. selenium部分知识点总结

    selenium部分总结 最近写了一个selenium自动化脚本. 基于此总结一些常用的代码 1. 用户输入换行符不终止输入 strings = '' s = input('请输入:(q停止输入)') ...

  4. CentOS配置Django虚拟环境--坑点总结

    1.CentOS原装有python2.7,编译安装python3.X版本 2.sqlite-devel未安装 3.sqlite3版本过低报错 升级sqlite3版本 参考 https://blog.c ...

  5. 长连接Netty服务内存泄漏,看我如何一步步捉“虫”解决

    作者:京东科技 王长春 背景 事情要回顾到双11.11备战前夕,在那个风雨交加的夜晚,一个急促的咚咚报警,惊破了电闪雷鸣的黑夜,将沉浸在梦香,熟睡的我惊醒. 一看手机咚咚报警,不好!有大事发生了!电话 ...

  6. 3.2 构造器、this、包机制、访问修饰符、封装

    构造器 构造器:在实例化的一个对象的时候会给对象赋予初始值,因此我们可以通过修改构造器,来改变对象的初始值,构造器是完成对象的初始化,并不是创建对象 我们也可以创建多个构造器实现不同的初始化,即构造器 ...

  7. 聊聊开关和CPU之间故事

    目录 开关 电报和继电器 门电路 材料学的发展 继电器与哈佛Mark1号 真空管与巨人一号 晶体管与IBM608 计算机2大特性:计算能力和记忆能力 作者:小牛呼噜噜 | https://xiaoni ...

  8. MySQL WorkBench更换界面成中文的方法

    菜单页面更换 文章目录 菜单页面更换 汉化文件的xml文件我放在下面的网盘中了 1.找到MySQL的安装位置, 总结 汉化文件的xml文件我放在下面的网盘中了 1.找到MySQL的安装位置, 具体安装 ...

  9. 使用Kepserver 自带 DataLogger 功能 实现工控数据转储关系型数据库

    本文以 Mysql数据库为例,介绍使用 kepserver 的datalogger 功能转储数据到 mysql 第一步:下载安装 Mysql ODBC 数据库驱动前往 官网下载ODBC驱动https: ...

  10. [Flink] Flink Job运行状态正常,但日志中偶报“FlinkException: The file LOG does not exist on the TaskExecutor.”

    0 序言 Flink : 1.12 job start running time : 2022-12-27 17:40:47 problem throw time : 2023-05-11 16:41 ...