iOS 中OpenGL ES 优化 笔记 1
1,避免同步和Flushing操作
OpenGL ES的命令执行通常是在command buffer中积累一定量的命令后,再做批处理执行,这样效率会更高;但是一些OpenGL ES命令必须flush command buffer,也有需要同时flush和阻塞直到命令执行完毕,过度调用这类函数会严重影响性能。
glFlush 发送命令buffer到图形硬件,一直阻塞直到提交到图形硬件,但是不用等到命令执行,提交完成即可。
glFinish,glReadPixels 不仅flush命令到图形硬件,而且阻塞直到所有提交的命令执行完成。
command buffer满了会自动执行flush。
通常在OpenGL ES中两种情况下,调用glFlush 或者 glFinish:
1,App进入后台,此时在GPU运行命令会崩溃;
2,在不同的contexts中共享OpenGL ES objects(比如VBO或textures)需要调用glFlush来使得在不同的context中使用。
2,避免过度调用Query OpenGL ES 查询状态的函数,glGet*()之类的。
像glGetError(),需要检索任何状态变量之前执行以前的命令,这种同步机制迫使图形硬件与CPU同步运行,减少图形硬件并行执行的可能性。
通常我们会执行像glCheckFramebufferStatus,glGetProgramInfoLog,glValidateProgram等等,来查询相关状态是否合法,GPUImage就是这么做的。
3,用OpenGL ES来管理资源,像顶点,纹理坐标,法线等数据
很多数据都可以直接存储在OpenGL ES rendering context中,OpenGL ES实现可以将数据转换成最适合图形硬件的格式,一次来提升性能;比如说一些不常改变的数据,可以通过在GPU申请专用内存存储(像VBO),比如:
glGenBuffers(, &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(,&vao1);
glBindVertexArray(vao1); // 在刚创建的vao1中配置各属性
glBindBuffer(GL_ARRAY_BUFFER, vbo1); // 指定各个属性数据,格式,大小和起始地址
glVertexAttribPointer(GLKVertexAttribPosition, , GL_FLOAT, GL_FALSE,
sizeof(staticFmt), (void*)offsetof(staticFmt,position));
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribTexCoord0, , GL_UNSIGNED_SHORT, GL_TRUE,
sizeof(staticFmt), (void*)offsetof(staticFmt,texcoord));
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribNormal, , GL_FLOAT, GL_FALSE,
sizeof(staticFmt), (void*)offsetof(staticFmt,normal));
glEnableVertexAttribArray(GLKVertexAttribNormal); glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glVertexAttribPointer(GLKVertexAttribColor, , GL_UNSIGNED_BYTE, GL_TRUE,
sizeof(dynamicFmt), (void*)offsetof(dynamicFmt,color));
glEnableVertexAttribArray(GLKVertexAttribColor); // 返回执行各项配置之前的状态
glBindBuffer(GL_ARRAY_BUFFER,);
glBindVertexArray();
7,组织绘制指令最小化状态变更(这里没看太懂,先记录)
改变OpenGL ES状态没有立即的效果。相反,当您发出一个绘制指令时,OpenGL ES将执行绘制一组状态值所需的工作。您可以通过最小化状态更改来减少重新配置图形管道的CPU时间。例如,在应用程序中保留一个状态向量,并且只在绘制指令之间的状态更改时设置相应的OpenGL ES状态。
另一个有用的算法是状态排序,跟踪您需要做的绘图操作和每个需要的状态变化量,然后排序它们以连续使用相同的状态执行操作。
OpenGL ES的iOS实现可以缓存一些需要在状态间进行有效切换的配置数据,但是每个独特的状态集的初始配置需要更长的时间。对于一致的性能,您可以“预热”每个状态设置,您计划在设置例程中使用:
启用您计划使用的状态配置或着色器。
使用状态配置绘制少量顶点。
刷新OpenGL ES上下文,就不会显示在这个预热阶段的绘图。
参考网站:
iOS 中OpenGL ES 优化 笔记 1的更多相关文章
- OpenGL ES 学习笔记 - Overview - 小旋的博客
移动端图形标准中,目前 OpenGL ES 仍然是比较通用的标准(Vulkan 则是新一代),这里新开一个系列用于记录学习 OpenGL ES 的历程,以便查阅理解. OverView OpenGL ...
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之二:lib3ds加载模型 作者:u0u0 - iTyran 在上一节中,我们分析了OBJ格式.OBJ格式优点是文本形式,可读 ...
- OpenGL ES学习笔记(三)——纹理
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <OpenGL ES学习笔记( ...
- [iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ格式分析
[iTyran原创]iPhone中OpenGL ES显示3DS MAX模型之一:OBJ文件格式分析作者:yuezang - iTyran 在iOS的3D开发中常常需要导入通过3DS MAX之类 ...
- 浅谈iOS中的视图优化
引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...
- IOS 中openGL使用教程2(openGL ES 入门篇 | 绘制一个多边形)
在上一篇我们学习了如何搭建IOS下openGL的开发环境,接下来我们来学习如何绘制一个多边形. 在2.0之前,es的渲染采用的是固定管线,何为固定管线,就是一套固定的模板流程,局部坐标变换 -> ...
- IOS 中openGL使用教程1(openGL ES 入门篇 | 搭建openGL环境)
OpenGL版本 iOS系统默认支持OpenGl ES1.0.ES2.0以及ES3.0 3个版本,三者之间并不是简单的版本升级,设计理念甚至完全不同,在开发OpenGL项目前,需要根据业务需求选择合适 ...
- OpenGL ES学习笔记(一)——基本用法、绘制流程与着色器编译
首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上 ...
- OpenGL ES学习笔记(二)——平滑着色、自适应宽高及三维图像生成
首先申明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. <Android学习笔记--O ...
随机推荐
- MyBatis 中 resultMap 详解
resultMap 是 Mybatis 最强大的元素之一,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中.如在实际应用中,有一个表为(用户角色表),通过查询用户表信息展示页面, ...
- java中通用权限管理设计(转)
原文地址:http://www.cnblogs.com/a7345678/archive/2008/09/25/1298838.html 转自博客园暗夜精灵-鬼才阁 实现业务系统中的用户权限管理 B/ ...
- 55.fielddata内存控制以及circuit breaker断路器
课程大纲 fielddata加载 fielddata内存限制 监控fielddata内存使用 circuit breaker 一.fielddata加载 fielddata加载到内存的过程是lazy加 ...
- jsonview插件的常见使用方法整理
Jsonview是目前最热门的一款开发者工具插件,确切的来说jQuery JSONView是一款非常实用的格式化和语法高亮JSON格式数据查看器jQuery插件.它是查看json数据的神器. 下载地址 ...
- 抓包工具的感触(charles and fiddler)
最近测mobile,一直徘徊在fiddler 和 charles之间: charles 的证书装了 ,才能正常抓包: 后来因为重定向,分享到扣扣,微信的跳转功能,跳转到wap 或者跳转到PC 或者跳 ...
- BZOJ 3747 洛谷 3582 [POI2015]Kinoman
[题解] 扫描线+线段树. 我们记第i部电影上次出现的位置是$pre[i]$,我们从$1$到$n$扫描,每次区间$(pre[i],i]$加上第i部电影的贡献$w[f[i]]$,区间$[pre[pre[ ...
- Python基础之生成器、迭代器
一.字符串格式化进阶 Python的字符串格式化有两种方式: 百分号方式.format方式,由于百分号的方式相对来说比较老,在社区里讨论format方式有望取代百分号方式,下面我们分别介绍一下这两种方 ...
- [luoguP2915] [USACO08NOV]奶牛混合起来Mixed Up Cows(DP)
传送门 f[i][S] 表示当前集合为 S,最后一个数为 i 的最优解 f[i][S] += f[j][S - i] (j, i ∈ S && j != i && ab ...
- 利用python进行数据分析--(阅读笔记一)
以此记录阅读和学习<利用Python进行数据分析>这本书中的觉得重要的点! 第一章:准备工作 1.一组新闻文章可以被处理为一张词频表,这张词频表可以用于情感分析. 2.大多数软件是由两部分 ...
- SecureCRT复制粘贴快捷键
复制:[Ctrl]+[Insert] 粘贴:[Shift]+[Insert]