C++ OpenGL纹理加速-视图相关纹理

C++ OpenGL纹理加速-视图相关纹理,c++,performance,opengl,textures,C++,Performance,Opengl,Textures,我有一个对象类型,它根据旋转(模拟3D)将纹理(正确地)渲染到2D网格上。但是,为每个视图加载/绑定新纹理图像的速度非常慢。禁用依赖于视图的纹理加载会导致非常快的性能 缓冲对象的所有视图/纹理可能不是一个好选项,它可能包含720个视图(单独的图像),每个视图可能为600x1000像素。也不能保证最终用户的系统规格,这是一个外围应用程序 在按需加载纹理和一次缓冲所有视图纹理之间,有什么好的中间OpenGL建议吗 在这里,使用纹理缓存并加载720个不同图像的所有最低分辨率MIP级别将非常有用。这将是

我有一个对象类型,它根据旋转(模拟3D)将纹理(正确地)渲染到2D网格上。但是,为每个视图加载/绑定新纹理图像的速度非常慢。禁用依赖于视图的纹理加载会导致非常快的性能

缓冲对象的所有视图/纹理可能不是一个好选项,它可能包含720个视图(单独的图像),每个视图可能为600x1000像素。也不能保证最终用户的系统规格,这是一个外围应用程序


在按需加载纹理和一次缓冲所有视图纹理之间,有什么好的中间OpenGL建议吗

在这里,使用纹理缓存并加载720个不同图像的所有最低分辨率MIP级别将非常有用。这将是1x1、2x2等分辨率的图像

在检测视图中的更改时,您正在更新纹理缓存,对上次使用的纹理进行优先级排序,以便当前在视图中的纹理具有高优先级,而长时间未使用的纹理具有最低优先级

随着纹理优先级的增加,您将引入纹理的更高细节MIP级别,并且您可以在纹理完成加载后重新绑定纹理,纹理缓存将在单独的线程中异步加载它们,然后通知主线程何时可以准备它们,因为这需要在与GL上下文相同的线程中发生


对于新的扩展,还有其他一些方法可以做到这一点,例如,但是扩展有一些限制,这使得它使用起来有点麻烦。

在这里,有一个纹理缓存非常有用,您可以加载720个不同图像的所有最低分辨率MIP级别。这将是1x1、2x2等分辨率的图像

在检测视图中的更改时,您正在更新纹理缓存,对上次使用的纹理进行优先级排序,以便当前在视图中的纹理具有高优先级,而长时间未使用的纹理具有最低优先级

随着纹理优先级的增加,您将引入纹理的更高细节MIP级别,并且您可以在纹理完成加载后重新绑定纹理,纹理缓存将在单独的线程中异步加载它们,然后通知主线程何时可以准备它们,因为这需要在与GL上下文相同的线程中发生


对于新的扩展,还有其他一些方法可以做到这一点,例如,但是扩展有一些限制,使用起来有点麻烦。

如果旋转平滑且缓慢,您可以根据视图从磁盘流式传输数据,并预取周围视图的数据

如果你能负担得起有损压缩,你可以把大量的数据放在RAM中进行积极的压缩,然后将其中的一部分移动到VRAM(如果可能的话,使用DXT/BC压缩)

您应该查看以下文章:

范韦弗伦。实时纹理流和解压缩。英特尔 软件网络,2006年

范韦弗伦。慢速存储中的地理空间纹理流 设备。英特尔软件网络,2008年

J.p.范·韦弗伦。id技术5挑战:从纹理虚拟化到 大规模并行化。SIGGRAPH Talk,2009年


如果旋转平稳且缓慢,则可以根据视图从磁盘流式传输数据,并预取周围视图的数据

如果你能负担得起有损压缩,你可以把大量的数据放在RAM中进行积极的压缩,然后将其中的一部分移动到VRAM(如果可能的话,使用DXT/BC压缩)

您应该查看以下文章:

范韦弗伦。实时纹理流和解压缩。英特尔 软件网络,2006年

范韦弗伦。慢速存储中的地理空间纹理流 设备。英特尔软件网络,2008年

J.p.范·韦弗伦。id技术5挑战:从纹理虚拟化到 大规模并行化。SIGGRAPH Talk,2009年


您正在从文件加载纹理吗?如果是这样的话,您是否在另一个线程上进行了此操作(图像解压缩,而不是纹理上载)?你能容忍多少延迟?作为genpfault问题的后续:如果你不是从磁盘加载它们,而是在运行时生成它们,是否有任何方法可以将该过程传输到GPU,如果场景需要,通过中间渲染到纹理?是的,它们来自一个文件。目前,我在一台像样的机器上运行的速度大约为2-5 FPS,我想在一台普通的机器上至少增加一倍。@Andon我明白了,谢谢,我可以尝试一下,我希望尽量减少RAM的使用,因为这是现有应用程序的第二个附加组件,如果有更“优雅”的解决方案,而且预计大部分时间都是空闲的。@Meep:我不得不删除那个评论。我在计算中漏掉了一个0。在没有mipmap的情况下,这实际上是大约1.6gib的纹理数据。但是,如果主机系统有足够的系统内存,那么仍然可以更有效地保持加载纹理;驱动程序根据需要处理从VRAM中逐出的纹理数据。不过,高端GPU有足够的VRAM来保存所有的内存。你是从文件中加载纹理的吗?如果是这样的话,您是否在另一个线程上进行了此操作(图像解压缩,而不是纹理上载)?你能容忍多少延迟?作为genpfault问题的后续:如果你不是从磁盘加载它们,而是在运行时生成它们,是否有任何方法可以将该过程传输到GPU,如果场景需要,通过中间渲染到纹理?是的,它们来自一个文件。目前,我在一台像样的机器上运行的速度大约为2-5 FPS,我想在一台普通的机器上至少增加一倍。@Andon我明白了,谢谢,我可以尝试一下,我希望尽量减少RAM的使用,因为这是现有应用程序的第二个附加组件,如果有的话