gpt4 book ai didi

java - OpenGL 工件 : where do they come from?

转载 作者:行者123 更新时间:2023-11-30 08:29:40 26 4
gpt4 key购买 nike

Crap

故事

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

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

信息

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

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

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

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

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

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

我的猜测

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

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

我可以在图形工件上找到的所有互联网资源都告诉我,由于过热导致 RAM 损坏。

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

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

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

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

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

那么......这是一个驱动程序错误吗? 我的 friend 正在运行与我相同的驱动程序 ......我完全迷失在这里。

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

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

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

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

重要来源:Diagnosing video card problems

最佳答案

All internet sources I can find on graphics artifacts tell me I have bad RAM caused by overheating.



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

However, if this is the case, then why is this "bad RAM" only accessed after consecutive runs, and never after a fresh start?



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

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

Shouldn't my OS clean up all graphics memory when my application stops, resetting the state of my GC?



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

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

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

关于java - OpenGL 工件 : where do they come from?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19208107/

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