【问题标题】:OpenGL - add multithreading for texture loading from the webOpenGL - 添加多线程以从 Web 加载纹理
【发布时间】:2021-06-17 02:11:00
【问题描述】:

我有一个从网络加载大量纹理的 OpenGL 程序。一开始只显示这些纹理的一部分。然后用户可以导航并显示更多纹理。如果我在显示任何内容之前加载所有纹理 - 加载需要很长时间,但导航速度非常快。如果我分块加载 - 加载速度更快,但导航速度有点慢。在这种情况下,是否会添加一个单独的线程来继续从 Web 加载图像?还有哪些其他方法可以帮助加快速度?

【问题讨论】:

    标签: multithreading opengl


    【解决方案1】:

    OpenGL 和多线程的主要问题是,虽然有可能,但它有一些必须注意的陷阱。

    通常的方法是创建多个 OpenGL 上下文(每个线程一个),这些上下文设置为共享它们的“列表”(其中还包括纹理等)。

    但是,在您走这条路之前,最好先检查一下,您是否真的必须对 OpenGL 部分进行多线程处理。例如,在 OpenGL 渲染器线程端,您可以创建一堆 缓冲区对象,并将它们映射到进程地址空间,由纹理提取器线程填充。

    或者您只需让纹理获取线程加载并准备好所有内容,然后向 OpenGL 线程发送一条消息(例如,将其放入std::queue 等),其中包含对准备好的纹理数据的引用;然后,OpenGL 线程可以通过缓冲区对象流实现该数据的异步加载。

    【讨论】:

    • 如果你选择多共享上下文路线,请务必阅读the specification 的第 5 章,“共享对象和多上下文”,尤其是 5.3 “传播对对象的更改”。
    • 谢谢@datenwolf,有代码示例可以分享吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2012-07-23
    • 2013-08-24
    • 1970-01-01
    • 2023-03-31
    • 2013-11-27
    相关资源
    最近更新 更多