大家下午好!
我目前的一个项目遇到了一个相当烦人的问题。我正在我当前的一个项目中使用硬件库(Andreas Hausladen 的 NVAPI Pascal 标头翻译)。这个库允许我从 NVIDIA GPU 检索信息。我用它来检索温度,在 Firemonkey 的帮助下TAnimateFloat
,我正在调整定制表盘上的角度以指示温度。
由于 FMX 在 Windows 上默认为 Direct 2D,因此我可以使用任何各种“游戏玩家”工具(MSI Afterburner、FRAPS 等)来监控 FPS。
我遇到的问题是,当我将系统置于睡眠模式(挂起到 RAM/S3),然后再次启动它时,我的应用程序上的界面被黑屏(部分或完全),并且 UI 上什么也没有明显令人耳目一新。我定期调用 NVAPI 库的初始化并通过计时器检查结果,但这并不能解决问题。我也在运行ProcessMessages
并repaint
在父表盘上,它是子控件(因为我似乎无法找到repaint
表单或等效项)。
我尝试了各种版本的库,每个版本都存在相同的问题。下一段表明这实际上不是问题,它实际上是渲染器的错误。
我有一个解决方案,但我想知道是否有更...优雅、可用的东西。我的解决方案涉及在我的项目源代码中添加FMX.Types.GlobalUseDirect2D := False;
之前。Application.Initialize
但是,这会强制 FMX 使用 GDI+ 而不是 Direct2D。它当然可以,但是如果可以的话,我想将 D2D 作为一个选项保持打开状态。我可以FindCmdLineSwitch
根据参数打开/关闭此功能,但这仍然需要我重新启动应用程序才能从 D2D 更改为 GDI+,反之亦然。
奇怪的是,FPS 计数器(在我的例子中来自 FRAPS)表明 UI 中仍在发生活动(因为值会按预期发生变化),但 UI 本身并没有明显令人耳目一新。
这是与 Direct2D 相关的问题,还是 Firemonkey 实现的错误?更重要的是,有没有比禁用 D2D 更好的修复方法?最后,同样相关的是,是否可以在不先终止应用程序的情况下“重新初始化”应用程序(所以也许我可以允许用户在 GDI+ 和 D2D 之间切换而无需重新启动应用程序)?