【问题标题】:Rendering to the screen in VB.net在 VB.net 中渲染到屏幕
【发布时间】:2011-06-24 13:20:13
【问题描述】:

我正在创建自己的 2D 引擎。我计划只使用 .net 绘图功能。但是,这非常慢,并且屏幕闪烁很多。我必须把它画到一个窗口上,但是......

最好的方法是什么?我将如何为这种情况添加缓冲区?

【问题讨论】:

    标签: vb.net gdi+


    【解决方案1】:

    假设您使用的是 GDI,“屏幕”闪烁问题是由于直接在主表面上写入所致。您可以通过执行以下操作来创建“位图”缓冲区来避免这种情况:

    Bitmap buffer = New Bitmap(Me.ClientSize.Width, Me.ClientSize.Height)
    

    然后从该缓冲区创建一个托管的“图形”对象,

    Using gfx As Graphics = New Graphics.FromImage( buffer )
    
    // draw with gfx object
    
    End Using
    

    要在主表面上显示更新后的后台缓冲区,例如:

    PrimaryGraphics.DrawImageUnscaled(buffer, 0, 0) 或者您可以 P/Invoke "BitBlt",我相信这会更快一些。

    如果您使用的是 C#,我建议您使用“不安全”代码块直接通过指针操作缓冲区,这可以大大加快处理速度。但是,我不相信 VB.net 支持它们。

    编辑:

    由于使用标准系统 CPU/内存资源实现的方式,GDI+ 无论如何都不会真正“超快”。

    您可以考虑使用SlimDX,它有一个围绕 Direct2D 的托管包装器,一个硬件加速的 2D API。有一些 tutorials 可供入门。

    编辑 2:

    如果你坚持使用 GDI,你可以在你的后台缓冲区上使用“LockBits”来做一些“优化”的内存操作,here 是关于这个主题的一篇很棒的文章。

    【讨论】:

    • 您的代码中有一个 New 太多。此外,在 VB 和 C# 中也可以操作阻塞的像素数组,这里不需要不安全的代码(尽管它可能会稍微快一些,因为它可能会省略索引越界检查)。
    • @Konrad 我意识到您可以将 bmp.LockBits() 与“元帅”对象一起使用并来回复制像素数组,但是与“( ptr * ) bmp.Scan0 + ( offset ) = val"。 :)
    • 是的。我认为 VB 中没有办法消除这个不必要的副本。但即便如此,LockBits 也比通过SetPixel 处理像素要快。
    • @Konrad 我绝对同意,但我们可能应该让 OP 在将他扔给狼群之前掌握翻转链的处理,哈。我会用一些额外的信息更新帖子。好点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 2014-08-26
    相关资源
    最近更新 更多