【发布时间】:2014-09-19 13:40:12
【问题描述】:
谁能解释一下为什么 TWebBrowser 控件在所有 XE 版本的 Delphi 上运行如此缓慢,包括 XE5 和可能的 XE6?要对此进行测试,您需要创建一个新的 Delphi 项目并将 TWebBrowser 控件放入其中。在表单展示活动中,导航到此网站:
http://ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html
请在 Windows 7 或更高版本上进行测试。导航完成后,运行 setImmediate 测试并观察结果。完成测试将花费大量时间。完成此操作大约需要一分钟。
当您打开真正的 Internet Explorer 浏览器并执行相同操作时 - 测试将立即完成(约 200 毫秒)。
一些额外的奇怪信息:
当您在旧版本的 Delphi(准确地说是 Delphi 7)上重新创建此过程时,Web 控件会以应有的速度运行,并且测试会立即完成。但是 HTML5 速度测试仍然会运行缓慢(此页面上的替代测试)。
另一个奇怪的事情是,在 C++ Builder 上可以看到同样的缓慢行为,但在 Visual Studio 产品中却没有。微软是否故意放慢 Embarcadero 产品中的 TWebBorwser 速度?我不敢相信。
我试图用不同的方法来克服这个问题,例如:
在注册表中尝试不同的功能选项,例如: FEATURE_GPU_RENDERING, FEATURE_BROWSER_EMULATION (11001), FEATURE_ALIGNED_TIMERS(未记录的选项), FEATURE_ALLOW_HIGHFREQ_TIMER(未记录的选项),
设置 timerBeginPeriod(1) - 无效。
如果有人知道如何解决此问题,请与我分享此信息。
更新1 如果有人在乎,我制作了独立的测试应用程序。它可以在这里下载:http://mp.org.pl/download/ietest.zip 它包含源代码和带有 htm 文件的 exe 应用程序。 HTM 文件包含一些 js 程序,它在独立 IE 中的运行速度比在 TWebBrowser 控件中快 10 倍。它使用 setImmediate 作为测试(与上述测试中使用的过程相同)。但是用这种方式进行测试会更容易。
【问题讨论】:
-
我的猜测是 IE 在嵌入到您的应用程序时会隐式使用兼容性视图。检查您的注册表配置并了解如何使您自己的应用程序具有 IShellDocView 的兼容性视图设置的显式配置。兼容性视图可能导致使用古老的慢速 JavaScript 或 HTML 引擎,相当于 IE 7 或 IE 8,而不是现代 IE。您在 FEATURE_BROWSER_EMULATION 项目上走在了正确的轨道上,但您没有具体说明您尝试了什么、什么值等。
-
当您使用 TEmbeddedWB 时也会出现这种行为吗? cf:github.com/danielfrimerman/Delphi-EmbeddedWB-XE3 或我的版本:bitbucket.org/wpostma/tembeddedwb
-
您可以发布 SSCCE 吗?
-
我测试了所有的兼容模式,你也可以自己检查。我指定我使用了 11001 设置(这是强制的 IE11)。这些设置都没有给出任何结果 - 但它们是有效的)。事实上,我测试了你的组件,结果同样糟糕。非常奇怪的是,用 Delphi 编写的旧编译版本的应用程序(它们都没有对注册表进行任何更改)工作得很好。该问题仅出现在 XE 版本的 Delphi 及更高版本上。 Delphi chromimum 项目提供了非常好的性能,但我不能在我的项目中使用它。我需要 TWebBrowser 来完成这项工作。
-
SetImmediate是经典的 MS hack。毫不奇怪,它在这种情况下不能按预期工作。试试这个 --> 开始测试,拖动表单的窗口,然后看着测试突然完成。性能似乎与主机应用程序消息循环的繁忙程度有关。这种行为在 C#(VS2010) 中对我来说也是一样的——Windows.Forms.WebBrowser控制。 Internet Explorer 本身可能会在内部执行某些操作来润滑 SetImmediate 的功能。至于为什么它似乎在 D7 中工作......谁知道呢??
标签: performance delphi twebbrowser