WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  DrawDib

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   DrawDib
Kosha опубликован 23-04-2001 20:12 MSK   Click Here to See the Profile for Kosha   Click Here to Email Kosha  
Вот тут недавно уважаемый OlegN посоветовал для быстрой отрисовки использовать функции DrawDib. Но почему-то у меня они тормозят вообще по страшному!

Такое впечатление (да и скорость такая же), как если получить указатель в видеопамять и побайтово туда чего-то копировать.

p.s. Буффер, из которого рисует DrawDibDraw, я делаю malloc'ом,
а потом заполняю через CBitmap::GetBitmapBits...

есть ощущение, что использование malloc в этом случае - сакс неимоверный, и надо крэйтить буффер в видеопамяти.

Если кто знает, ответьте плз, и если я прав, то как его скрэйтить и пошустрее в него из системной передвинуть ;-)

P.P.S. почему-то функция CBitmap::GetBitmap возвращает BITMAP, у которого мембер bmBits установлен в NULL ;-((
Если кто-то все-таки знает (и сумел дочитать до этого места ;-))) ), как получить указатель на сами биты, которые хранятся в CBitmap'е, помогите plz!

OlegN опубликован 24-04-2001 16:12 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
DrawDib - это функция из библиотеки
VFW (Video for Windows) - это
самая быстра функция обрисовки изображений до
появления DirectX. НО ! Если ты рисуеншь
однобитовый DIB, в 24-битовом видео режиме,
то вполне может тормозить. На твоем месте я все-таки рисовал-бы в 24-х битовый битмап, а потом его выводил либо при помощи BitBlt либо при помощи DrawDib. Я на 80 % уверен, что тормозит именно как раз из-за битовой несовместимости видеорежима и твоего битмапа.
А то что функции векторной обрисовки тормозят
при рисовании в 24-х битовый битмап мне верится с трудом.
Kosha опубликован 25-04-2001 01:31 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Я тоже сначала так подумал. Но потом решил,
что, самый эффективный способ дифференцировать проблему - не использовать НИЧЕГО GDIшного. Вот и сделал - буффер в памяти, и в BITMAPINFOHEADER поставил 24 бита. Но тормоз именно в выводе - т.е. невооруженным глазом видно, как побайтово (ну, точнее, построчно) рисуется картинка. Соответственно, при уменьшении размеров окна, скорость увеличивается. Могу кинуть исходник, если надо... ;-)
OlegN опубликован 25-04-2001 10:51 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
К сожалению, сейчас сильно загружен работой,
поэтому помочь с твоим кодом пока не могу.
Единственное что могу посоветовать, это если
в твоем окне не используется скроллинг,
то попробуй использовать еще такой вариант :
Не используй вообще никакие битмапы,
а рисуй что тебе там нужно прямо в OnDraw
методе. Если будет тормозить, то все-таки
нужно перейти либо на DirectX либо на OpenGL.
Там ничего суперсложного нет.
Функции DirectX или OpenGL можно использовать
также из MFC.
На простом уровне можно освоить за 3-5 дней. Для сравнения, ты долбаешься с GDI уже больше.
Flex Ferrum опубликован 25-04-2001 13:08 MSK     Click Here to See the Profile for Flex Ferrum  Click Here to Email Flex Ferrum     
Можешь поконкретней задачу обрисовать? Я всое время довольно плотно занимался проблемами вывода растровой графики под виндами, так что мож что и присоветую (применительно к конкретной проблеме).
CDima опубликован 25-04-2001 16:05 MSK     Click Here to See the Profile for CDima  Click Here to Email CDima     
DirectX из MSF. Аминь.
У меня по 30-50 кадров в секунду выводит в 1024*768*8.
CDima опубликован 25-04-2001 16:34 MSK     Click Here to See the Profile for CDima  Click Here to Email CDima     
Ссылочку по теме нашел. Кажись внизу самом этой странице то что тебе нужно.
http://www.private.spb.ru/povarov/directx.html
Kosha опубликован 27-04-2001 23:30 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Это немного не то. На сколько я помню (3 года с DirectX работаю, и очень этому не рад ;-))))))) штука хорошая, но геморооооойная!!! ;-)) ) ->Lock работает нормально если CooperativeMode стоит как FullScreen, а у меня окошечко. По крайней мере не видел Exampleов, которые через Lock
фигачат на мастдаевское окно. Везде было
BitBlt с DC, взятого из GetDC ;-((((((((
OlegN опубликован 28-04-2001 00:39 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
Да, все примеры под DirectX + MFC, которые я
видел в конечном итоге работают через BitBlt.
Тут вопрос в другом, а как часто ты рисуешь ?
если с интервалом в 10-20 мс, то получается
100-50 кадров в секунду. А это очень приличный refresh rate. Попробуй рисовать
хотя-бы 10-20 раз в секунду.
Kosha опубликован 29-04-2001 02:04 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
В том-то и дело, что FPS ниже 40 делать нельзя, т.к. прога почти игровая и риалтаймовая. Ну, на худой конец, 35...
OlegN опубликован 03-05-2001 10:56 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
Ну тогда поможет наверное только OpenGL
или опять-же грамотноая векотрная обрисовка
функциями GDI напрямую в окно (с определением
областей обрисовки, без использования функций
заливки типа FillRect, использование XOR режима и т.д.)

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.