火猴 "No Debug Info"

Firemonkey "No Debug Info"

在调试 Firemonkey 应用程序(一个弹跳球)时,球四处移动一分钟左右,此消息开始涌入 EventLog:

模块负载:D3DCOMPILER_47.dll。没有调试信息。基址:14D50000 美元。进程 bo.exe (13824) 线程开始:线程 ID:14268。进程 bo.exe (13824)

这使得调试模式几乎没有用。这是一个 Delphi Architect 试用版,空白形式的 Firemonkey 应用程序。我想可能是因为它是试用版。

我确实看到大约三个线程在发生这种情况之前启动。我并没有有意识地启动任何线程,但我假设一个线程用于用户界面,一个是……用于调试器?我不知道。这是一个代表性示例:

Module Load: imagehlp.dll. No Debug Info. Base Address: A30000. Process bo.exe (19228)
Module Load: GPAPI.dll. No Debug Info. Base Address: 2D0000. Process bo.exe (19228)
Module Load: CRYPTNET.dll. No Debug Info. Base Address: 900000. Process bo.exe (19228)
Module Load: IPHLPAPI.DLL. No Debug Info. Base Address: 9B0000. Process bo.exe (19228)
Module Load: WINNSI.DLL. No Debug Info. Base Address: B40000. Process bo.exe (19228)
Module Load: NSI.dll. No Debug Info. Base Address: 940000. Process bo.exe (19228)
Module Load: ltc_game32.dll. No Debug Info. Base Address: D60000. Process bo.exe (19228)
Thread Start: Thread ID: 16400. Process bo.exe (19228)
Thread Start: Thread ID: 19268. Process bo.exe (19228)
Thread Start: Thread ID: 18640. Process bo.exe (19228)
Thread Exit: Thread ID: 16400. Process bo.exe (19228)
Thread Start: Thread ID: 6096. Process bo.exe (19228)
Module Load: D3DCOMPILER_47.dll. No Debug Info. Base Address: 510000. Process bo.exe (19228)
Module Unload: D3DCOMPILER_47.dll. Process bo.exe (19228)

最后两行将无限重复。

更新 #1(已编辑):我没有尝试调试 D3DCompiler。我正在尝试找出速度变慢的原因。

更新 #2:我关闭了模块的调试器消息,但这没有帮助。在相同的近似点,应用程序的速度急剧下降。这只会在调试时发生。

更新 #3:如何重新创建:

  1. 启动一个新的多设备应用程序。
  2. Select 空白申请。
  3. 放下一个 TTimer。
  4. 放置一个 TRectangle。
  5. 添加布尔 public 变量 "up"。
  6. 对于 Timer1Timer 添加以下代码:

    procedure TForm1.Timer1Timer(Sender: TObject); begin if up then my := -1 else my := 1; if (Rectangle1.Position.Y + my < 10) or (Rectangle1.Position.Y + my > 470) then up := not up else Rectangle1.Position.Y := Rectangle1.Position.Y + my; end;

将 TTimer 间隔设置得较低。在我的机器上我可以产生效果 间隔最多约为 60。这是我在进行上述调试器磨合的同时能够做到的最小值。

所以,Embarcadero 董事会上的 Firemonkey 大师 Eli M 给了我这个问题的答案,我 post 在这里为未来的人们提供答案:

FMX.Types.GlobalUseGPUCanvas := True;

就这么简单。

N.B。这还有其他副作用:在我的例子中,我一直在使用具有默认大小规格的字体,当这是错误的时候缩放得很好,而当这是真的时变得非常模糊。 (我只是把字体变大了,但我敢肯定这不是设置它的唯一效果。)