Opengl多线程终究是浮云

第十四章《OpenGL 与多线程渲染》 每帧渲染命令写入指令队列(DrawCall、状态切换、资源绑定等),不支持像 Vulkan 那样的 Command Buffer。加载完数据后再主线程中上传到 GPU(纹理、VBO)这样可以解耦 CPU 数据拷贝与 GPU 上传。OpenGL 的状态和资源绑定在上下文上,主线程消费这些指令并提交至 OpenGL。适用于场景分块、实例化绘制等高并发场景。每个线程最多绑定一个 GL 上下文。一个 OpenGL 上下文。,但有些坑要绕、规则要懂。OpenGL 的设计偏向。OpenGL 本质上是。 阅读详情

在OpenGL里面使用多线程加载纹理是很美好的构想。

网上讨论这个的并不多。中文博客里http://www.cnblogs.com/mazhenyu/archive/2010/04/29/1724190.html

参考了某个老外的尝试:

http://veelck.wordpress.com/2008/11/28/multithread-texture-loading-in-opengl/

其基本思路如下:

要创建新的rendering context (RC), 先需要device context(DC). 

DC可以在得到HWND后得到:
HDC hDC = GetDC(hWnd);
接下来使用Windows extension函数:wglCreateContext创建RC。如果失败返回NULL。
在这里我们用1个hDC创建2个RC:
HGLRC rendContext1 = wglCreateContext(hDC);
HGLRC rendContext2 = wglCreateContext(hDC);
接下来我们用1个RC加载图片,一个用来渲染。困难的是你必须共享2个RC之间的资源。
因为你在一个RC中创建的纹理在另外一个RC中是不可访问的,反之亦然。
使用这个方法共享RC:
wglShareLists(rendContext2, rendContext1);
最好在调用context任何操作前完成这个操作!最好在与OpenGL做任何交互前调用。
现在可以在不同线程里使用RC了。不需要每次都使用,只需要在线程开始前调用即可。
renderingThread()
{
    //...
    wglMakeCurrent(hDC, rendContext1);
    //...
    wglDeleteContext(rendContext1);
}


loadingThread()
{
    //...
    wglMakeCurrent(hDC, rendContext2);
    //...
    wglDeleteContext(rendContext2);
}
再次注意,wglShareLists 只能在进程内工作。所以使用多线程而不是多进程。
wglMakeCurrent只是设置本线程的默认RC。所以并不关心其他线程在干什么。
现在你可以在Load线程里放心的调用图片加载,如glGenTextures、glTexParameteri、glTexImage2D了。
而Render线程也可以访问Load线程的资源。
如果你想在Render线程里也加载图片,记住某些图片库( DevIL)不支持多线程加载。自己去做线程互斥把。
我没有尝试多线程渲染。但从网上资料来看,即使有也没有意义。 OpenGLz的contexts切换会带来大量额外负担。
在进程的最后要释放并删除contexts。
wglMakeCurrent(NULL, NULL).

====================================================

以上是作者的基本思路。

在我的项目里,我尝试用一个线程专门用于动态加载纹理。

看上去运行的不错。不幸的是,当纹理加载频率教高的时候,纹理会出现白框和闪烁。

在ATI的某些显卡上效果会好很多,基本看不到奇怪现象;在NV的显卡上相当明显。

这个问题尚没有完美解决。基本只能在多线程里将纹理读到内存,然后在主渲染线程里读入显存。



OpenGL Context 全方位解析:原理、多线程与工程实践 图形渲染程序的底层往往依赖一套庞大的状态机,GPU 的绘制行为由当前绑定的渲染环境决定。在 OpenGL 中,这套环境被封装为上下文(Context),它保存视口、混合、深度测试等状态以及纹理、缓冲、着色器等资源的归属。理解上下文与线程的绑定关系,是规避多线程渲染崩溃和资源冲突的关键。借助共享上下文与同步原语,开发者可以在不同线程间安全传递纹理数据;而在 Qt 与 WebEngine 等框架中,正确管理上下文的创建时机又直接决定初始化是否成功。从 EGL 到 ANGLE,从桌面端到嵌入式,上下文机制始终是图 阅读详情

相关推荐

利用OpenGL进行多线程实例编程

在计算机图形学中,利用多线程来加速图像处理、渲染等任务同样具有重要意义。在OpenGL渲染线程中,我们先初始化GLEW库,然后设置OpenGL的状态。在循环中,我们首先清空颜色缓冲区和深度缓冲区,然后添加渲染代码。OpenGL上下文只能在创建它的线程中使用,因此我们必须在OpenGL渲染线程中初始化和使用OpenGL。总之,多线程编程可以大大提高图像处理、渲染等任务的效率,在OpenGL编程中同样具有重要意义。在主线程中,我们可以添加一些自己的任务,在这里我们只是调用了。最后,我们销毁窗口并且终止程序。

CyberLynxO的博客 861

OpenGL初探

OpenGL基础知识摘要。

weixin_42111148的博客 1978

OpenGL多线程多视图的实现

分别用于渲染视图1和视图2。每个线程都有一个独立的渲染循环,通过设置视口和投影矩阵来渲染不同的视图。在每个渲染循环中,我们先清除颜色缓冲区和深度缓冲区,然后设置模型视图矩阵,并绘制相应的图形。在这个示例中,我们分别绘制了一个红色的立方体和一个绿色的球体。在计算机图形学中,多线程和多视图是常见的技术,用于提高渲染性能和显示灵活性。OpenGL作为一个强大的图形渲染库,也支持多线程和多视图的实现。通过这种方式,我们可以实现多线程多视图的功能,每个视图都在独立的线程中进行渲染,从而提高了渲染性能和显示灵活性。

NckyPytorch的博客 997

OpenGL多线程同步方案

OpenGL由于状态机这个桎梏,天然是适合单线程渲染的。由于状态机中的状态、资源、内存无法解决多线程中的竞争问题,在OpenGL中实现多线程一直是荆棘中跳舞,就算再小心翼翼也不能避免刺痛。 以下内容为了方便,多线程渲染和OpenGL多线程是等价的,只不过这里做的不是多线程上屏渲染。 是否需要多线程 由上所述,要做OpenGL多线程是痛苦和收益并存的,引入多线程能有多少收益是你要第一个要问的问题。 按照我的经验,多线程渲染越往上层开始异步越好,这样不仅入口简单,查Bug也会更简单。这主要是因为Open

翻肚鱼儿的博客 6195

OpenGL多线程编程实例

需要注意的是,在OpenGL中,渲染操作通常是在主线程中进行的。总结起来,通过使用多线程编程,可以在OpenGL中实现更高效的图形渲染和计算。然而,在进行多线程编程时,需要注意线程间的同步和数据共享,以避免潜在的并发问题。在计算机图形学中,OpenGL是一个广泛使用的图形库,它提供了丰富的图形渲染和处理功能。例如,你可以在一个线程中进行物体的位置更新和碰撞检测,而在另一个线程中进行渲染操作。函数是实际进行OpenGL渲染的函数,你可以在其中编写你的渲染代码。OpenGL多线程编程实例。在上面的示例代码中,

DevProZ的博客 542

OpenGL多线程多视图的实现 编程

通过将渲染和输入处理分别放在不同的线程中,我们可以实现多线程多视图的效果。需要注意的是,在实际应用中,需要根据具体需求设计适合的线程和视图数量,并进行适当的数据同步和线程管理。需要注意的是,在多线程编程中,线程之间的共享数据需要进行同步,以避免竞争条件和数据不一致。通过将渲染和输入处理分别放在不同的线程中,我们可以实现多线程多视图的功能。在本篇文章中,我们将讨论如何使用OpenGL在多线程环境下实现多视图的功能。在实现多视图的过程中,我们将使用两个线程:一个用于渲染图形,另一个用于处理用户输入。

ByteProwl的博客 707

OpenGL结合多线程渲染图形界面

上面的代码创建了一个窗口,并在窗口中使用OpenGL进行图形渲染。渲染过程在单独的线程中进行,不会阻塞主线程的运行。在渲染线程中,首先会渲染图形界面,然后通过。函数通知主线程刷新窗口。在主线程的显示回调函数中,会清空颜色缓冲区,绘制图形,并刷新缓冲区。整个过程会不断重复,从而实现连续的图形渲染。

qq_38828688的博客 1687

使用OpenGL实现的多线程粒子引擎

首先,我们需要创建一个粒子类来表示每个粒子的位置、速度、加速度和生命周期等属性。最后,我们需要使用线程来处理每个粒子的行为以及粒子间的相互作用。本文将介绍一个基于OpenGL并具有线程物理的简单粒子引擎的实现方法。该引擎能够支持大量的粒子,并使用多线程处理彼此独立的力学、运动和碰撞检测。上面的代码实现了一个简单的粒子引擎,具有线程物理的特性,能够支持大量的粒子。通过不断调整参数,你可以创建出各种不同的粒子效果。

BitLordX的博客 362

深度剖析OpenGL ES中的多线程和多窗口渲染技术

移动设备中的CPU和GPU已经变得很强大,到处都是配备一个或多个高分辨率屏幕的设备,需要使用带有图形驱动器的复杂交互也日益增加。在这篇博客文章中,我将讨论多线程和多窗口渲染对开发人员来讲意味着什么,同时我将介绍将这些技术应用您设计当中的条件和时机。 什么是多线程渲染? 传统上,OpenGL ES应用程序只从一个线程渲染到一个图层。然而,由于3D渲染引擎的复杂性有所增加,图形API操作的CP

Ben_OnceMore 1万+

一个简单的OpenGL多线程渲染模型

用多线程实现OpenGL渲染, 子线程负责渲染, 主线程负责干其他事情.

高通平台Camera sensor bring up!

Qualcomm Camera sensor bring up!0. 准确1. Kernel 底层驱动配置1.1 dtsi1.2 pinctrl2. Chi-Cdk XML 配置2.1 sensormodule2.2 sensor3. CHECK 本文主要针对高通平台SM7250进行描述,当然高通平台可能基本都差不多【第一个项目】 —only for sensor probe sucess. 0....

Understand-image 9240

多线程openGL

Mac OS  推出 openGL 多线程版本,在多CPU 硬件平台效率大幅提高 Youll have the best chance of success with multithreading if you design your program with threading in mind. Its difficult, and often risky, to retrofit an

杨德龙的专栏 2947

【原创】SAP/Oracle 集团企业海外全球化实施注意事项: 一带一路本地化 (持续更新)...

ABC集团SAP的系统平台已经扩展到全球一百来个国家和地区,SAP系统平台的全球实施项目中, 当时是需要支持当地的业务和法律法规的合规要求。   当时客户也是缺乏当地的资源以及对当地法律法规和业务实践的了解,需要团队提供了全球化的支持,通过我们全球产品技术专家充分传递了各区域的本地化支持和实践 而且近年来我们发现一些国家和政府,陆续都在推出一些新的税改和合规的要求,接下来基于这些要求,我们全球...

weixin_34024034的博客 1144

Qt使用OpenGL进行多线程离屏渲染

基于Qt Widgets的Qt程序,控件的刷新默认情况下都是在UI线程中依次进行的,换言之,各个控件的QWidget::paintEvent方法会在UI线程中串行地被调用。如果某个控件的paintEvent非常耗时(等待数据时间+CPU处理时间+GPU渲染时间),会导致刷新帧率下降,界面的响应速度变慢。 假如这个paintEvent耗时的控件没有使用OpenGL渲染,完全使用CPU渲染。这种情况处...

imred的专栏 1万+

在Rviz仿真环境中搭建传送带

<geometry><material>

qq_58268456的博客 936

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5495

MFC框架下 OPenGL多线程编程

  在新开线程示例,加入红色字体代码 UINT CMicroDlg::ThreadshowOpenGL(LPVOID *lParm) {     CMicroDlg* theDlg = (CMicroDlg*)lParm;     //初始化 gl    CDC* pDC = theDlg-&gt;GetDlgItem(IDC_STATIC_DISP_MAP)-&gt;GetDC();  ...

hankerbit的博客 536

矩阵奇异值分解算法(SVD)的导数 / 灵敏度分析

设矩阵X∈Rm×nX∈Rm×nXUΣV⊤XUΣV⊤U∈Rm×mU∈Rm×m为左奇异向量矩阵;V∈Rn×nV∈Rn×n为右奇异向量矩阵;Σdiag⁡σ1σ2σrΣdiagσ1​σ2​σr​为奇异值对角阵(rrank⁡XrrankX我们关心:当XXX发生微小扰动dXdX时,UΣVUΣV如何变化?dXdUΣV⊤dX。

qq_36812406的博客 1751

OpenGL渲染管线漫谈(二)

在OpenGL中,状态改变通常指的是改变OpenGL上下文中的各种状态,这可能包括切换绑定的纹理、更改当前激活的着色器程序、修改混合模式、改变绑定的缓冲区对象等。无法并行:虽然光照和阴影的计算在理论上是可以并行的(即每个像素的计算都是独立的),但是在实际的硬件和软件中,往往无法完全并行。为了解决这些问题,新的图形API如Vulkan和DirectX 12采用了更现代的设计,它们提供了更低层次的硬件控制,更好的多线程支持,以及更显式的状态和资源管理。在实际的渲染过程中,光照和阴影的计算可能会更复杂。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 810

SAP CDS View association 的工作原理,与数据库传统 join 操作的区别讲解

笔者前一篇教程,介绍了 SAP CDS View 里如何创建 association:本文就来一一对这些问题进行解答。首先我们来研究如何消费创建好的 SAP CDS View 中的 association 数据。在上图 ABAP Development Tool 里展示的 CDS View 界面,点击 F8 快捷键,进入 Data Preview 即数据预览界面。我们随便选中一条行项目,右键,发现右键菜单里,赫然有一条的菜单项。看来这个功能肯定和 association 相关了。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1009

【笔记篇】Davinci Configurator BswM模块

AUTOSAR BSWM模块配置介绍

weixin_47571898的博客 1534

opengl在多线程间的纹理共享

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

chushi3356的博客 4818

AI编码规则:从提示工程到自动化,提升大模型生成代码质量

在软件工程领域,代码质量是保障软件可维护性、安全性和团队协作效率的核心。其背后遵循着从基础语法规范到架构设计原则的一系列工程实践。随着大语言模型(LLM)在代码生成任务中的广泛应用,如何确保AI生成的代码符合这些工程标准,成为一个关键的技术挑战。这涉及到将人类工程师积累的最佳实践,转化为机器可理解、可执行的明确约束。通过系统化的**编码规则**定义与集成,例如构建涵盖安全、风格、架构的多层次规则集,并将其融入**提示工程**或自动化工作流,可以显著引导AI产出更健壮、规范的代码。这种方法的价值在于,它能将模

weixin_42525189的博客 643

EGL opengl多线程绘制

opengl多线程绘制实现效果:opengl开启两个线程,一个线程用于绘制,另一个线程用于加载纹理。实现方法:opengl是单线程的,其他线程不能访问另外线程的纹理资源,但是,如果两个线程共享上下文,就可以访问彼此的纹理资源。绘制线程:创建两个上下文//只有主要代码 ... context = eglCreateContext(display, config, NULL, ctxAttribs);...

movenostop的博客 3707

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: STL里list、vector、queue性能差异与疑似内存泄漏问题
下一篇: WGS84坐标与Web墨卡托坐标互转
lsldd
lsldd 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄19年 1494粉丝 63原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值