1.避免同步和Flushing操作

  • OpenGL ES的命令执行通常是在command buffer中积累一定量的命令后,再做批处理执行,这样效率会更高;但是一些OpenGL ES命令必须flush command buffer,也有需要同时flush和阻塞直到命令执行完毕,过度调用这类函数会严重影响性能。
    glFlush 发送命令buffer到图形硬件,一直阻塞直到提交到图形硬件,但是不用等到命令执行,提交完成即可。
    glFinish 不仅flush命令到图形硬件,而且阻塞直到所有提交的命令执行完成。

    • 注意: command buffer满了会自动执行flush
    • glReadPixels 命令也会阻塞
  • 通常在OpenGL ES中两种情况下,调用glFlush 或者 glFinish
      1. App进入后台,此时在GPU运行命令会崩溃;
      1. 在不同的contexts中共享OpenGL ES objects(比如VBO或textures)需要调用glFlush来使得在不同的context中使用。

2.避免过度调用Query OpenGL ES 查询状态的函数,glGetXXX方法

  • 像glGetError(),需要检索任何状态变量之前执行以前的命令,这种同步机制迫使图形硬件与CPU同步运行,减少图形硬件并行执行的可能性。
  • 通常我们会执行像glCheckFramebufferStatus,glGetProgramInfoLog,glValidateProgram等等,来查询相关状态是否合法,GPUImage就是这么做的。

3.用OpenGL ES来管理资源,像顶点,纹理坐标,法线等数据

  • 很多数据都可以直接存储在OpenGL ES rendering context中,OpenGL ES实现可以将数据转换成最适合图形硬件的格式,一次来提升性能;比如说一些不常改变的数据,可以通过在GPU申请专用内存存储(像VBO),比如:
glGenBuffers(1, &staticBuffer);
glBindBuffer(GL_ARRAY_BUFFER, staticBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(staticVertexData), staticVertexData, GL_STATIC_DRAW);//GL_STATIC_DRAW 就是hint,还有常变动的数据使用GL_DYNAMIC_DRAW或GL_STREAM_DRAW,在OpenGL ES中后两者等价的

4.使用双缓冲来避免资源冲突

  • 当CPU和GPU同时访问OpenGL ES对象时,比如其中一个CPU想改变一个正在被GPU使用的对象数据,会阻塞直到没有再被使用;一旦修改开始,另一个想要访问就必须直到修改完成。都是同步操作;

  • 比如说从CPU传输texture object到GPU,可以显式地创建两个相同大小的对象;下图展示了双缓冲方法。当GPU操作一个纹理时,CPU会修改另一个纹理。在初始启动之后,CPU或GPU都不会闲置。尽管显示了纹理,这个解决方案几乎适用于任何类型的OpenGL ES对象。

5.注意OpenGL ES的状态

  • OpenGL ES实现维护一组复杂的状态数据,包括设置为glEnable或glDisable函数的开关、当前的shader program和uniform attributes、当前绑定的texture,以及当前绑定的顶点缓冲区和它们启用的顶点属性。硬件有一个当前状态,它被编译并缓存起来。切换状态很昂贵,所以最好设计你的应用程序来最小化状态切换。

  • 不要再次设置已经设置了的状态。一旦启用了特性,就不需要再次启用它。例如,如果多次调用相同参数的glUniform函数,OpenGL ES只会简单地执行指令更新状态。

6.用OpenGL ES对象封装状态,通常指使用VBO和VAO

  • 很多数据从一开始初始化后,不再需要逐帧重新配置,使用VAO和VBO共同管理对象状态,减少很多的不必要指令执行。使用VBO减少CPU到GPU之间的数据拷贝次数,VAO通常用来管理多个VBO,常见用法:
 // 创建和绑定vao。glGenVertexArrays(1,&vao1);glBindVertexArray(vao1);// 在刚创建的vao1中配置各属性glBindBuffer(GL_ARRAY_BUFFER, vbo1);// 指定各个属性数据,格式,大小和起始地址glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE,sizeof(staticFmt), (void*)offsetof(staticFmt,position));glEnableVertexAttribArray(GLKVertexAttribPosition);glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_UNSIGNED_SHORT, GL_TRUE,sizeof(staticFmt), (void*)offsetof(staticFmt,texcoord));glEnableVertexAttribArray(GLKVertexAttribTexCoord0);glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE,sizeof(staticFmt), (void*)offsetof(staticFmt,normal));glEnableVertexAttribArray(GLKVertexAttribNormal);glBindBuffer(GL_ARRAY_BUFFER, vbo2);glVertexAttribPointer(GLKVertexAttribColor, 4, GL_UNSIGNED_BYTE, GL_TRUE,sizeof(dynamicFmt), (void*)offsetof(dynamicFmt,color));glEnableVertexAttribArray(GLKVertexAttribColor);// 返回执行各项配置之前的状态glBindBuffer(GL_ARRAY_BUFFER,0);glBindVertexArray(0);

OpenGLES性能优化相关推荐

  1. Unity性能优化 :合批篇

    前言 本系列为一些性能优化的小知识,是日常游戏开发中与性能表现的一些点,本篇为该系列文章的第二篇,前篇链接: 第一篇: Unity性能优化:资源篇 在早期Unity中,对于合批的处理手段主要是下面三种 ...

  2. kali2020进入单模式_蚂蚁集团技术专家山丘:性能优化的常见模式及趋势

    陈显铭(山丘) 读完需要 6分钟 速读仅需 2 分钟 陈显铭,花名山丘,就职于蚂蚁集团,对分布式应用架构.服务化.性能优化等有深入的理解.参与支付宝支付链路核心系统,设计.调优应用系统关键能力, 高效 ...

  3. MegEngine推理性能优化

    MegEngine推理性能优化 MegEngine「训练推理一体化」的独特范式,通过静态图优化保证模型精度与训练时一致,无缝导入推理侧,再借助工业验证的高效卷积优化技术,打造深度学习推理侧极致加速方案 ...

  4. asp.net程序性能优化的七个方面

    asp.net程序性能优化的七个方面 一.数据库操作 1.用完马上关闭数据库连接 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器 ...

  5. java criteria限制条数_java架构—Oracle SQL性能优化

    (1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先 ...

  6. ab测试nginx Nginx性能优化

    转自:https://www.cnblogs.com/nulige/p/9369700.html 1.性能优化概述 在做性能优化前, 我们需要对如下进行考虑 1.当前系统结构瓶颈 观察指标 压力测试 ...

  7. RHEL/CentOS通用性能优化、安全配置参考

    RHEL/CentOS通用性能优化.安全配置参考 本文的配置参数是笔者在实际生产环境中反复实践总结的结果,完全适用绝大多数通用的高负载.安全性要求的网络服务器环境.故可以放心使用. 若有异议,欢迎联系 ...

  8. Android开发——布局性能优化的一些技巧(一)

    0. 前言 上一篇我们分析了为什么LinearLayout会比RelativeLayout性能更高,意义在于分析了这两种布局的实现源码,算是对一个小结论的证明过程,但是对布局性能的优化效果,对这两种布 ...

  9. Web性能优化实践——应用层性能优化

    随着公司项目的进一步推广,用户数量的增加,已经面临着单台服务器不能负载的问题. 这次的优化由于时间关系主要分两步走,首先优化应用层代码以提高单台服务器的负载和吞吐率.之后再进行分表,引入队列.MemC ...

最新文章

  1. docker容器互联
  2. USB接口定义(Z)
  3. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码
  4. 作为一名程序员,我一直为中国的软件产业感到苦恼。
  5. “const char*”类型的值不能用于初始化“char”类型的实体
  6. 】oracle em配置常用命令
  7. 十六进制编辑器_Windows最佳免费十六进制编辑器
  8. 高数复习: 多元函数微分学及其应用
  9. 小苹果源地址_越狱常用源地址推荐
  10. 文字时钟罗盘动态html代码_抖音时钟原生JS文字钟源码下载
  11. Web渗透测试工程师:入门知识
  12. 人力资源管理-人际交往中的6个心理效应
  13. 固定资产盘点常用的方法,你了解多少?
  14. 网站首页导航栏移入移出动画(一)slideDown、slideUp
  15. python csv文件和xlsx文件混杂时,提取指定列数据并合并
  16. cmd命令行使用pip install XXX库时,出现安装失败。
  17. 方差分析分类及SAS实现代码
  18. vue在微信里面的兼容问题_vue 微信浏览器缓存问题解决方案
  19. 老男孩教育Linux运维培训32期决心书
  20. java毕业生设计校园失物招领系统计算机源码+系统+mysql+调试部署+lw

热门文章

  1. Verilog代码BCD计数器
  2. 如何治好自己的选择恐惧症
  3. 如何下载并应用pyinstaller(python+cmd)
  4. ChatGPT 引爆全网热议,如果当它是“聊天机器人”,那你可就错了
  5. SpringBoot整合Javamail实现邮件发送
  6. 如何将SketchUp插件添加到菜单栏及工具条
  7. 现在不少别墅、村屋等自建房,屋主会尽量“扩大面积”,却违反了很多基本的风水原则...
  8. Proteus8.9 VSM Studio Keil编译器仿真AT89C51RD2系列017_lcd12864横屏
  9. 神经网络的泛化能力、学习速率
  10. Java中判断字符串是否为空