记得这个调用吗?方法原型是:
EGLBoolean eglMakeCurrent(
EGLDisplay display,
EGLSurface draw,
EGLSurface read,
EGLContext context
);
为了弄懂这个方法,我们需要搞清楚Display
、Surface
、Context
这几个概念。
在使用EGL 的过程中,会发现EGL 相关的调用都经常需要我们传入一个类型为Display
的参数。
顾名思义,Display
是一个连接,用于连接设备上的底层窗口系统。
所以在调用EGL 方法之前,需要先创建、初始化这个Display
连接。步骤如下:
EGLint majorVersion;
EGLint minorVersion;
EGLDisplay display;
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (display == EGL_NO_DISPLAY) {
// 无法打开到底层窗口系统的连接
}
if (!eglInitialize(display, &majorVersion, &minorVersion)) {
// 无法初始化EGL
}
通常情况下传入EGL_DEFAULT_DISPLAY
作为eglGetDisplay
的参数就可以了,EGL 会自动返回默认的Display
。
Context
不是什么神秘的东西,它仅仅是一个容器,里面放着两个东西:
Context
下发起的GL调用指令。(OpenGL 调用是异步的)总的来说,Context
是设计来存储渲染相关的输入数据。
对应的Surface
则是设计来存储渲染相关的输出数据。
Surface
实际上是一个对底层窗口对象的拓展、或是一个有着额外辅助缓冲的像素映射(pixmap)。这些辅助缓存包括颜色缓存(color buffer)、深度缓冲(depth buffer)、模板缓冲(stencil buffer)。
那么eglMakeCurrent到底做了什么?
当发起 GL 调用指令(如:glDrawElements)的时候,这个调用会影响到哪个Context和Surface呢?答案就在 eglMakeCurrent
里。
EGLBoolean eglMakeCurrent(
EGLDisplay display,
EGLSurface draw,
EGLSurface read,
EGLContext context
);
eglMakeCurrent
把context
绑定到当前的渲染线程以及draw
和read
指定的Surface。
draw 用于除数据回读(glReadPixels、glCopyTexImage2D和glCopyTexSubImage2D)之外的所有GL 操作。
回读操作作用于read指定的Surface上的帧缓冲(frame buffer)。
因此,当我们在线程T上调用GL 指令,OpenGL ES 会查询T线程绑定是哪个Context C,进而查询是哪个Surface draw和哪个Surface read绑定到了这个Context C上。
某些情况下,我们想创建、使用多个Context,对于这种情况,需要注意以下几个情况:
Context
。Surface
到2个不同的Context
上。Surface
到2个Context
上,取决于使用的GPU的具体实现,可能成功,也可能失败。共享Context这种方式在加载阶段很有用。由于上传数据到GPU(尤其是纹理数据(textures))这类操作很重,如果想要维持帧率稳定,应该在另一个线程进行上传。
然而,出于上述3种情况的限制,必须在第一个Context之外,创建第二个Context,这个Context将使用第一个Context使用的内部状态信息。这两个Context即共享Context。
需要注意的是:这两个Context共享的只是内部状态信息,它们两个并不共享调用缓存(每个Context各自拥有一个调用缓存)。
创建第二个Context的方法:
EGLContext eglCreateContext(
EGLDisplay display,
EGLConfig config,
EGLContext share_context,
EGLint const * attrib_list);
第三个参数share_context
是最重要的,它就是第一个Context。
在第二个线程,不进行任何的绘制,只进行上传数据到GPU 的操作。所以,给第二个Context 的Surface 应该是一个像素缓冲(pixel buffer)Surface。
EGLSurface eglCreatePbufferSurface(
EGLDisplay display,
EGLConfig config,
EGLint const * attrib_list);
EGLBoolean eglSwapBuffers(
EGLDisplay display,
EGLSurface surface);
第一次看到这个调用的时候,我以为它的作用是对display
和surface
进行交换:) 槑
实际上,这里需要重点注意的是surface
。如果这里的`surface
是一个像素缓冲(pixel buffer)Surface,那什么都不会发生,调用将正确的返回,不报任何错误。
但如果surface
是一个双重缓冲surface(大多数情况),这个方法将会交换surface
内部的前端缓冲(front-buffer)和后端缓冲(back-surface)。
后端缓冲用于存储渲染结果,前端缓冲则用于底层窗口系统,底层窗口系统将缓冲中的颜色信息显示到设备上。
OpenGL ES 驱动和GPU以并行/异步的机制运行。发起GL 调用时,为了得到最好的性能,驱动会尝试尽快地把调用指令发送给GPU。
但GPU 并不会马上执行这些指令,这些指令只是添加到了GPU的指令队列里等待GPU 执行。
如果在短时间内发送大量的GL 指令给GPU,GPU的指令队列可能满了,以至于驱动需要把这些指令保存在Context的调用缓存里(即上文里提到的Context内的调用缓存)。
那么问题来了,这些等待中的指令何时会发送给GPU呢?
通常来说,大多数OpenGL ES
驱动的实现可能会在发起新的(下一个)GL 指令发起的时候发送这些指令。如果想要主动执行这个操作,那就调用glFlush
。
这个操作将会阻塞当前线程,直到所有的指令都发送给了GPU
。glFinish
这个命令更加强大,它会阻塞当前线程,直到所有的指令都发送给了GPU,并执行完毕。需要注意的是,应用程序的性能会因此下降。
glFinish
被称为显式同步操作。某些情况下也会发生隐式同步操作。调用eglSwapBuffers
时,就可能发生这种情况。
由于这个操作是由驱动直接执行的,此时GPU 可能把所有待执行的glDraw*
绘制指令,作用在一个不符合预期的surface 缓冲上(如果之前前端缓冲和后端缓冲已经交换过了)。
*为了防止这种情形,在交换缓冲前,驱动必须阻塞当前线程,等待所有的影响当前surface的` glDraw`指令执行完毕。**
当然,使用双重缓冲的surfaces时,不需要主动调用glFlush
或glFinish
:因为eglSwapBuffers
进行了隐式同步操作。
但在使用单缓冲surfaces(如上文提到的第二个线程里)的情况,需要及时调用glFlush
,例如:在线程退出前,必须调用glFlush
,否则,GL 指令可能从未发送到GPU。
原文链接:Let’s talk about eglMakeCurrent, eglSwapBuffers, glFlush, glFinish
https://katatunix.wordpress.com/2014/09/17/lets-talk-about-eglmakecurrent-eglswapbuffers-glflush-glfinish/
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/TdPmikFl2VC2IXGPU5HV7g
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。