繁体   English   中英

C#图片框绘制速度

[英]C# picturebox drawing speed

我体验到I.方法比II。方法慢。 我的应用程序进行实时图像处理。 我知道C#并不是为此目的的理想选择,但是我可以将对性能有严格要求的事情分开,例如以C ++实现。 我想知道为什么在C#中没有任何计算的简单位图绘制速度变慢。 我的问题:C#中有比我更快的方法吗?

I. C#:

void DrawImg(Bitmap b)
{
    pictureBox1.Image = b;
    pictureBox1.Invalidate(); 
}

II. C# + C++ + OpenCV

C# side:
[DllImport("MyWrapper.dll")]
static extern void showimg(IntPtr p, int x, int y);

void DrawImg(Bitmap b)
{
        BitmapData d = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
        showimg(d.Scan0, d.Width, d.Height);
        b.UnlockBits(d);
}

C++ side:
extern "C" void __stdcall showimg(uchar* p, int x, int y)
{
    Mat img; // OpenCV's Mat class
    img.create(y, x, CV_8UC3);
    img.data = p;
    imshow( "Window1", img );
}

图像的PixelFormat至关重要。 如今,绝大多数机器都以32bpp模式运行其视频适配器。 这使得Format32bppPArgb的速度是32bppArgb和24bppRgb的10倍以上。 确保确保以该格式创建图像,并在必要时进行转换。

同样非常重要的是您以原始尺寸绘制图像。 您可以使用本机代码执行此操作,但不一定要使用PictureBox。 如果需要调整图像大小,则在图像上使用高质量插值。 这需要时间。

我不确定您要问什么。 为什么用C#绘制比用C ++绘制慢? 主要是因为.NET Framework提供的标准Graphics类使用GDI +绘制方法,该方法比C / C ++使用的GDI函数要慢得多。

您是否想知道如何加快 C#的绘制速度 如果您认为自己的代码相关部分过慢,那将非常有帮助。 虽然使用Graphics库绝对比某些替代方案要慢,但在大多数情况下,它的性能并不是一个因素。 除非您要紧密地绘制许多图形,否则您不会遇到任何问题。 如果是这样,则更有可能可以优化代码,而不是完全替换代码。 (当然,如果您实际上正在寻找实时图形,那么C#不是您想要使用的。问题中没有足够的细节可以说明。)

或者,您可以从Win32 API P /调用基于GDI的绘图函数,和/或考虑在C#应用程序中使用unsafe代码直接操作位图。 这将为您提供与您在问题中提到的C ++ DLL中的绘图代码非常可比的性能,因为您将使用相同的例程。 但是,如果我们当中有人要提供更具体,有用的建议,则需要再次提供更多详细信息。

PictureBox所做的背景工作比仅绘制图像还要多。

尝试在绘制事件中直接绘制到控件/窗口上。

Graphics.DrawImageUnscaled(...)可能是最快的Framework方法。

如果需要更快的速度,则需要查看DirectX或OpenGL,并将图形卸载到专用硬件上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM