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