使用硬件渲染的图形时,我在SDL 2.0.3中遇到了莫名其妙的错误。由于某种原因,在程序启动后约5分钟,我的图形窗口关闭,但控制台窗口保持打开状态。没有引发任何错误或表示问题的任何信息。
当我暂停调试器时,程序会将断点放在SDL_RenderPresent()中。我将调用堆栈跟踪到ntdll.dll内部一个名为WaitForSingleObject()的函数,但是我不确定是什么导致它永久挂起。
另外,当我使用软件渲染的图形时,不会发生这种情况。我在装有最新驱动程序的AMD FirePro M5100 FireGL V上运行它。
我的问题是,有人知道什么可能导致SDL_RenderPresent()永不返回吗?
最佳答案
从描述看来,图形管线的较低层没有释放锁。
从5分钟后发生的事实看来,某处存在资源泄漏。
当然,所有这些都只是一个疯狂的猜测,但是我想说的是,应用程序代码或SDL代码正在泄漏资源(纹理的句柄,顶点缓冲区等)以及该部分代码(位于较低的位置) SDL级别或驱动程序中的级别)运行不正常(这种情况经常发生……在许多情况下,对低资源条件的测试和处理得不好)。
在软件渲染中不会发生这种情况,因为那里的资源基本上是无限的。这种问题的确认是,在软件渲染中运行时,程序可以运行,但进程内存的使用却在不断增长。
还应注意“捕获”任何异常/失败并在此之后继续运行的任何代码。编写在异常状态后能够正常工作的复杂软件非常困难(在琐碎的情况下,基本上是不可能的,因为异常安全性不会按组成比例扩展:不会使复杂性爆炸的唯一方法是进行逻辑分区“墙”并重新分配-初始化整个子系统)。
关于c++ - SDL_RenderPresent永久挂起,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28554279/