asynchronous纹理加载的设备

asynchronous纹理加载的设备,第1张

概述asynchronous纹理加载设备

如何在3D应用程序运行的同时asynchronous加载纹理? 我所知道的是,OpenGL上下文不是线程安全的,我应该将它们分开在不同的线程上。

但是我的主要问题是select一个合适的multithreading设施/框架来实际上用windows和C ++来实现这个function,我已经听说了很多关于C ++ 11的知识,包括标准的线程支持,但是有人可以简单介绍一下基本的步骤吗?

什么是最安全的方法呢? 而且,如何更新其他上下文的状态,以便注册在另一个线程上完成的更改? 我怀疑glFlush和glBind* ?

如何将鼠标和键盘事件发送到另一个进程?

系统调用的原理,允许size_t的请求,但只有ssize_t的结果?

以编程方式创build组合桌面快捷键“快捷方式”

gtk_entry_get_text不起作用

我可以使用shmctl调整linux共享内存吗?

调整窗口大小会导致在右边框附近拖尾

C ++ -fvisibility = hIDden -fvisibility-inlines-hIDden

什么语言允许我与 *** 作系统的内核进行交互

如何画math符号?

使用C ++检查客户端上的可用.NET框架

纹理加载中最耗时的部分通常是磁盘访问和任何格式转换,两者都独立于OpenGL,因此可以安全地在另一个线程上进行。 一旦纹理被读入内存并以所需的格式,实际复制到OpenGL缓冲区是相当快的。

进入线程编程的细节对于这个答案来说太复杂了,但是有很多关于文档的知识,而且一旦点击了头部,就非常容易了(比如指针和内存)。

这里的一般概念是创建一个纹理持有者对象列表(包含,比如文件/名称,一个最初为空的缓冲区和一个加载完成标志),并在创建时将其传递给你的加载线程。 加载线程然后遍历列表,打开每个文件,将其加载到内存中,并将缓冲区附加到列表条目,然后设置加载的标志,并可能递增计数器。 主线程采用新加载的纹理,将其复制到OpenGL纹理中,并增加进度条或任何加载指示符。 一旦列表中的所有纹理都有缓冲区并被标记为已加载,另一个线程的工作就完成了,并且可以停止(或者保持活动状态以加载未来的纹理)。

该模型的主要优点是不必共享实际的图形上下文。 在可以是线程安全(DirectX)的API中,这样做的性能会受到影响,而OpenGL需要您有一些体面的工作来确保您拥有多个上下文,或者确保您正确地共享这些上下文。 加载纹理时的繁重工作通常是文件读取和参数检查,除非进行格式转换或旋转,这甚至可能会使磁盘访问变得黯淡。 实际复制到视频内存是高度优化的,不可能成为瓶颈(如果您担心这一点,请尝试使用能够识别GPU调用成本的工具进行分析并查看)。 这些工作都不直接依赖于OpenGL,所以你可以把它推到另一个线程,很少担心。

如果你是在windows上,可以使用内置的线程函数,使用简单的回调模型(提供一个函数和初始参数,在这种情况下你的纹理列表,并进行API调用)。 我并不熟悉C ++ 11的线程支持,也不熟悉它如何在Visual Studio中工作,所以你必须检查它。

@ssube的回答对于任务复杂性的分解是正确的,但是假定“OpenGL需要一点点的工作才能有多个上下文,或者确保你正确地分享它们”,我不同意。

一个简单的解决方案是在程序开始时创建一个主要上下文(用于绘制)和一个辅助上下文(用于纹理加载),例如:

m_hRCDrawing = wglCreateContext(m_hDC); m_hRCSecondary = wglCreateContext(m_hDC);

然后在m_hRCSecondary和m_hRCDrawing上下文之间共享数据可以使用:

wglShareLists(m_hRCSecondary,m_hRCDrawing);

最后,当你要从没有GL上下文的“纹理加载”线程读取纹理时,你可以简单地调用:

wglMakeCurrent(m_hDC,m_hRCSecondary);

之后在该线程中加载的任何资源都由绘图线程的上下文共享。

这里有一个更详细的解释。

总结

以上是内存溢出为你收集整理的asynchronous纹理加载的设备全部内容,希望文章能够帮你解决asynchronous纹理加载的设备所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1286109.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存