Автор
|
Тема: Какая-то бага с BitBlt...
|
Kosha |
опубликован 15-04-2001 03:28 MSK
Народ! Вот тут баг какой-то заметил, так и не разобрался: обрабатываю 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
А рисуешь ты наверное частенько ? Ты не заметил, что глюки появляются на машинах, медленнее твоей ? Большинство стандартных функций 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
...Извини, не дописал Так вот создаешь при создании окна свой 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
В том-то и дело, что глюк очень странный. Стоит поставить CreateCompatibleBitmap не как черно-белый, а как pDC (ну, везде проверял на 24 битах) как глюк исчезает полностью. В то же время предварительное создание и селект CDC и CBitmap'а ничего не дает ;-((( |
OlegN
|
опубликован 18-04-2001 00:40 MSK
Наверное причина как раз в том, что ты рисуешь однобитовый битмап в 24-х битном режиме. Ведь функции BitBlt в этом случае приходится преобразовывать каждый пиксел, а если битмап 24-х битовый то, скорее всего происходит простое копирование области памяти битмапа в DC устройства. Попробуй рисовать в 24-х битный битмап. |
Kosha
|
опубликован 19-04-2001 02:23 MSK
Спасибки за совет, только суть всей мессаги в том, что в 24-битном режиме вообще тормозит все. Т.е. просто из-за большого количества байт и, соотв-но, используемой памяти, все тормозит просто потому что тормозит. Еще попробую сделать через DIBы... ;-) |