Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Быстродействие при работе с графикой


Автор: Artemon 20.12.2006, 14:25
Я сделал программу, которая читает BMP напрямую из файла на C++Builder, затем решил переписать ее на C#. Переписал и очень удивился, когда обнаружил, что скорость загрузки изображения в C# в 2 раза меньше чем в C++.

Скорость теряется в следующем куске:
Код

Bitmap B = new Bitmap(200, 200);
B.SetPixel(X, Y, Color.FromArgb(....));


Аналогичный код в C++
Код

Image1->Canvas->Pixels[X][Y] =  (TColor)RGB(....)



Может быть можно как-то оптимизировать данный кусок?

Автор: Naum 20.12.2006, 14:56
Попутный вопрос (может быть и ответом в этом топике). C++ Builder работает с GDI или с GDI+?

Автор: ivashkanet 20.12.2006, 15:12
Цитата(Artemon @  20.12.2006,  13:25 Найти цитируемый пост)
читает BMP напрямую из файла 

Цитата(Artemon @  20.12.2006,  13:25 Найти цитируемый пост)
B.SetPixel(X, Y, Color.FromArgb(....));

Т.е. прочитала пару байт --- поставила пиксель на картинке?

Тогда это еще хорошо что всего двукратное падение smile
Get/SetPixel работает не очень рационально. Это все плата за безопасность кода и др...

Вариантов два:
1) Лучший:
Код

Bitmap bitmap = Bitmap.FromFile("tra-lya-la.bmp");

2) Если нужна обработка пикселей до помещения в картинку нужно использовать неуправляемую память. т.е. unmanagement code  smile 


Автор: mr.DUDA 20.12.2006, 15:53
Цитата(ivashkanet @  20.12.2006,  14:12 Найти цитируемый пост)
2) Если нужна обработка пикселей до помещения в картинку нужно использовать неуправляемую память. т.е. unmanagement code 

Можно залочить картинку в массив и работать с ним.

Автор: juravel 20.12.2006, 17:28
.
Цитата
Можно залочить картинку в массив и работать с ним.

Можно залочить картинку в массив и работать с ним
А как? smile 

Автор: mr.DUDA 20.12.2006, 19:09
Цитата(juravel @  20.12.2006,  16:28 Найти цитируемый пост)
А как?

http://forum.vingrad.ru/index.php?showtopic=95499&view=findpost&p=727772

Автор: ivashkanet 20.12.2006, 19:14
Вот пример из MSDN 
Код

private void LockUnlockBitsExample(PaintEventArgs e)
{

    // Create a new bitmap.
    Bitmap bmp = new Bitmap("c:\\fakePhoto.jpg");

    // Lock the bitmap's bits.  
    Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
    System.Drawing.Imaging.BitmapData bmpData = 
        bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
        bmp.PixelFormat);
          
    // Get the address of the first line.
   IntPtr ptr = bmpData.Scan0;

    // Declare an array to hold the bytes of the bitmap.
    // This code is specific to a bitmap with 24 bits per pixels.
    int bytes = bmp.Width * bmp.Height * 3;
    byte[] rgbValues = new byte[bytes];

    // Copy the RGB values into the array.
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

    // Set every red value to 255.  
    for (int counter = 0; counter < rgbValues.Length; counter+=3)
        rgbValues[counter] = 255;
  
    // Copy the RGB values back to the bitmap
    System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);

    // Unlock the bits.
    bmp.UnlockBits(bmpData);

    // Draw the modified image.
    e.Graphics.DrawImage(bmp, 0, 150);
}

Автор: juravel 21.12.2006, 17:37
Спасибо , mr.DUDA smile 

Автор: mr.DUDA 21.12.2006, 22:27
Пожалуйста.

Автор: Madrid 21.12.2006, 23:23
А как вообще можно померить скорость загрузки, к примеру, той же картинки?

Автор: mr.DUDA 22.12.2006, 09:17
Цитата(Madrid @  21.12.2006,  22:23 Найти цитируемый пост)
А как вообще можно померить скорость загрузки, к примеру, той же картинки?

Одна тема - один вопрос, но по существу: запоминаем время до загрузки, и сразу после загрузки. Вычитаем одно время из другого, получаем TimeSpan. Полное количество прошедших миллисекунд будет в св-ве TotalMilliseconds. Для операций, занимающих малое время (как загрузка небольшого битмапа) время будет настолько малым, что его не замерить таким способом - всегда будет возвращать случайное число = кванту времени потока (от 0 до 15..16 миллисекунд). Поэтому чтобы получить более-менее достоверный результат, нужно повторить операцию N раз и замерить общее время, которое разделить на N - это и будет искомое время выполнения.

З.Ы. или профайлер юзать, как вариант smile

Автор: Madrid 22.12.2006, 17:05
Цитата

З.Ы. или профайлер юзать, как вариант 


извиняюсь за  smile  , но что ты ймеешь в виду?

Автор: ivashkanet 22.12.2006, 17:22
Madrid, http://forum.vingrad.ru/index.php?showtopic=115380&hl=%D0%BF%D1%80%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%D1%80

Добавлено @ 17:24 
и http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%84%D0%B0%D0%B9%D0%BB%D0%B5%D1%80

Автор: mr.DUDA 22.12.2006, 18:22
http://www.jetbrains.com/profiler/ рулит однозначно!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)