c++ - 使用 OpenGL 分配的纹理内存受什么限制?

标签 c++ opengl memory textures

我正在使用 OpenGL 制作 2D 游戏。我关心的是纹理内存消耗。 2D 游戏使用的纹理内存比 3D 游戏多几个数量级,其中大部分来自动画帧和背景。

显然,程序可以分配的纹理内存是有限制的,但是是什么决定了这个限制呢?该限制是来自程序可用的通用内存,还是受到 GPU 上可用视频内存的限制?它可以使用交换空间吗?当视频内存耗尽时会发生什么?

最佳答案

OpenGL的内存模型非常抽象。直到2.1版本为止,有两种内存:快速“服务器”内存和慢速“客户端”内存。但没有任何限制可以以任何方式查询。当 OpenGL 实现耗尽“服务器”(=GPU) 内存时,它可能会开始交换或只是报告“内存不足”错误。

OpenGL-3 取消了(大部分情况下,OpenGL-4 完成了这项工作)两种不同类型的内存。只有“内存”,限制是相当任意的,并且取决于程序运行的 OpenGL 实现(= GPU + 驱动程序)。所有 OpenGL 实现都完全能够交换暂时未使用的纹理。因此,唯一会遇到内存不足的情况是尝试创建非常大的纹理。事实上,最新的 GPU 能够根据需要交换部分纹理。事情会变得很慢,但继续工作。

Obviously there's a limit to how much texture memory a program can allocate, but what determines that limit?

系统 OpenGL 实现的详细信息以及取决于该系统中安装的内存量。

关于c++ - 使用 OpenGL 分配的纹理内存受什么限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25100110/

相关文章:

用于 xCode 错误的 C++11

c++ - 我的 win32 程序应该在哪里保存它的文件?

c++ - 在单独的枚举类型中重用枚举值

c++ - 如何在glfw中显示glutDisplayFunc,glutMainLoop?

c++ - 为什么我们选择 "bounding box"方法来填充一个三角形呢?

java - 位是如何存储在内存中的? (在 block 中?可以将多个大小的位存储在一起吗?)

c++ - 编译错误信息

c++ - 尝试从其自己的类访问公共(public)变量时出现奇怪的 SIGSEGV

c - 我应该使用什么 C 类型来计算内存中的对象?

c - 即使有大量可用内存,ENOMEM也会通过较大的shm地址范围生成mlock()失败