2020年代Win32 Delphi OpenGL应用仍需屏蔽浮点异常吗?
现代Win32 Delphi OpenGL应用是否仍需屏蔽浮点异常?
在Win32 Delphi应用中使用OpenGL时,屏蔽浮点异常是业界流传已久的常识。实际上Delphi的RTL会在后台自动处理这件事——因为OpenGL单元的初始化段包含了以下代码:
SetExceptionMask([exInvalidOp..exPrecision]);
(这个集合涵盖了所有浮点异常类型。)
2022年SetExceptionMask的文档指出:
与外部代码(如TWebBrowser、OLEDB、.NET程序集、ActiveX控件及OpenGL)交互时,通常需屏蔽和解除屏蔽异常。
但这段表述很可能已经沿用了20多年。早在1999年初,Set8087CW的RTL文档就有类似内容:
例如,使用OpenGL渲染3D图形时,建议禁用所有浮点异常。
如今该文本仅做了细微改动:
使用OpenGL渲染3D图形时,出于性能考虑,建议禁用所有浮点异常。
自上世纪末以来,技术环境已经发生了巨大变化:
- 1999年文档撰写时,用户普遍使用Windows 95,NVIDIA GeForce显卡尚未问世;OpenGL采用固定功能管线,多数程序会逐个向驱动发送顶点,材质、光照、雾效等效果均通过固定功能API实现。
- 现代OpenGL则完全不同:开发者需要自行编写并编译GPU程序(着色器),并向显存发送大型缓冲区,CPU在整个渲染流程中的参与度极低。
基于这些变化,问题随之而来:现代Win32 Delphi OpenGL应用仍需屏蔽浮点异常吗?
显然,不能仅仅因为添加了3D功能就随意改变应用的浮点处理逻辑。我曾尝试重新启用浮点异常,自己的现代Win32 Delphi OpenGL应用在本机运行完全正常,但这无法证明该操作是绝对安全的——会不会在10%的现代PC上导致崩溃?
遗憾的是,我并未在网络上找到权威且最新的相关结论。
相关问答
- Masking floating point exceptions with Set8087CW, SetMXCSR and TWebBrowser
- Masking exceptions in Delphi
内容的提问来源于stack exchange,提问作者Andreas Rejbrand
相关产品推荐
相关产品推荐

