【问题标题】:Using .NET desktop application with DevExpress over Remote Desktop通过远程桌面使用 .NET 桌面应用程序和 DevExpress
【发布时间】:2013-08-14 08:53:08
【问题描述】:

我将一个 Delphi 桌面应用程序移植到 .NET(C#)。 它们都使用 DevExpress 组件,并且必须通过 Remote Destop 连接使用。

远程桌面连接速度较慢。 当两者都通过远程桌面进行测试时; Delphi 应用程序似乎比 .NET 应用程序快得多。

在 .NET 中,页面像网页加载一样逐部分打开,但我希望页面在一个部分中加载。

我能做到吗?

PS。我使用 DevExpress 的 UserControl 组件作为页面(标签)。

PPS。我取消了加载和启动屏幕组件的淡入和淡出效果以加快速度。​

Delphi 应用画面视频:http://www.youtube.com/watch?v=7mHHDsqe5Dg&feature=youtu.be

.NET 应用程序屏幕视频:http://www.youtube.com/watch?v=P7N-FEcVoLQ&feature=youtu.be

更多细节:

这是应用程序中最复杂的页面之一。它是 DevExpress 的“XtraUserControl”用户控件实现(与 winforms 用户控件基本相同)。

我使用了 DevExpress 的 LayoutControl > LayoutControlGroup > LayoutControlItem 组件来对齐用户控件上的组件(网格、按钮、文本框等)。

这里是用户控件的主要容器(页面如上):

Tabs(像这样的用户控件)的主要容器是 DevExpress 的“XtraForm”表单实现。当从容器表单中选择菜单项时,相关的用户控件(页面)会作为选项卡项加载到主容器表单上,用户可以在选项卡之间导航或从菜单打开新页面(用户控件)。

【问题讨论】:

  • 您是否尝试过使用 NGEN 工具为您的 .Net 应用程序创建原生镜像?
  • 不,我不知道。似乎有助于解决问题。我会检查并回复。
  • 很难说发生了什么。需要有人知道这两个应用程序在做什么、它们是如何实现的以及使用了哪些控件才能取得进展。此刻就是你。在您提供一些真实的细节之前,您只能靠自己。
  • @gesus 你在比较苹果和梨。 Delphi 控件与.net 控件完全不同。很可能渲染框架也不同。也许你的应用程序有很大的不同。无论如何,尽管 Dmitry 说了什么,但没有什么神奇的开关可以解决您的问题。问题是远程连接上的流量。 Dmitry 建议您在加载前编译,并在 WOW64 下运行。但这些建议似乎与网络流量问题无关。如果您希望您的应用程序在 rdp 下更好地工作,我建议您与 devexpress 交谈。他们是那些不去的人
  • @gesus 我看不出 Ngen 有什么帮助。我建议您在此线程中将他们指向我的 cmets,并要求他们更认真地考虑您的请求。如果他们建议 Ngen,那么他们还不够努力。

标签: .net winforms delphi devexpress remote-desktop


【解决方案1】:

自 2007 年以来,我一直在使用 DevExpress .Net 控件(而且有时还使用它们的控件源代码)。似乎我知道在 RDP 下这些控件出现视觉缺陷的可能原因。 这些原因是:
- 蒙皮技术(基于位图)
- 双缓冲绘画

那么,让我解释一下。当用户通过远程桌面连接进行连接时,控件执行的所有绘图操作都通过网络连接传输到 RDP 客户端进行显示。如果控制绘制一条线,“DrawLine”命令通过网络发送到客户端。如果控件绘制文本,则发送“DrawText”命令(连同要绘制的文本)。 但如果控件绘制位图,则需要通过网络传输整个位图。因此,这可能是使用低带宽连接时的主要瓶颈。

双缓冲绘画基于将所有绘画操作执行到离屏位图中。然后使用BitBlt 方法将此位图复制到屏幕上。这种技术在 DevExpress 控件中用于绘制各种视觉效果和流畅的动画。当控件的元素被快速重绘时,这避免了控件中的任何闪烁,也用于绘制蒙皮的控件元素(下面有更多详细信息)。 但是当使用 RDP 时,BitBlt 操作也会作为整个位图通过网络传输,因此在使用低带宽连接时这是一个问题。

DevExpress Skinning technology 是基于位图的。皮肤是一组位图,用于确定应如何在所有可能的状态(正常、热跟踪、选择、按下等)中绘制控制元素。当控件绘制自身时,它会逐个元素地绘制这些位图。它使 DevExpress 控件变得如此美丽和像素完美。
我从您的视频和屏幕截图中看到您的 .Net 应用程序使用了皮肤(而且具体皮肤似乎是“DevExpress 样式”),但您的 Delphi/VCL 应用程序没有皮肤。这是真的吗?我相信,是的。因此,减少应用程序缺陷的可能方法是禁用表单蒙皮并使用平面样式进行控制:

// .NET application, Program.cs
...
DevExpress.Skins.SkinManager.DisableFormSkins();
DevExpress.Skins.SkinManager.DisableMdiFormSkins();
DevExpress.LookAndFeel.UserLookAndFeel.Default.SetFlatStyle();
...

相关帮助主题:Look And Feel OverviewLook and Feel Mechanism

我还应该注意,Flat-painting 不是双缓冲的,因此它可能是慢 RDP 连接的一种可能的解决方案。

重要例外:某些 DevExpress 控件不支持平面绘制(例如 RibbonControl)。我知道 LayoutControl、XtraGrid 和大多数 XtraEditor 都支持平面绘制。关于其他控件,您应该直接联系 DevExpress。

附: @David Heffernan:感谢您为我指明正确的方向。
附言 我在 cmets erlier 中提到的所有事情都是真实的事情,它们可以在应用程序启动时和一般情况下提高应用程序的性能。但这些事情与原来的网络流量问题无关。

更新
相关 DevExpress 支持文章:
How to speed up Windows Forms applications, running in a Remote Desktop Services (formerly known as Terminal Services) environment

【讨论】:

  • +1 这更像!很可能这里的建议可以提供帮助。我想添加一条评论。您的应用程序可以(并且应该)检测到它正在远程会话中运行。当它检测到它应该切换到带宽友好的渲染。这样,您可以在本地运行时保留漂亮的视觉效果,但在远程运行时具有性能。
  • +1 表示大卫的评论。要检查您的应用是否在 RDP 下运行,请检查 SystemInformation.TerminalServerSession 属性
  • @DmitryG 我会试试你的解决方案,我猜 Ngen 不会对我的问题产生任何影响?
  • @gesus 是的,NGen 不会影响与原来的网络流量问题相关的事情。
  • 其实Delphi版也有皮肤。在 ComboBox 右上角,您可以为 delphi 和 .NET 选择 sking。我对两者的 RDP 连接进行了一些测试,并通过 WireShark 计算流动数据。似乎在 Delphi 上流动的数据较少。当我在 .NET 上关闭皮肤时,流动的数据也减少了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多