OpenGL工件:它们来自哪里?

时间:2013-10-06 11:00:00

标签: java opengl lwjgl

Crap

故事

我已经在OpenGL中进行了大约一年的编码(在相同的硬件上),而且我最近才获得了如上图所示的工件。它们在短时间内(几分钟)连续运行我的程序后出现,并出现在任何地方:从写字板(见图片)到我的桌面和任务栏甚至其他游戏(英雄联盟发射器,它' sa)软件渲染器我想)。

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

INFO

我的应用程序看起来很好,没有任何文物

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

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

为什么我在这里发布这个?因为我仍然不确定这是由我的代码还是我的硬件/驱动程序引起的,我认为从技术角度来看这个问题很难我只会得到一个新的GC"在任何其他地方回答。

我使用了大量的OpenGL,从帧缓冲区和着色器到3d纹理和buffertextures以及纹理阵列等等。

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

MY GUESS

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

我不太了解OpenGL,我对图形卡及其驱动程序知之甚少,但我会尝试接近这一点,你可以随时向下拍摄。以下是一个杂乱无章的思路,随意阅读大胆的部分。

我在图形工件上找到的所有互联网资源都告诉我,由于过热导致内存不足。

然而,如果是这种情况,那么为什么这个"糟糕的RAM"只有在连续运行后才能访问,并且从未重新开始之后?当我的应用程序停止时,我的操作系统是否应该清理所有图形内存,重置我的GC状态?如果我的内存不好,似乎我的显卡无法跟上处理我的数据,并最终在其他所有内容访问时都会访问这部分内容""。如果RAM的故障是基于温度的,那么为什么我可以在15分钟内运行我的应用程序,但如果温度保持不变则在同一时间内不运行4次?

另外,它是真正糟糕的ram,那为什么我会看到我的纹理的一部分?难道这并不意味着内存在一部分工作得很好吗? (图片中的蓝色块是我使用的纹理的一部分)

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

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

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

那么......那么它是一个驱动程序错误吗? 我的朋友和我一样经营着同样的司机 ......我完全迷失在这里。

我可以得出的结论是,我的内存已经坏了,不管怎么说,除了我和我的应用程序之外,每个人都设法避免坏的部分。

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

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

与可能的情况相反,我只是要求提供信息和讨论,而不是直接解决方案,最好的解决方案显然是购买新的显卡。

重要来源:Diagnosing video card problems

1 个答案:

答案 0 :(得分:3)

  

我在图形工件上找到的所有互联网资源都告诉我,由于过热导致内存不足。

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

  

但是,如果是这种情况,那么为什么这个“坏RAM”只能在连续运行后才能访问,而且从未重新开始?

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

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

  

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

嗯,假设操作系统在程序运行时保留了一些新的图形内存,即使程序终止,其他分配也会保留。或者在程序终止后,驱动程序的内部状态将使它分发出比以前更多的内存部分。

因此,并非所有图形RAM都有缺陷。只有在(非缺陷)RAM的第一部分被预先分配时才能访问的后续部分。

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