3

我想知道改进我的 WPF 应用程序的最佳解决方案是什么。

我知道 WPF 会强制您在创建 UI 的线程上完成所有 UI 工作。这对我来说是个大问题,因为我的 UI 非常大而且我只有 1 个窗口,所以我不能每个窗口拆分 1 个线程。

当我进行平移和缩放时,每次都需要刷新所有内容,我的一个 CPU 使用率达到 100%,直到全部完成。

因此,我将尝试解释我的应用程序中的内容:

  • 1 个窗口(屏幕大小)
  • 虚拟面板,12000 px X 12000 px(我在其中进行平移和缩放)
  • 大约 2000 个控件(按钮、开关和其他一些复杂控件)
  • 在我的控件后面,我的背景有一个大位图,但我将我的背景拆分为我堆叠的 100 个较小的位图(因为 1 个 12k 像素 x 12k 像素的位图会使我的应用程序崩溃)
  • 10 个虚拟显示器,连接到远程计算机(提供位图)并每 50 毫秒刷新一次内容
  • .NET 4.0,多点触控应用程序

所以只是我可以进行平移和缩放的应用程序(没有 10 个显示器),控件的数量有很多滞后,当我放置显示器时,它会加倍滞后......

我的应用程序需要大约 1.5 GB 的虚拟内存。

我搜索了尽可能使用调度程序来制作线程,但我没有找到我想要的......他们到处谈论 1 个线程/窗口......但我只有 1 个窗口,不知道该怎么做。

  • 我不能分成更小的窗口。
  • 我无法减少控件的数量或刷新时间。
  • 我无法改变技术 (WPF)

所以这是真正的问题:我在哪里可以创建新线程来帮助我的渲染时间?要将作业拆分到不同的 CPU...

我发现他们谈论这个的不同网站......但没有回答我的问题:

使用多个 UI 线程运行 WPF 应用程序

MSDN

使用 WPF 调度程序

4

3 回答 3

2

所以我对此进行了一些搜索。一个应用程序可以在不同的线程中创建不同的窗口或页面:一段代码取自这里

  private void OnCreateNewWindow(
  object sender,
  RoutedEventArgs e)
  {
    Thread thread = new Thread(() =>
    {
      Window1 w = new Window1();
      w.Show();

      w.Closed += (sender2, e2) =>
      w.Dispatcher.InvokeShutdown();

      System.Windows.Threading.Dispatcher.Run();
    });

   thread.SetApartmentState(ApartmentState.STA);
   thread.Start();
  }

所以这是个好消息。但在你的情况下,这并不适用,因为你有一个窗口,我试过这个它并没有真正起作用:

     private void OnCreateNewWindow(object sender, RoutedEventArgs e)
     {
       SynchronizationContext syncContext = SynchronizationContext.Current;
       var btn = sender as Button;
       var st = btn.Parent as StackPanel;

       Thread thread = new Thread(() =>
         {
            Button button = new Button();
            syncContext.Post(delegate { st.Children.Add(button) ;}, null); //Exception here
         });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
     }

我试图在不同的线程中创建一个单独的控件,它可以工作,但是当我尝试将它添加到 stackPanel 时它失败了 InvalidOperationException

我知道它不会直接回答你的问题,但我至少你知道,同一个控件中的所有控件都Window必须属于同一个线程。

于 2012-07-09T12:51:35.947 回答
1

听起来您最需要使用虚拟化技术。用户在任何时候都只能看到虚拟工作空间的一小部分,所以你应该只刷新那部分。

除此之外,你有没有介绍过?究竟是什么与你的 CPU 挂钩?

于 2012-07-09T12:02:07.170 回答
0

我会“伪造”这些控件,并在缩放时将它们绘制到背景中。您甚至可以绘制看起来像控件的小图像。当使用较小(缩放)的背景时,您可以加快缩放速度。然后准备好后,我无法想象需要同时使用 2k 个控件,因此只能重新绘制或添加可以看到/操作的控件。计算每个控件的 x,y 并检查它们是否存在于 viewrectangle 中并绘制它们,比绘制它们要快得多。

大多数壮观的图形都是用这些技巧完成的。

于 2012-09-24T20:08:16.417 回答