Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстродействие при работе с графикой, Меньше чем в C++Builder 
V
    Опции темы
Artemon
Дата 20.12.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: нет
Всего: 20



Я сделал программу, которая читает 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(....)



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


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Naum
Дата 20.12.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

Репутация: 1
Всего: 15



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


--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
ivashkanet
Дата 20.12.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Цитата(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 


PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 20.12.2006, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



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

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


--------------------
user posted image
PM MAIL WWW   Вверх
juravel
Дата 20.12.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 18.12.2006

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) juravel - 20.12.2006, 17:33
PM MAIL   Вверх
mr.DUDA
Дата 20.12.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



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

http://forum.vingrad.ru/index.php?showtopi...st&p=727772


--------------------
user posted image
PM MAIL WWW   Вверх
ivashkanet
Дата 20.12.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



Вот пример из 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);
}

PM MAIL WWW ICQ   Вверх
juravel
Дата 21.12.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 18.12.2006

Репутация: нет
Всего: нет



Спасибо , mr.DUDA smile 
PM MAIL   Вверх
mr.DUDA
Дата 21.12.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



Пожалуйста.


--------------------
user posted image
PM MAIL WWW   Вверх
Madrid
Дата 21.12.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



А как вообще можно померить скорость загрузки, к примеру, той же картинки?
PM MAIL   Вверх
mr.DUDA
Дата 22.12.2006, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



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

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

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


--------------------
user posted image
PM MAIL WWW   Вверх
Madrid
Дата 22.12.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 27.5.2006

Репутация: нет
Всего: нет



Цитата

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


извиняюсь за  smile  , но что ты ймеешь в виду?
PM MAIL   Вверх
ivashkanet
Дата 22.12.2006, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 11
Всего: 149



PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 22.12.2006, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 24
Всего: 232



jetBrains DotTrace рулит однозначно!


--------------------
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0876 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.