代码之家  ›  专栏  ›  技术社区  ›  Camilo Martin

.NET中的多线程绘图?

  •  6
  • Camilo Martin  · 技术社区  · 14 年前

    ( 编辑 :澄清一下,我的主要目标是并发性,但不一定是多核的。 机器)

    我对所有关于并发性的概念都比较陌生,但是我发现我需要有并行绘图例程,原因有很多:

    • 我想单独绘制一个图形的不同部分(背景刷新频率低于前景,保持在缓冲区上)。
    • 我想要控制优先级(比绘制复杂的图形更优先于UI响应)。
    • 我想让每帧绘图计算多线程。
    • 我想为复杂的缓冲区绘制例程提供取消功能。

    然而,作为一个初学者,我的代码很快看起来像一团乱麻,重构或修复bug变得如此尴尬,以至于我决定在做任何严肃的事情之前,我需要更多地使用它。

    所以,我想知道如何使.NET多线程代码变得干净、易于维护,这在我第二天醒来后看到它时是有意义的。我遇到的最重要的问题是构建应用程序,使所有部分以一种智能(而不是笨拙和黑客)的方式相互交谈。

    欢迎有任何建议 但是我更喜欢在空闲时间可以消化的资源(例如,不是500多页的并发性论文),以及C/vb.net,直到最新版本(因为我看到 advances )基本上,我想要一些直截了当的东西,这样我就可以开始在我的玩具项目上玩概念了。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Reed Copsey    14 年前

    这个 Task Parallel Library 绝对是简化代码的地方。我亲自写了一篇(半长篇)介绍 Parallelism with .NET 4 这涵盖了很多有用的概念。

    但是,请注意,您可能会考虑将绘图保留为单线程。您应该尝试保持计算多线程,以及在GUI线程上完成的实际绘图操作。

    大多数绘图API都要求在同一同步上下文上执行所有实际的绘图调用。

    也就是说,使用新的集合类 ConcurrentQueue 简化这种类型的代码。试着从许多线程(生产者)的角度来考虑,将“绘图操作”添加到一个共享的并发队列中,并将一个线程(消费者)抓取并执行这些操作。

    这为您提供了一个合理的可扩展性,但相当简单的设计,您可以在此基础上进行构建。

        2
  •  9
  •   TomTom    14 年前

    但我发现我需要 并行绘图例程

    三个字:不在窗户下面。

    就这么简单。由于兼容性原因,标准Windows绘图是按定义单线程绘制的。任何用户界面控件(让我们坚持.NET世界)都只能从其创建线程中进行操作(因此,实际上,它比单线程更为残酷-它只是一个特定的线程)。

    你可以单独进行预分解,但真正的绘制不是从那条线开始的。

    除非您分配了一个位图,否则请在那里绘制自己的图形,然后将其转换为UI线程,以便在窗口上进行绘制。

    这与整个任务并行库等(我投了反对票)没有任何关系,而是回到了城镇,回到了一个非常古老的需求,出于简单的原因和兼容性,这个需求一直存在。这就是为什么任何UI线程都要作为集成线程设备上市的原因。

    另外请注意,如果您自己实现多线程绘图,则会有严重的影响。哪一个在光学上获胜(停留在前景中)?当使用多线程时,这并不是真正可以确定的。不过,你可以自由尝试。

    在这种情况下:

    • 必须有自己的缓冲区和同步。远离任何Windows级图形库(WPF或WinForms),除了最后一步(绘制位图)。

    • 据称Directx11支持多线程调用,但我不确定这会有多大影响。