C # скорость рисования картинки - PullRequest
0 голосов
/ 16 декабря 2010

Я понял, что метод 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 );
}

Ответы [ 3 ]

4 голосов
/ 16 декабря 2010

PixelFormat изображения имеет решающее значение.Подавляющее большинство машин сегодня используют свои видеоадаптеры в режиме 32bpp.Это делает Format32bppPArgb более чем в 10 раз быстрее, чем любые другие, включая 32bppArgb и 24bppRgb.Обязательно создайте изображение в этом формате, при необходимости преобразуйте его.

Также очень важно, чтобы вы нарисовали изображение с его исходным размером.Вы делаете это в собственном коде, но не обязательно с PictureBox.Он использует высококачественную интерполяцию изображения, если ему нужно изменить размер изображения.Это требует времени.

2 голосов
/ 16 декабря 2010

Я не совсем уверен, что вы спрашиваете. Почему рисование в C # медленнее, чем в C ++? Прежде всего потому, что стандартный класс Graphics, предоставляемый .NET Framework, использует методы рисования GDI +, которые намного медленнее, чем функции GDI, используемые C / C ++.

Вам интересно, как ускорить рисование в C #? Было бы очень полезно, если бы вы опубликовали соответствующий раздел (ы) своего кода, который, по вашему мнению, слишком медленный. Хотя использование библиотеки Graphics определенно медленнее, чем некоторые альтернативы, в большинстве случаев ее производительность не является фактором. Если вы не рисуете много графики в тесном цикле, у вас не должно возникнуть никаких проблем. Если это так, более вероятно, что ваш код может быть оптимизирован , а не заменен полностью. (Конечно, C # - это не то, что вы захотите использовать, если вы действительно ищете графику в реальном времени. В вашем вопросе недостаточно подробностей, чтобы сказать.)

В качестве альтернативы, вы можете P / вызывать основанные на GDI функции рисования из Win32 API и / или рассмотреть возможность использования кода unsafe в своем приложении C # для непосредственного управления растровыми изображениями. Это должно дать вам очень сравнимую производительность с кодом рисования в C ++ DLL, которую вы упоминаете в своем вопросе, потому что вы будете использовать те же процедуры. Тем не менее, еще раз, вам нужно будет предоставить более подробную информацию в вашем вопросе, если кто-либо из нас предоставит более конкретный, полезный совет.

0 голосов
/ 17 декабря 2010

PictureBox делает немного больше фоновых вещей, чем просто рисование изображения.

Попробуйте нарисовать прямо на элементе управления / окне в событии рисования.

Graphics.DrawImageUnscaled (...), вероятно, будет самым быстрым методом Framework.

Если вы хотите быстрее, вам нужно взглянуть на DirectX или OpenGL и разгрузить чертеж на выделенное оборудование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...