delphi - FireMonkey 性能问题

标签 delphi firemonkey

我正在使用带有更新 4 修补程序 1 的 Delphi XE2

我的默认 FMX 应用程序速度非常慢,有时会卡住一段时间。例如:当我单击按钮时,整个应用程序会卡住几秒钟(但仅限于该事件的第一次执行)。所以我认为这可能是 GPU 问题,并将我的默认 Dpr 文件编辑为 ;

uses
  FMX.Forms,  fmx.Types,..

{$R *.res}

begin
  Application.Initialize;

  GlobalUseHWEffects := False   ;
  GlobalUseDirect2D := False  ;
  GlobalUseDirect2DSoftware := False    ;
  GlobalUseGDIPlusClearType := True    ;
  GlobalDisableFocusEffect := True   ;

  Application.CreateForm(...);
  Application.Run;
end.

现在它按照我的预期工作,没有任何问题,但 CPU 使用率和以前一样(移动鼠标时为 25%)

然后我将代码修改为

  GlobalUseHWEffects := true  ;
  GlobalUseDirect2D := False  ;
  GlobalUseDirect2DSoftware := False    ;
  GlobalUseGDIPlusClearType := True    ;
  GlobalDisableFocusEffect := True   ;

现在一切工作都很顺利,启动时间只有一点点延迟,CPU 使用率非常低 (0 - 2%)。(这就是我需要 Firemonkey 的原因)

现在除菜单栏外,所有控件都按预期工作,上述设置不适用于菜单栏,并且它以默认行为工作(整个应用程序卡住几秒钟)。

我能做些什么来克服这个问题。

最佳答案

真正的问题是一些 Firemonkey 效果和 Firemonkeys 默认设置

default GlobalUseDirect2D = trueGlobalUseHWEffects := true 是性能问题的真正原因,启用两者是在我的机器中同时使用 CPU 和 GPU。因此,将其中之一他们是假的。我建议您使用 GlobalUseDirect2D = falseGlobalUseHWEffects := true 来减少 CPU 的使用。

现在您还可以获得改进的字体(firemonkey 可以生成的最好的字体)

并非所有客户都会拥有高端图形 GPU

我使用的是英特尔移动图形芯片,因此我认为我的芯片不具备支持所有 firemonkey 效果的所有功能。可以在 FMX.Types 中看到以下代码和注释

// On low-end hardware or mobile bitmap effects are slowly
  GlobalDisableFocusEffect: Boolean = False;

但我不明白为什么他们默认将其设置为false。(因此启用和禁用取决于客户端 GPU 功能)

通过GlobalDisableFocusEffect,您将无法再使用效果(例如:outergloweffect)......但同样,此声明仍然不再正确......

通过GlobalDisableFocusEffect,并非所有效果都被禁用,

例如

  1. windows风格中按钮风格的Tinnerglow效果是卡住的原因
  2. 深色风格的 headeritemstyle 中的 Tinnerglow 效果是卡住的原因。

可能有很多例子......

所以在我的场景中,我被迫删除样式中的所有效果..,混合,深色样式工作得更好,因为它们使用更少的TEffects(?),但现在我拥有更好的GUI和更好的性能(我感觉混合和深色风格看起来比原生 UI 更酷)

关于delphi - FireMonkey 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10878064/

相关文章:

android - Delphi Android RESTRequest: channel 无法恢复,将被丢弃

delphi - 在 Delphi 中将对象转换为 OleVariant

delphi - FireMonkey 控件的动画效果不流畅

Delphi - 在 FireMonkey 中正确显示消息对话框并返回模态结果

c# - Windows 上文本文件的事务处理

delphi - 如何获取可用字体列表 - Delphi XE3 + Firemonkey 2?

delphi - 如何在 Firemonkey (FMX) 中无缝循环声音?

delphi - 为什么我的程序在 Windows 2008 上运行时显示 "folder does not exist"?

mysql - DelphiXE4 和 MySQL 社区 5.6.12 中的最大查询长度

linux - TIdMBCSEncoding.Create ('ASCII' ) 在 Linux 上返回 MaxCharSize = 0