gpt4 book ai didi

c++ - opengl 驱动程序如何在有限的 VRAM 中处理大型纹理阵列

转载 作者:行者123 更新时间:2023-11-30 05:18:28 28 4
gpt4 key购买 nike

我的游戏引擎尝试分配大型纹理数组,以便能够将大部分(如果不是全部)绘制在一起。该数组可能变得足够大而无法分配,此时我会(不断)将纹理数组分成两半。

在收到 glGetError:Out of memory 并从那里缩减之前突破边界是否是糟糕的设计?

我的应用程序是否因为分配了大量的 VRAM 而出现问题,这可能需要交换到 GTT 内存中?比如,在处理其他 OS 操作时,图形驱动程序是否不太理想地处理一些大型纹理数组而不是许多单独的纹理?

最佳答案

很难评估驱动程序处理大型纹理数组的能力。不同司机的行为可能会有很大差异。

虽然使用纹理数组可以通过减少绘制调用次数来提高性能,但这不应该是主要目标。减少绘图调用在移动平台上有些重要,即使在那里,几十个也不是问题。我不确定您的顾虑以及您究竟要优化什么,但我建议在进行任何优化之前使用 GPU 供应商的分析工具。

Is it bad design to push the boundaries until receiving a glGetError:Out of memory and scale back from there?

这是将数据动态加载到 GPU 时通常执行的操作。收到错误后,应卸载旧数据以加载新数据。

Is my application a jerk because it's allocating huge chunks of VRAM, which may require swapping into GTT memory?

无法检查数据是否已交换到 GTT(如果驱动程序完全支持 GTT)。驱动程序自行处理,无法从 OpenGL API 访问它。您可能需要使用分析工具,例如 Nsight ,如果您使用的是 NVidia 的 GPU。

但是,如果您打算拥有一个巨大的纹理阵列,它必须作为一个整体放入 VRAM,不能部分放入 VRAM 和 GTT。我根本不建议依赖 GTT。

它必须适合 VRAM,因为当您绑定(bind)它时,驱动程序无法预先知道哪些层将被使用,哪些不会,因为选择发生在着色器中。

尽管纹理数组和 3dtexture 在概念上有所不同,但在硬件级别它们的工作方式非常相似,不同之处在于第一个使用二维过滤,第二个使用三维过滤。

有一段时间我在玩大型 3d 纹理。我用 GeForce 1070(它有 6GB)做了实验,它处理纹理 ~1GB 非常好。我设法加载的最大纹理大约为 3GB (2048x2048x7**),但它经常会引发错误。尽管它应该有大量适合纹理的空闲 VRAM,但由于各种原因它可能无法分配这么大的 block 。因此,除非绝对必要,否则我不建议分配与 VRAM 总大小相当的纹理。

关于c++ - opengl 驱动程序如何在有限的 VRAM 中处理大型纹理阵列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41688709/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com