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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ускорение работы графической отрисовки 
:(
    Опции темы
bernex
  Дата 3.12.2008, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Сейчас приложение работает кодом:

часть 1:
Код

            bm = new Bitmap(800, 600);
            g = Graphics.FromImage(bm);
            hdc = g.GetHdc();

            IntPtr memBM = GDI32.CreateCompatibleBitmap(hdc, bm.Width, bm.Height);
            GDI32.SelectObject(hdc, memBM);
            mExec.SON_PaintHandle = hdc; //других способов задания нет


По таймеру прорисовываю в 2 Image ,наподобие двойной буферизации:

Код

                Bitmap bm2 = new Bitmap(bm.Width, bm.Height, PixelFormat.Format24bppRgb);
                Graphics g2 = Graphics.FromImage(bm2);
                System.IntPtr bmDC = g2.GetHdc();
                GDI32.BitBlt(bmDC, 0, 0, bm.Width, bm.Height, hdc, 0, 0, 0x00CC0020);
                //User32.ReleaseDC(pict.Handle, srcDC);
                g2.ReleaseHdc(bmDC);
                g2.Dispose();
                GC.Collect();
               
                IntPtr HBitmap = bm2.GetHbitmap();
                BitmapSource result = Imaging.CreateBitmapSourceFromHBitmap
                    (HBitmap,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    BitmapSizeOptions.FromEmptyOptions());
                GDI32.DeleteObject(HBitmap);
                bm2.Dispose();

                if (image1.Visibility == Visibility.Hidden)
                {
                    image1.Visibility = Visibility.Visible;
                    image2.Visibility = Visibility.Hidden;
                    image2.Source = result;
                }
                if (image2.Visibility == Visibility.Hidden)
                {
                    image2.Visibility = Visibility.Visible;
                    image1.Visibility = Visibility.Hidden;
                    image1.Source = result;
                }
                //image1.Source = result;
                bm2.Dispose();
                GC.Collect();


Проблема: прорисовка нереально тормозит на компьютере p4 2гигагерц...
Очень большие объемы рисунка получаются при прорисовке, видимо из-за этого...

Подскажите как это все ускорить использую .net 3.5 sp1

WritableBitmap и видеорендерер не помогают, если обновлять их по таймеру....
Можно ли сразу сделать указатель на WritableBitmap в части кода и работать без таймера например, не удается сделать производительную реализацию...

 smile

Добавлено через 1 минуту и 13 секунд
Если сделать разрешение больше 800 600 вообще ужас будет, а нужен запас по производительности....
PM   Вверх
kelus
Дата 3.12.2008, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а зачем два раза делать bm2.Dispose() и GC.Collect() ?

и я бы еще вынес за обработку таймера  некоторые вещи (может это тоже ускорит)... примерно так
Код

Bitmap bm2;
Graphics g2;
IntPtr HBitmap;


в обработке по таймеру осталось бы примерно следующее:
Код

bm2 = new Bitmap(bm.Width, bm.Height, PixelFormat.Format24bppRgb);
g2 = Graphics.FromImage(bm2);
System.IntPtr bmDC = g2.GetHdc();
GDI32.BitBlt(bmDC, 0, 0, bm.Width, bm.Height, hdc, 0, 0, 0x00CC0020);

g2.ReleaseHdc(bmDC);
               
HBitmap = bm2.GetHbitmap();
BitmapSource result = Imaging.CreateBitmapSourceFromHBitmap 
(HBitmap,
IntPtr.Zero,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());

if (image1.Visibility == Visibility.Hidden)
{
 image1.Visibility = Visibility.Visible;
 image2.Visibility = Visibility.Hidden;
 image2.Source = result;
}
if (image2.Visibility == Visibility.Hidden)
{
 image2.Visibility = Visibility.Visible;
 image1.Visibility = Visibility.Hidden;
 image1.Source = result;
}


сам не проверял - сейчас нет времени, но по идее должно работать. разве что я не работал с IntPtr и не уверен, надо ли его удалять вручную.
PM MAIL   Вверх
bernex
Дата 3.12.2008, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вообще ничего абсолютно не дало, проблема в больших объемах данных в прорисовке....
Может можно делать деление азображение пополам и рисовать по отдельности??
Рисование прямо в рисунок без промежжуточного было бы наверно решением

(( пока безрезультатно даже на E8500 3.2гц ТОРМОЗИТ иногда...... ((((
PM   Вверх
kelus
Дата 3.12.2008, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



по поводу двойной буферизации было тут http://forum.vingrad.ru/forum/topic-161242/view-all.html может поможет что
кстати, неплохо бы наставить брейков и посмотреть, в каком конкретно месте больше всего тормозит
PM MAIL   Вверх
bernex
Дата 4.12.2008, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



хм.. а как конкретнее? как спец сказал из-за больших объемов копирования чтения в память.... железо не успевает...

Добавлено через 11 минут и 29 секунд
Там проблема в том что WPF - это DirectX а bitmap это просто память. И данные необходимо копировать из одной области памяти в другу. Для того чтобы это не делать в ручную есть InteropBitmap но я его так и не смог заставить работать. А когда делаеш в ручнуй - тормозов неизбежать. 50-70 млс на копирование.
PM   Вверх
dazy
Дата 19.2.2009, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Может DeepZoom поможет?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




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


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

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