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++
  Какая-то бага с BitBlt...

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

Автор Тема:   Какая-то бага с BitBlt...
Kosha опубликован 15-04-2001 03:28 MSK   Click Here to See the Profile for Kosha   Click Here to Email Kosha  
Народ! Вот тут баг какой-то заметил, так и не разобрался:
обрабатываю OnDraw (как положено, со всеми WM_ERASEBKG, и т.д.)
но:
сначала делаю pDCnew.CreateCompatibleDC
(pDC), где pDCnew -*CDC, а pDC - *CDC, переданный в OnDraw.
Потом CreateCompatibleBitmap(pDCnew,sizex,sizey,...) - получается монохромный битмап, его SelectObject в pDCnew
,потом чегой-то рисую на нем, потом BitBlt на pDC.
ТАК ВОТ:
есть 4 разновидности глюка:

1) на моей машине (PIII-433/RivaTNT2/1024x768x75HZx24bit/Win98)- глюка нет.
2) на другой машине (p166/STD/разрешение любое/WinNT) - глюк такой: просто мерцание, как будто забываю про EraseBackground, но если ставить битмап не монохромный (ну, CreateCompatibleDC(не pDCnew, а pDC), то глюк исчезает. А если не монохромный, то ТОРМОЗИТТТ (жутко просто. FPS~15 ;-((( )

3) на третьей машине (p233/какая-то видюха/любое разрешение/98) - мерцает только (!) курсор мышки ;-))

4) на 4-й машине (известно только, что там win2000) он вообще не работает.

P.S. если убрать BitBlt, глюки исчезают.
т.е. глюк именно в BitBlt.

Кто знает/догадывается, подскажите plz, а то жутко неохота под DirectX писать...

OlegN опубликован 17-04-2001 16:20 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
А рисуешь ты наверное частенько ?
Ты не заметил, что глюки появляются на машинах, медленнее твоей ?
Большинство стандартных функций GDI очень
медленные. И если при прорисовке небольшой сложности и небольших участков с этим можно
смириться, то для больших(сложных) рисунков
о стандартных функциях прийдется забыть.
Первое что приходит в голову в твоем случае,
это выбросить из OnDraw-а функции
CreateCompatibleDC и CreateCompatibleBitmap и переместить их в OnCreate
Например :
int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;

m_pTempDC = new CDC;
m_pTempBmp = new CBitmap;

CDC * pDC = GetDC();
m_pTempDC->CreateCompatibleDC(pDC);
ReleaseDC(pDC);

CBitmap* pOldBmp = m_pTempDC->SelectObject( m_pTempBmp);

OlegN опубликован 17-04-2001 16:45 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
...Извини, не дописал
Так вот создаешь при создании окна свой
DC и Bitmap,
рисуешь в него что хочешь и когда хочешь,
(желательно не внутри OnDraw функциии)
убиваешь TempDC и TempBitmap при уничтожении окна.
а саму OnDraw функцию реализуешь примерно так :
ASSERT_VALID(m_pTempDC);

CRect rect;
GetClientRect(&rect);

dc.BitBlt(0,0,rect.Width(),rect.Height(),
m_pTempDC,
0,
0,
SRCCOPY);
Конечно нужно также пересоздавать
Bitmap при изменниии размера окна,
но ведь этот код будет вызываться реже,
чем OnDraw.
Если тебя эта схема не устраивает, то кроме
DirectX есть еще функции быстрой отрисовки,
которые начинаются на DrawDib но они
рисуют только DIB-ы, а формировать тебе их
прийдется самому.

Kosha опубликован 18-04-2001 00:10 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
В том-то и дело, что глюк очень странный.
Стоит поставить CreateCompatibleBitmap не как черно-белый, а как pDC (ну, везде проверял на 24 битах) как глюк исчезает полностью.
В то же время предварительное создание и селект CDC и CBitmap'а ничего не дает ;-(((
OlegN опубликован 18-04-2001 00:40 MSK     Click Here to See the Profile for OlegN  Click Here to Email OlegN     
Наверное причина как раз в том, что
ты рисуешь однобитовый битмап в 24-х
битном режиме. Ведь функции BitBlt в этом
случае приходится преобразовывать каждый
пиксел, а если битмап 24-х битовый то,
скорее всего происходит простое копирование
области памяти битмапа в DC устройства. Попробуй рисовать в 24-х битный битмап.
Kosha опубликован 19-04-2001 02:23 MSK     Click Here to See the Profile for Kosha  Click Here to Email Kosha     
Спасибки за совет, только суть всей мессаги в том, что в 24-битном режиме вообще тормозит все. Т.е. просто из-за большого количества байт и, соотв-но, используемой памяти, все тормозит просто потому что тормозит. Еще попробую сделать через DIBы... ;-)

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


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.