【发布时间】:2021-06-17 02:11:00
【问题描述】:
我有一个从网络加载大量纹理的 OpenGL 程序。一开始只显示这些纹理的一部分。然后用户可以导航并显示更多纹理。如果我在显示任何内容之前加载所有纹理 - 加载需要很长时间,但导航速度非常快。如果我分块加载 - 加载速度更快,但导航速度有点慢。在这种情况下,是否会添加一个单独的线程来继续从 Web 加载图像?还有哪些其他方法可以帮助加快速度?
【问题讨论】:
标签: multithreading opengl
我有一个从网络加载大量纹理的 OpenGL 程序。一开始只显示这些纹理的一部分。然后用户可以导航并显示更多纹理。如果我在显示任何内容之前加载所有纹理 - 加载需要很长时间,但导航速度非常快。如果我分块加载 - 加载速度更快,但导航速度有点慢。在这种情况下,是否会添加一个单独的线程来继续从 Web 加载图像?还有哪些其他方法可以帮助加快速度?
【问题讨论】:
标签: multithreading opengl
OpenGL 和多线程的主要问题是,虽然有可能,但它有一些必须注意的陷阱。
通常的方法是创建多个 OpenGL 上下文(每个线程一个),这些上下文设置为共享它们的“列表”(其中还包括纹理等)。
但是,在您走这条路之前,最好先检查一下,您是否真的必须对 OpenGL 部分进行多线程处理。例如,在 OpenGL 渲染器线程端,您可以创建一堆 缓冲区对象,并将它们映射到进程地址空间,由纹理提取器线程填充。
或者您只需让纹理获取线程加载并准备好所有内容,然后向 OpenGL 线程发送一条消息(例如,将其放入std::queue 等),其中包含对准备好的纹理数据的引用;然后,OpenGL 线程可以通过缓冲区对象流实现该数据的异步加载。
【讨论】: