假设我正在为 OpenGL 对象编写包装器。在处理异常安全时,我也想考虑 OpenGL 错误(即,当发生错误时,调用 OpenGL 函数的方法返回错误代码或抛出异常)。这样做的目的不是在调试构建期间进行调试,而是在发布构建的运行时处理任何可能的错误。有什么方法可以实现吗?
除了在调试构建中记录日志之外,我不确定是否使用调试输出,同时 glGetError
感觉有点奇怪和不可靠。
最佳答案
Let's say I'm writing a wrapper for an OpenGL object.
第 1 步:不要那样做。我知道这听起来很轻率,但请不要这样。我可以理解想要一个托管对象类型,例如 unique_ptr
但对于 OpenGL 对象。但任何超出此范围的包装几乎肯定对您造成的伤害远大于它的帮助。特别是如果抽象是错误的。 OpenGL 对象和机制之间的交互通常不适合这种事情。
您将从使用 OpenGL 中获得更多 yield direct state access直接调用而不是将 OpenGL 函数包装在某些对象接口(interface)后面。您的代码不会仅仅通过使用成员函数就神奇地变得更好。
when one occurs, a method calling the OpenGL function returns an error code or throws an exception
第 2 步:也不要这样做。大多数 OpenGL 错误是使用错误(即您错误地使用了 API)。使用错误不应作为 C++ 异常处理。异常应该是针对无效输入或具有意外格式的纹理等情况。来自代码之外的东西。使用异常来处理编程错误通常不是一个有用的想法。
如果您需要调试 OpenGL 应用程序,基本上有两种处理方法。对于日常验证,您应该使用 Debug Output记录您收到的任何错误。这对于“发布”类型的构建特别有用(尽管您仍然需要使用 debug context 来确保调试输出支持)。
如果出现错误,您可以加载 Renderdoc 或类似工具,它可以准确告诉您错误产生的位置。或者,您可以设置调试输出,以便它为您提供同步错误消息而不是异步错误,这样您就可以在错误来源的中间设置断点。无论哪种方式,您都应该能够使用最少的专用代码轻松追踪它,最重要的是,没有函数包装器。
事实上,Renderdoc 和类似工具对于跟踪发布版本中的 OpenGL 错误比任何人自己编写的任何工具都更有用。您可以获得所有 OpenGL 调用的踪迹,包括参数值等。这只是处理错误的更好方法。
关于c++ - 在运行时处理 OpenGL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157717/