2

废话

故事

我已经在 OpenGL 中编码大约一年了(在相同的硬件上),而且我最近才得到类似上图中的伪像。它们在短时间内(几分钟)连续运行我的程序后出现,并出现在任何地方:从写字板(见图)到我的桌面和任务栏甚至其他游戏(英雄联盟启动器,它是我的软件渲染器)思考)。

它们可以采用类似于您在图像中看到的任何形式:黑色/白色块或我的应用程序中的纹理块。受影响的应用程序刷新其屏幕后,工件就会消失。

信息

我的应用程序本身看起来很好,没有伪影

我正在使用带有最新驱动程序的 ATI m5800 卡(我有一个 hp elitebook 8540w)、windows 7 64bit 和 Opengl 3.3 或更低版本。

为什么我不发布代码示例?因为(听起来很讨厌)它似乎并不是我的代码中导致工件的特定部分,所以我可以轻松地运行该程序 15 分钟而不会出现问题。我的显卡将加热到 68 摄氏度,并且不会出现伪影。在多次连续运行后开始出现伪影,尽管即使出现伪影,我的视频卡也不会升温超过 68 度。

为什么我在这里发这个?因为我仍然不确定这是由我的代码还是我的硬件/驱动程序引起的,而且我认为从技术角度来看这个问题已经够难了,以至于我只能在其他任何地方得到“购买新的 GC”的答案地方。

我使用了很多 OpenGL,从帧缓冲区和着色器到 3d 纹理、缓冲纹理和纹理数组等等。

据我所知,我的硬件没有受到任何损坏,尽管它是一本精英本,所以很容易过热。

我猜

(当我提到 RAM 时,我指的是显卡上的视频 RAM)

我对 OpenGL 知之甚少,对显卡及其驱动程序知之甚少,但我会尝试解决这个问题,你可以随时击落我。以下是杂乱无章的思路,请随意阅读粗体部分。

我可以在图形工件上找到的所有 Internet 资源都告诉我,我的 RAM 因过热而损坏。

但是,如果是这种情况,那么为什么只有在连续运行后才访问此“坏 RAM”,而在重新启动后才访问?当我的应用程序停止时,我的操作系统不应该清理所有图形内存,重置我的 GC 状态吗?如果我的内存坏了,我的显卡似乎无法跟上我的数据处理速度,并最终在其他所有东西都被“占用”时访问了这块内存。如果 RAM 的故障是基于温度的,那么为什么我可以在 15 分钟内运行我的应用程序一次,但如果温度保持不变,则不能在同一时间段内运行 4 次?

此外,它确实是坏 ram,那为什么我看到我的纹理的一部分?这难道不意味着 RAM 在某一部分工作正常吗?(图片中的蓝色块是我使用的纹理的一部分)

更重要的是:为什么我似乎只在我的应用程序中获得工件,而在其他任何地方都没有?我安装的任何其他应用程序都没有在任何地方产生这些工件!

这表明这不是我的硬件而是我,我做错了什么!(或者 OpenGL 在我的笔记本电脑上做错了,因为大多数游戏可能在 DirectX 上运行)。

现在是最后一部分,这使整个事情成为一个奇迹:我的硬件部分由我的大学资助,这意味着我的一个朋友拥有相同的硬件(真正 100% 相同),并且他没有得到任何运行我的代码的工件。

那么......那是驱动程序错误吗?我的朋友和我运行同一个驱动程序......我完全迷失在这里。

我所能得出的结论是我的 RAM 坏了,除了我和我的应用程序之外,每个人都设法避免了坏的部分。

我想问的是:我是如何得到这些文物的?一些应用程序如何避免它们?硬件/软件发生了什么?

PS:我知道这是一个非常不结构化和混乱的问题,这是因为我已经有一段时间了,并且我试图包含我发现的任何信息。我将感谢任何人可能认为与该主题相关的任何信息,无论是今天还是一年后,如果有任何建议出现,我将很乐意重组这篇文章。我已经搜索了很多关于工件的信息,但大量搜索结果描述了由于代码引起的异常,仅限于相关应用程序,这对我没有什么帮助。这意味着我可能错过了重要的来源,如果您认为我错过了,请链接它们。

与这看起来相反,我只是寻求信息和讨论,而不是直接解决方案,最好的解决方案显然是购买新显卡。

重要来源:诊断显卡问题

4

1 回答 1

3

我可以在图形工件上找到的所有 Internet 资源都告诉我,我的 RAM 因过热而损坏。

他们很可能是对的。这是有缺陷的图形 RAM 出现的典型错误。

但是,如果是这种情况,那么为什么只有在连续运行后才访问此“坏 RAM”,而在重新启动后才访问?

因为在重新启动后,实际使用的图形 RAM 的一小部分。像只有第一个 64MiB 左右的东西。与现代显卡(几个 100MiB)上存在的大量 RAM 相比,这是一个相当小的内存量。

在您的程序运行一段时间后,它会消耗一些 RAM,如果它正在创建和释放大量 RAM,则更是如此。出于性能原因,所有图形 RAM 分配必须是连续的。为了让事情变得简单和快速,驱动程序只会增加基指针,以便进一步分配到未使用的连续 RAM 的开头。

当我的应用程序停止时,我的操作系统不应该清理所有图形内存,重置我的 GC 状态吗?

好吧,假设操作系统在您的程序运行时确实保留了一些新的图形内存,即使程序终止,其他分配也会保留。或者在您的程序终止后,驱动程序的内部状态将使其分发与以前不同的内存部分。

因此,并非所有图形 RAM 都有缺陷。只有后面的部分才会被访问,只有第一部分(无缺陷​​的)RAM 被预分配。

从技术上讲,可以识别 RAM 的缺陷部分并不再使用它。但是驱动程序中没有支持(我知道)。

于 2013-10-06T14:40:38.563 回答