略谈OpenGL中的共享上下文(EGL Context)

OpenGL/OpenGL ES入门(二):EGL的介绍和使用(context上下文的创建和初始化) 一、简介 EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口。 通常来说,OpenGL 是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,且它最好是与平台无关的。 因此 EGL 被设计出来,作为 OpenGL 和原生窗口系统之间的桥梁。 二、功能 EGL API 是独立于 OpenGL ES 各版本标准的独立的一套 API。 2.1 主要作用: 为 OpenGL 阅读详情
AI摘要

本文介绍了OpenGL中的共享上下文(SharedContext)概念及其在多线程环境中的应用,特别是通过Google为Android设计的MediaCodec OpenGL Pipeline示例,展示了如何利用共享上下文优化复杂渲染任务的多线程管理。

OpenGL渲染中有一个线程相关的上下文(EGL Context), OpenGL所创建的资源, 其实对程序员可见的仅仅是ID而已, 其内容依赖于这个上下文, 有时候为了方便起见, 在某个线程中创建了上下文之后, 所有的OpenGL操作都转到此线程来调用. 这样在简单的2d/3d 渲染中尚可, 但是如果涉及复杂的OpenGL渲染时, 这样就未必足够, 事实上OpenGL已经考虑到这一点, 上下文是可以在多个线程间共享的, 在使用eglCreateContext时, 可以传入一个已创建成功的上下文, 这样就可以得到一个共享的上下文(Shared Context).
举例来说, Google 为Android 的MediaCodec设计了一套基于OpenGL的Pipeline, 其覆盖的模块包括 视频采集(Video Capture), 视频前处理 (pre-processing), 视频编码(Encode), 视频解码(Decode), 后处理(post processing), 渲染(Render). 通常作设计的时候需要考虑架构的跨平台通用性, 所以上述的整个Pipeline 会在多个线程中工作. 当我们为这个架构设计高度优化的MediaCodec OpenGL Pipeline的时候, 就可以使用Shared Context的方式, 这样, 可以继续沿用跨平台的通用架构和线程模型, 设计思路也比较自然. 如果只为OpenGL创建一个工作线程, 强行把所有的操作转向此线程, 思路过于简单, 粗暴, 其实现必然丑陋. 这是我之前所犯过的设计的失误, 故为此记.

Reference

OpenGL共享对象和多上下文 Shared Objects and Multiple Contexts 阅读详情

相关推荐

OpenGL上下文共享示例

在上面的代码中,我们首先初始化GLFW库,并创建了两个窗口,分别命名为"Window 1"和"Window 2"。在第一个窗口中进行OpenGL渲染后,我们将第二个窗口的上下文设置为当前上下文,并再次初始化GLEW。在OpenGL编程中,上下文共享是一种重要的技术,它允许多个OpenGL上下文在同一应用程序中共享资源和状态。在多线程环境中,我们可以将一个上下文创建在一个线程中,然后在另一个线程中使用该上下文进行渲染。需要注意的是,在使用共享上下文时,我们需要确保在特定的上下文中进行渲染和资源创建操作。

YOLO_CODE的博客 707

EGLContext: eglMakeCurrent详解

1. 前言 在完成EGL的初始化之后,需要通过eglMakeCurrent()函数来将当前的上下文切换,这样opengl的函数才能启动作用。 boolean eglMakeCurrent(EGLDisplay display, EGLSurface draw, EGLSurface read, EGLContext context) 该接口将申请到的display,draw(surface)和 ...

矩阵实验室 8195

OpenGL上下文共享样例-实现跨多个窗口的图形共享

上面的代码中,我们通过glfwCreateWindow()函数创建了一个新窗口,并将上下文共享给了参数shareContext所指向的窗口,然后利用glfwMakeContextCurrent()函数设置当前上下文为当前窗口。下面是一个使用OpenGL上下文共享技术,实现跨多个窗口的图形共享的样例程序,使用C++编写,并调用了GLFW和GLEW库。上面的代码中,我们在两个窗口中分别绘制了一个相同的三角形,如果图形共享成功,则两个窗口中的三角形应该是相同的。至此,我们成功地实现了跨多个窗口的图形共享。

BUG?不存在的! 1050

OpenGL ES EAGLContext 和 EGLContext

在讲解EAGLContext 和 EGLContext之前,我们需要先说明一下OpenGL 和 OpenGL ES 的关系Windows / Android 上是 EGL,EGL 是渲染 API(如 OpenGL ES)和原生窗口系统之间的接口。通常来说,OpenGL是一个操作 GPU 的 API,它通过驱动向 GPU 发送相关指令,控制图形渲染管线状态机的运行状态,但是当涉及到与本地窗口系统进行交互时,就需要这么一个中间层,因此 EGL 被设计出来,作为OpenGL。

猿说编程 1226

在Android上实现OpenGL上下文间的资源共享

在某些情况下,我们可能需要在不同的OpenGL上下文之间共享资源,例如纹理、缓冲区对象等。通过创建共享上下文,并在其他上下文中使用共享的资源,我们可以实现跨不同上下文的资源共享。然后,我们可以在新的上下文中对纹理对象进行操作,如绑定纹理、设置纹理参数等。需要注意的是,在使用共享资源时,必须确保所有涉及共享资源的上下文都处于活动状态,并正确管理资源的生命周期和同步访问。现在,我们可以在新的上下文中使用共享的资源了。在创建新的上下文时,将共享上下文作为第三个参数传递,并使用相同的配置和版本。

YkDjango的博客 909

华为云Stack 8.X 流量模型分析(一)

​ 当内部需要提供对外服务时(如对外发布Web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。​ 内部地址要访问公网上的服务时(如Web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。

Ciyaso的博客 3240

OpenGL ES(18): 核心:自定义EGL环境

1.简介 EGL: 是OpenGL ES和本地窗口系统的接口,不同平台上EGL配置是不一样的,而 OpenGL的调用方式是一致的,就是说:OpenGL跨平台就是依赖于EGL接口。 为什么要自己创建EGL环境? 当我们需要把同一个场景渲染到不同的Surface上时,此时系统GLSurfaceView 就不能满足需求了,所以我们需要自己创建EGL环境来实现渲染操作。 注意:OpenGL整体是一个...

八步赶蝉 1654

嵌入式NTC温度解算库:Steinhart-Hart定点实现与硬件解耦设计

NTC热敏电阻是嵌入式系统中最常用的模拟温度传感器,其阻值-温度关系高度非线性,需依赖Steinhart-Hart方程实现高精度转换。该方程通过三参数对数多项式建模,理论上可将误差控制在±0.1°C以内,但直接移植到MCU面临浮点开销大、定点溢出、系数精度损失等工程瓶颈。为此,归一化处理(ln(R/R₂₅))、Q24.8定点运算、查表+插值对数计算等优化技术成为资源受限场景下的关键技术路径。其核心价值在于将ADC采样与温度解算彻底解耦,适配各类HAL/裸机/RTOS环境,广泛应用于电池管理、工业PLC、Io

weixin_35756624的博客 647

EGL Context 创建

继续 EGL context 创建的分析。eglInitialize()来看 EGL10.eglInitialize() 的实现。com.google.android.gles_jni.EGLImpl 中,这个方法的实现如下: public native boolean eglInitialize(EGLDisplay display, int[] major_minor);它是一个本

tq08g2z的专栏 2160

当Flowable遇上AI:智能流程决策的未来探索

本文探讨了Flowable工作流引擎与AI技术的融合,构建智能流程决策系统的前沿实践。通过动态流程控制、机器学习优化表达式、自然语言生成规则等创新方法,显著提升业务流程的自动化水平和决策效率。重点解析了AI如何赋能Flowable核心引擎,实现从静态规则到动态智能的跨越式发展。

weixin_29271053的博客 388

优刻得首个「国产千卡智算集群」落地,支持智源千亿大模型训练

在人工智能引领的时代浪潮中,算力已成为技术进步与创新的核心驱动力。面对当下AI算力需求的飙升、高端AI芯片供应受限的挑战,加之OpenAI带来的技术封锁,唯有坚定不移的发展自主可控的国产技术方案,持续壮大国产智算集群规模,才能一路突破围追堵截,进一步促进国产大模型产业生态繁荣。集群还提供了完善高效的软件栈工具,集成多种主流的深度学习编程框架,通过测试验证,确保了对行业领先人工智能模型的高效支持,做到开箱即用,用户可快速投入模型的开发和部署,加速了其在人工智能领域的布局和发展。方面取得了显著成效。

Ucloud_TShare的博客 1471

opengl在多线程间的纹理共享

设定一个场景,要读取一个opengl渲染线程中一帧的画面到内存,可以使用glReadPixel函数,但是这个函数存在很糟糕的性能问题,为了解决这个问题可以使用如下步骤: 1. 两个opengl渲染线程: A线程负责前台窗口的渲染,B线程在pbuffer上渲染,并且把A...

chushi3356的博客 4816

ESP32连接PDM麦克风操作指南:新手入门必看

手把手教你如何将ESP32与PDM麦克风连接,采集音频数据并用于音频分类应用。内容涵盖硬件接线、代码配置及实际调试技巧,适合初学者快速上手esp32在声音识别场景中的使用。

weixin_42590539的博客 1329

安卓下多线程OpenGL共享Context (四)

之前的方案假定Java层更新纹理时使用的是RGB或RBGA格式的数据,但是在播放视频这种应用场景下,解码器解码出来的数据如果是YUV格式,渲染起来就比较麻烦了。一种方式是使用CPU进行YUV转RGB,然后再进行渲染,但是这种方式性能极差;另一种方式是使用GPU进行转换,利用GPU的并行计算能力加速转换。我们需要编写Shader来实现。如前文所述,Unity只需要Java层的纹理ID,当使...

weixin_30436891的博客 593

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 459

32、生物医学中的多模态拉曼散射成像技术

本文综述了多模态拉曼散射成像技术在生物医学领域的应用,重点探讨其在肿瘤研究、癌症无创诊断和组织功能分析中的前沿进展。通过结合自发拉曼、相干拉曼散射(CARS/SRS)、光学相干断层扫描(OCT)、荧光寿命成像(FLIM)及多光子显微技术(TPEF/SHG)等多种模态,实现了对细胞和组织的高特异性生化信息与高分辨率形态学特征的同步获取。文章还介绍了多模态SERS纳米探针的设计及其在靶向成像与治疗一体化中的潜力,并系统分析了不同成像方式的操作流程、优势互补性及临床应用场景。最后展望了该技术向小型化、智能化和个性

zzz56的博客 152

OpenGL Context

OpenGL Context与窗口系统相关,所以在不同平台上创建方式都不一样。EGL 是OpenGL官方Khronos推出的,既可以使用用于OpenGL Context,也可以用于OpenGL ES Context。Google的项目使用了EGL,支持各个平台,提供将OpenGL ES/WebGL转译为Vulkan、DirectX、Metal 等系统的图像API,Chrome浏览器中的WebGL使用了ANGLE。

Wlk1229 760

基于FPGA的最大功率点跟踪(MPPT)系统开发 - MATLAB实现

最大功率点跟踪(Maximum Power Point Tracking,MPPT)是太阳能光伏系统中的重要技术,它通过调整太阳能电池板的工作点,以最大化输出功率。通过FPGA系统设计和硬件验证,我们可以实现太阳能光伏系统中的最大功率点跟踪。这种基于FPGA的MPPT系统具有高性能和灵活性,适用于太阳能光伏系统中的实时最大功率点跟踪。MPPT算法的选择对于系统的性能至关重要。在本文中,我们选择使用Perturb and Observe(P&O)算法,它是一种常用的基于光伏阵列电压和电流测量的迭代算法。

CoderExtra的博客 387

硬件加速绘制基础知识

这些状态变量描述当前OpenGl应该如何运行,比如是绘制线段还是三角形,可以 通过改变上下文状态来改变OpenGl的绘制行为。状态设置函数就是用来改变上下文的,而OpenGl是根据上下文进行渲染的。surface 需要与 context 进行搭配使用, context 中是可以保存 OpenGL ES 状态集信息的,所以 context 就可以使用自己内部保存的信息往 surface 上进行绘制。

m0_65909361的博客 611

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android Opengl共享context的替代方案(创建多个eglsurface,通过makecurrent进行切换)

显示效果 背景 在应用的开发过程中,我们避免不了要使用Opengl共享context的技术。比如我们需要在预览的同时还要将预览的画面传递给MediaCodec进行编码。有的朋友会说Camera2可以设置多个surface,这样就可以把预览的surface和MediaCodec的surface同时传递给Camera2。这种只是实现比较简单的录制功能。现在多数有录制功能的应用都支持滤镜功能,可以把你拍得更漂亮。由于加入了滤镜的功能,所以我们要通过Opengl技术来实现。 当我们加入opengl的滤镜功能后就有

DragonCoding的专栏 4248

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

OpenGL 中的共享上下文

OpenGL 渲染中有一个的上下文 (Context), OpenGL 所创建的资源,其实对程序员可见的仅仅是 而已,其内容依赖于这个上下文,有时候为了方便起见,在某个线程中创建了上下文之后,所有的 OpenGL 操作都转到此线程来调用。这样在简单的 2d/3d 渲染中尚可,但是如果涉及复杂的 OpenGL 渲染时,这样就未必足够, 事实上 OpenGL 已经考虑到这一点, ,在使用 或 时, 可以传入一个已创建成功的上下文, 这样就可以得到一个共享的上下文 (Shared Context).OpenG

whl0071的专栏 2666

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

android 多线程创建texture,安卓下多线程OpenGL共享Context (一)

最近在研究Unity3D开发中使用Java Plugin进行纹理更新,想法很简单,在Java线程更新纹理数据,然后Unity场景中的纹理将自动更新。首先,创建Java类,定义创建纹理及获取纹理参数的接口,并创建单线程池用于进行加载Bitmap并绑定纹理数据等OpenGL操作。Java代码示例:1 packagecom.thornbirds.unity;23 importandroid.graphi...

weixin_28622215的博客 922

GLSL-openGL的context与object - VAO、VBO、IBO

openGL的context 在openGL渲染管线中,context保存了当前的渲染状态,在OSG等图形引擎中可能同时有多个线程进行场景渲染,此时便需要有多个图形上下文来保存各个线程的openGL状态。 openGL的object openGL中的另一个重要概念是object,如VAO、VBO、IBO、TBO、FBO等等。这些object中要么存放的是原始数据,如顶点坐标、顶点颜色、纹...

Percypan的博客 779

如何修复 在不同线程间不正确地共享OpenGL上下文

方案优点缺点适用场景1. 专用渲染线程极其稳定、逻辑清晰、高性能需要设计命令队列架构绝大多数情况下的最佳选择2. 共享上下文资源创建不阻塞渲染线程需要手动同步(Fences),比方案一复杂后台加载纹理、网格等资源3. 上下文跳跃实现简单(表面上)性能差、极易出错、不稳定几乎不推荐,仅用于非常简单的、非性能关键的场景强烈建议采用“专用渲染线程”模型。虽然前期需要多写一些代码来建立命令队列系统,但它能从根本上解决问题,并为未来扩展更复杂的渲染功能打下坚实的基础。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 1797

IOS 中多线程是能共享同一个OpenGL context

在IOS开发中如何实现多线程共享同一个OpenGL context 在iOS开发中,OpenGL是一个强大的图形库,可以用来实现高性能的图形渲染。而在实际开发过程中,为了提高效率和性能,我们通常会使用多线程来处理一些耗时的任务。那么在这种情况下,如何实现多线程共享同一个OpenGL context呢?本文将为大家介绍这个问...

weixin_36908276的博客 246

OpenGL(5)深入理解Pipeline, State, Context

OpenGL(5)深入理解Pipeline, State, Context Pipeline(管线/管道) 管线(pipeline),可以理解为渲染流水线。它的最终目的是将输入3D数据经过几个流程的处理,最终被映射到屏幕设备上显示的像素。当然整个流水线生产过程是受OpenGL状态的影响。 线管分为两类: 固定管线:可以简单理解为渲染图像的这个过程,我们只能通过调用GLShaderManager类的固定管线效果实现我们一系列的着色器处理。 可编程管线:可以简单理解, 在我们处理图形的过程,我们必须使用顶点着

Joey博客 1470
上一篇: 深入浅出ARKit - 几何图形的构成
下一篇: CNN(卷积神经网络)在iOS上的使用
volvet
博客等级 码龄18年 129粉丝 83原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值