火猴 "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:如何重新创建:
- 启动一个新的多设备应用程序。
- Select 空白申请。
- 放下一个 TTimer。
- 放置一个 TRectangle。
- 添加布尔 public 变量 "up"。
对于 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。这还有其他副作用:在我的例子中,我一直在使用具有默认大小规格的字体,当这是错误的时候缩放得很好,而当这是真的时变得非常模糊。 (我只是把字体变大了,但我敢肯定这不是设置它的唯一效果。)
在调试 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:如何重新创建:
- 启动一个新的多设备应用程序。
- Select 空白申请。
- 放下一个 TTimer。
- 放置一个 TRectangle。
- 添加布尔 public 变量 "up"。
对于 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。这还有其他副作用:在我的例子中,我一直在使用具有默认大小规格的字体,当这是错误的时候缩放得很好,而当这是真的时变得非常模糊。 (我只是把字体变大了,但我敢肯定这不是设置它的唯一效果。)