【问题标题】:Ultra fast drawing in DotNETDotNET 中的超快速绘图
【发布时间】:2010-11-06 09:52:51
【问题描述】:

初始测试表明 GDI+(用 VB.NET 编写)对于我的目的来说不够快。我的应用程序需要能够以每秒 20+ 帧的全屏分辨率绘制数以万计的粒子(彩色圆圈,最好是抗锯齿)。

我对离开 GDI+ 犹豫不决,因为我还需要 GDI+ 的许多其他高级绘图功能(虚线图案、图像、文本、路径、填充)。

寻找有关使用 OpenGL、DirectX 或其他平台在 VB.NET 中加速粒子渲染的好建议。我的应用完全是 2D 的。

善意, 大卫

【问题讨论】:

    标签: vb.net gdi+ drawing performance


    【解决方案1】:

    因为 GDI+ 不被显卡移动,所以渲染很慢,因为它使用 CPU 来渲染。至少,您可以使用 DirectX 或 SlimDX。

    (抱歉英语不好)


    看到这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ff729480%28v=vs.85%29.aspx http://www.codeproject.com/Articles/159586/Starting-DirectX-with-Visual-Basic-NET

    【讨论】:

      【解决方案2】:

      正如杰瑞德所说, 可能是您的大部分周期没有进入 GDI,您也许可以减少这些。

      找到它们的一种简单方法是随机停止它几次并检查堆栈。你在浪费时间的行为中抓住它的机会等于浪费时间的比例。

      出现在多个此类示例上的任何指令或调用指令都是某种东西,如果您可以替换它,您会看到加速。

      In general, the method is this.

      【讨论】:

        【解决方案3】:

        在使用 GDI+ 编写游戏制作器时,我发现最显着的速度提升是将位图转换为 Format32bppPArgb;-

        SuperFastBitmap = ConvertImagePixelFormat(SlowBitmap, Imaging.PixelFormat.Format32bppPArgb)

        如果它们尚未采用此格式,您将在转换时立即看到差异。

        【讨论】:

        • 那是杰拉特。谢谢。你知道为什么会出现这种效果吗?
        【解决方案4】:

        如果你想使用 VB.NET,那么你可以使用 XNA 或 SlimDX。

        我有一些使用 GDI+ 和 XNA 创建游戏的经验,我可以理解 GDI+ 给您带来的麻烦。 如果我在你那里我会检查 XNA,它比 GDI+ 快得多,因为它实际上使用你的视频卡进行绘图,并且它有很多很好的在线文档和示例。

        SlimDX 看起来也不错,但我没有任何经验。 SlimDX 基本上是 .NET 的 DirectX API。

        【讨论】:

        • 请注意,在早期版本的 XNA 中,很难将 WinForms 应用程序与 XNA 混合使用。据我所知,现在支持。
        • 你们是金子!非常感谢。我会忙一个星期左右尝试所有这些东西。
        【解决方案5】:

        当您在 VB.net 中工作时,您是否尝试过使用 WPF(自 3.0 以来是 .net 的一部分)?由于 WPF 基于 DirectX 而不是 GDI+,这应该可以为您提供所需的速度,尽管开发 WPF 并非一帆风顺。

        【讨论】:

        • 我还没有,但我现在会。谢谢你的提示。到目前为止我一直在使用DotNET2.0,但没有理由不能切换。
        【解决方案6】:

        获得所需速度的唯一方法是从软件渲染转向硬件渲染......不幸的是,这确实意味着转向 OpenGL 或 DirectX。

        另一种方法是尝试优化您的图形例程,以仅绘制需要绘制的粒子,而不是整个屏幕/窗口。

        我同意 JaredPar 的观点,即您最好先进行分析以确定您现有的代码库是否可以改进,然后再大量切换到新框架。如果您不熟悉 DirectX,它并不是最简单的框架。

        【讨论】:

        • 不幸的是,整个粒子云同时可见是很重要的。当用户放大时,我可以丢弃许多粒子(它们存储在八叉树和 2D 网格中,因此这部分很容易),但它也必须适用于完全缩小的视图。是否可以在同一个内存位图上同时使用 GDI+ 和 -say- DirectX,或者我会在这两个 SDK 之间丢失宝贵的毫秒位传输像素?
        • 我认为不可能在同一个内存位图上使用 GDI+ 和 DirectX - 一个由显卡渲染,另一个由软件渲染。您可以将 GDI+ 绘制到与绘制 DirectX 相同的 hWnd 上,但同步它们可能有点困难。
        【解决方案7】:

        问题可能出在您的算法上,而不是 GDI+。剖析是唯一确定的方法。如果没有配置文件,您很可能会切换到新的 GUI 框架并遇到完全相同的问题。

        如果您进行了配置文件,那么 GDI+ 的哪一部分导致了问题?

        【讨论】:

        • 我已经放弃了对这段代码的所有优化,但我一直无法正确分析显示代码。我发现当我向性能敏感代码添加分析时,我总是最终会改变实际性能(我认为粒子物理学家一直在努力解决类似的问题)。全屏绘图不是问题。如果我只渲染几个粒子,刷新率是很可以接受的。我尝试将粒子渲染为填充椭圆、单个 GraphicsPath,并使用 DrawBitmap 和具有完全正确像素深度和分辨率的精灵。
        • @David-Rutten:你有没有解决这个问题?阅读您的评论,我不得不说,请不要指望您的分析不会减慢速度。 没关系。 重要的是每个例程或代码行中的时间百分比,因为如果该例程或代码行不存在,那将被保存。我所说的时间是指挂钟时间。如果采样仅限于线程内 CPU 时间,则会对可能需要大量时间的系统调用视而不见。
        • @Mike:我无法在 GDI+ 中令人满意地解决这个问题。在动态重绘期间降级显示似乎是我唯一能想到的解决方案。我现在正在研究 GTK+,但最近我的工作变得更好了,我已经从 UI 代码切换回核心开发。
        猜你喜欢
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-28
        • 2012-04-17
        相关资源
        最近更新 更多