代码之家  ›  专栏  ›  技术社区  ›  JubileeTheBear

SDL_RenderPresent永远挂起

  •  1
  • JubileeTheBear  · 技术社区  · 9 年前

    我在SDL2.0.3中遇到了一个无法解释的错误,那就是使用硬件渲染的图形。出于某种原因,程序启动后大约5分钟,我的图形窗口关闭,但控制台窗口保持打开。没有抛出任何错误或任何表示问题的东西。

    当我暂停调试器时,程序将断点放在SDL_RenderPresent()中。我跟随调用堆栈找到了ntdll.dll内部的一个名为WaitForSingleObject()的函数,但我不确定是什么导致它永远挂起。

    而且,当我使用软件渲染的图形时,这种情况不会发生。我在安装了最新驱动程序的AMD FirePro M5100 FireGL V上运行它。

    我的问题是,有人知道什么可能导致SDL_RenderPresent()永远不会返回吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   6502    8 年前

    从描述中可以看出,图形管道的较低级别似乎没有释放锁。

    从5分钟后发生的事实来看,似乎某个地方存在资源泄漏。

    当然,所有这些都只是胡乱猜测,但我想说的是,应用程序代码或SDL代码都在泄漏资源(纹理、顶点缓冲区等的句柄),并且当代码用完时,部分代码(无论是在SDL的较低级别还是在驱动程序中)表现不佳(这种情况经常发生……在许多情况下,低资源条件没有得到很好的测试和处理)。

    这在软件渲染中不会发生,因为资源基本上是无限的。这类问题的一个证实是,当在软件渲染中运行时,程序可以工作,但进程内存使用量不断增加。

    还要注意“捕获”任何异常/失败并在之后继续运行的任何代码。编写在异常状态后能够正常工作的复杂软件是极其困难的(基本上不可能超越微不足道的情况,因为异常安全不会随着组合而扩展:唯一不会使复杂性爆炸的方法是逻辑分区“墙”并重新初始化整个子系统)。