我目前正在使用OpenGL编写3D模型渲染器。不幸的是,当我告诉它渲染多个VBO
时,它会导致图形驱动程序崩溃。
以下是错误消息:
The NVIDIA OpenGL driver lost connection with the display driver
due to exceeding the Windows Time-Out limit and is unable to
continue.
The application must close.
Error code: 7
Would you like to visit
http://nvidia.custhelp.com/cgi-bin/nvidia.cfg/php/enduser/std_adp.ph
p?p_faqiq=3007 for help?
我有一个大约500KB的单个VBO,我只能渲染它的一小部分(只有模型的几个网格)。但是超过20个(在71个中)并且它会消失。我的电脑只有一年的历史 - 一台带有NVidia 555M的联想Y570,所有的驱动程序都是最新的等等。
我正在使用glDrawElementsBaseVertex
(即可编程管道),但只有在我不使用着色器程序时才会出现此问题。一旦我添加着色器,问题就会消失。但是,我仍然想知道为什么我的程序在工作负载非常小的情况下运行,但是当它变得更加苛刻时(其中“更多”甚至不是250KB)导致GPU出错。这似乎与程序崩溃并给我一个错误非常不同。
编辑:代码在glDrawElementsBaseVertex
上崩溃但不在我的嵌入式英特尔图形上运行,因为它对OpenGL的支持不包括我的程序的其他方面。我的NVidia驱动程序是9.18.13.697。
答案 0 :(得分:0)
似乎您的渲染所花费的时间远远超过Windows设置的默认值。如果没有VBO和着色器的更多细节,很难分辨出渲染时间的延长。但是,您至少可以增加默认延迟时间并查看渲染代码是否正确完成。要在Windows中执行此操作,您应该调整监视程序计时器,默认情况下会杀死需要2秒以上才能返回的着色器程序。
您可以更改计时器参数以满足您的需要。这是我们通常使用强大的GPU计算(如CUDA)进行的,因为计算比渲染需要更长的时间。参数由注册表关键字设置。您要查找的注册表项是TdrDelay
。但是,您应该设置以下两个注册表项才能正确执行(TdrDdiDelay
必须等于或大于TdrDelay
):
TdrDelay
:
KeyPath : HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers
KeyValue : TdrDelay
ValueType : REG_DWORD
ValueData : Number of seconds to delay. 2 seconds is the default value.
TdrDdiDelay
:
KeyPath : HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\GraphicsDrivers
KeyValue : TdrDdiDelay
ValueType : REG_DWORD
ValueData : Number of seconds to leave the driver. 5 seconds is the default value.
请阅读以下链接以获取Microsoft提供的更多详细信息,并在执行此操作时务必小心: TDR Registry Keys (Windows Drivers)
答案 1 :(得分:0)
我在使用NVS 5200M Nvidia显卡+最新驱动程序的Latitude e6530笔记本电脑上遇到过类似的问题。为了解决这个问题,我必须进入BIOS并将Video的“Optimus”复选框设置为ON。
答案 2 :(得分:0)
当我的Nvidia显示卡的加载超过其阈值时,我使用Bluestack时遇到了同样的问题。
我尝试过更新驱动程序,设置TdrLevel,TdrDelay,将任务管理器中的程序优先级设置为Realtime,使用Nvidia控件调整高性能,线程优化关闭,更改视频ControlSet的注册表,超频和增加电压,他们都没有工作。
最终解决方案倾向于使用调整工具(如EVGA Precision X)降低显示卡的电压,例如我的GTX550 Ti为1050mV,我将其降低到962mV并且显示非常稳定并且此后没有错误7。
这可能发生,因为Nvidia为某些系列的GTX卡设置的电压对于出厂值来说太高了,这在负载很高时会产生不稳定的渲染。