![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 05.05.2009
Сообщений: 244
|
![]()
Добрый день!
есть такая проблемка: по таймеру создаю битмап, отображаю его в image, ставлю имтервал например 100, т.е. частота обновления 10 раз в секунду, но отрисовует очень медленно...вот код, который написал: Код:
|
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 05.05.2009
Сообщений: 244
|
![]()
пробовал сделать с использованием потоков, так по идее должно быть быстрее...
но ничего не отображается... Код:
|
![]() |
![]() |
![]() |
#3 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
Свойство Pixels - не для быстрой работы )
Используйте TBitmap.ScanLine поищите на форуме примеры работы с ним, вот например мой http://programmersforum.ru/showpost....&postcount=628 Также негоже по таймеру создавать объект (Вы его кстати не уничтожаете, freeimage - неправильно, надо просто free), проще хранить такой битмап как поле формы, создать и уничтожить один раз. Более того, канвас поддерживает буфферизацию в своей GDI-сути, и не задействовать её - лишняя нагрузка на проц, надо на каждом шаге менять только то, что требуется, остальное не трогать, как именно это сделать - уже работа программиста (хотя у Вас похоже нет возможностей к такой оптимизации, каждый шаг вся картинка меняется, насколько я вник в код) ПС. Потоки не дают ускорения почти ни в чём на такой задаче, тем более если процессор не многоядерный. А вообще от такого кода хочется биться в печали, стиль вообще и идентация в частности - хромают, куча магических цифр - которые просто просятся быть константами, по уму ещё должно быть разделение логики обновления данных (таймера) и прорисовки, сами команды прорисовки должны лежать в onpaint формы если рисовать на канве формы, а в таймере только invalidate вызывать надо. Последний раз редактировалось phomm; 14.08.2013 в 11:50. |
![]() |
![]() |
![]() |
#4 |
Форумчанин
Регистрация: 05.05.2009
Сообщений: 244
|
![]()
да, каждый раз картинка должна полностью меняться...как оптимизировать...не представляю...единственная , по моему, возможность - потоки...но я ,видимо, что то не так сделал...не работает второй код.
|
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 05.05.2009
Сообщений: 244
|
![]()
Ну потоки ,наверно, да...не много выиграть можно...
Цитата:
у Вас в примере довольно быстро обновлялась графика. |
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 05.05.2009
Сообщений: 244
|
![]()
кстати, нашел следующий код:
[CODE]type {Used for pointer math under Win16} PPtrRec = ^TPtrRec; TPtrRec = record Lo: Word; Hi: Word; end; {$ENDIF} {Used for huge pointer math} function GetBigPointer(lp: pointer; Offset: Longint): Pointer; begin {$IFDEF WIN32} GetBigPointer := @PByteArray(lp)^[Offset]; {$ELSE} Offset := Offset + TPtrRec(lp).Lo; GetBigPointer := Ptr(TPtrRec(lp).Hi + TPtrRec(Offset).Hi * SelectorInc, TPtrRec(Offset).Lo); {$ENDIF} end; procedure TForm1.Button1Click(Sender: TObject); var hPixelBuffer : THandle; {Handle to the pixel buffer} lpPixelBuffer : pointer; {pointer to the pixel buffer} lpPalBuffer : PLogPalette; {The palette buffer} lpBitmapInfo : PBitmapInfo; {The bitmap info header} BitmapInfoSize : longint; {Size of the bitmap info header} BitmapSize : longint; {Size of the pixel array} PaletteSize : integer; {Size of the palette buffer} i : longint; {loop variable} j : longint; {loop variable} OldPal : hPalette; {temp palette} hPal : hPalette; {handle to our palette} hBm : hBitmap; {handle to our bitmap} Bm : TBitmap; {temporary TBitmap} Dc : hdc; {used to convert the DOB to a DDB} IsPaletteDevice : bool; cross:HBITMAP; Dcc,M: HWnd; begin Application.ProcessMessages; {If range checking is on - turn it off for now} {we will remember if range checking was on by defining} {a define called CKRANGE if range checking is on.} {We do this to access array members past the arrays} {defined index range without causing a range check} {error at runtime. To satisfy the compiler, we must} {also access the indexes with a variable. ie: if we} {have an array defined as a: array[0..0] of byte,} {and an integer i, we can now access a[3] by setting} {i := 3; and then accessing a[i] without error} {$IFOPT R+} {$DEFINE CKRANGE} {$R-} {$ENDIF} {Lets check to see if this is a palette device - if so, then} {we must do palette handling for a successful operation.} {Get the screen's dc to use since memory dc's are not reliable} dc := GetDc(0); IsPaletteDevice := GetDeviceCaps(dc, RASTERCAPS) and RC_PALETTE = RC_PALETTE; {Give back the screen dc} dc := ReleaseDc(0, dc); {Ðàçìåð èíôîðìàöèè î ðèñóíêå äîëæåí ðàâíÿòüñÿ ðàçìåðó BitmapInfo} {ïëþñ ðàçìåð òàáëèöû öâåòîâ, ìèíóñ îäíà òàáëèöà} {òàê êàê îíà óæå îáúÿâëåíà â TBitmapInfo} BitmapInfoSize := sizeof(TBitmapInfo) + (sizeof(TRGBQUAD) * 255); {The bitmap size must be the width of the bitmap rounded} {up to the nearest 32 bit boundary} BitmapSize := (sizeof(byte) * 256) * 256; {Ðàçìåð ïàëèòðû äîëæåí ðàâíÿòüñÿ ðàçìåðó TLogPalette} {ïëþñ êîëè÷åñòâî ÿ÷ååê öâåòîâîé ïàëèòðû - 1, òàê êàê} {îäíà ïàëèòðà óæå îáúÿâëåíà â TLogPalette} if IsPaletteDevice then PaletteSize := sizeof(TLogPalette) + (sizeof(TPaletteEntry) * 255); {Âûäåëÿåì ïàìÿòü ïîä BitmapInfo, PixelBuffer, è Palette} GetMem(lpBitmapInfo, BitmapInfoSize); hPixelBuffer := GlobalAlloc(GHND, BitmapSize); lpPixelBuffer := GlobalLock(hPixelBuffer); if IsPaletteDevice then GetMem(lpPalBuffer, PaletteSize); {Çàïîëíÿåì íóëÿìè BitmapInfo, PixelBuffer, è Palette} FillChar(lpBitmapInfo^, BitmapInfoSize, #0); FillChar(lpPixelBuffer^, BitmapSize, #0); if IsPaletteDevice then FillChar(lpPalBuffer^,PaletteSize, #0); {Çàïîëíÿåì ñòðóêòóðó BitmapInfo} lpBitmapInfo^.bmiHeader.biSize := sizeof(TBitmapInfoHeader); lpBitmapInfo^.bmiHeader.biWidth := 256; lpBitmapInfo^.bmiHeader.biHeight := 256; lpBitmapInfo^.bmiHeader.biPlanes := 1; lpBitmapInfo^.bmiHeader.biBitCount := 8; lpBitmapInfo^.bmiHeader.biCompressi on := BI_RGB; lpBitmapInfo^.bmiHeader.biSizeImage := BitmapSize; lpBitmapInfo^.bmiHeader.biXPelsPerM eter := 0; lpBitmapInfo^.bmiHeader.biYPelsPerM eter := 0; lpBitmapInfo^.bmiHeader.biClrUsed := 256; lpBitmapInfo^.bmiHeader.biClrImport ant := 256; {Çàïîëíÿåì òàáëèöó öâåòîâ BitmapInfo îòòåíêàìè ñåðîãî: îò ÷¸ðíîãî äî áåëîãî} for i := 0 to 255 do begin lpBitmapInfo^.bmiColors[i].rgbRed := i; lpBitmapInfo^.bmiColors[i].rgbGreen := i; lpBitmapInfo^.bmiColors[i].rgbBlue := i; end; cross := CreateBitmap(256,256,1,8,lpBitmapIn fo); {cross:=LoadImage(GetModuleHandle(n il),'cross4.bmp',IMAGE_BITMAP,0,0,L R_LOADFROMFILE); //a?ocei aeoiai } DC:=GetDC(Form1.Handle);//aa?ai eiioaeno oi?iu M:=CreateCompatibleDC(DC);//nicaaai a?aiaiiue eiioaeno SelectObject(M,cross);//i?eiaiyai e iaio iao aeoiai GetObject(cross,sizeof(lpBitmapInfo ),@lpBitmapInfo^.bmiHeader);//aa?ai aaiiua aeoiaiaf BitBlt(DC,324, 256,256,256,M,0,0,SRCCOPY);//?enoai aeoiai ia eiioaenoa oi?iu(eniieucoy oe?eio e aunioo) DeleteDC(M);//noe?aai a?aiaiiue eiioaeno end; пытаюсь это так отобразить на форме...но ничего.... Последний раз редактировалось hunter03; 14.08.2013 в 13:02. |
![]() |
![]() |
![]() |
#7 |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
Найти и копирнуть код - мало, надо ещё мозги включать и головой подумать
![]() Возьмите на вооружение библиотеку Graphics32 Там возможностей по-больше будет да и по-шустрей с графикой работает, в частности есть 2d и 3d. Не говоря уже про 32хбитный Bitmap и Canvas, ну и пара десятков оптимизаций изображения. Так же посмотрите JclGraphics модуль из Jedi Code Library Последний раз редактировалось Человек_Борща; 14.08.2013 в 13:25. |
![]() |
![]() |
![]() |
#8 |
personality
Старожил
Регистрация: 28.04.2009
Сообщений: 2,899
|
![]()
омг.. я бы назвал это дерьмом винапишного мамонта. (и лично я бы не использовал никогда) Ну, может в обёртке такое допустимо, но явно не так монолитно.
Ну, винапи это конечно не полный отстой, но зачем использовать ритуальную шаманскую магию, когда можно (пусть и с небольшим импактом) задействовать современные синхрофазотроны. Если так ратуете за скорость обработки пихелей на проце, то сразу берите FastDIB библиотечку (гуглим), там пихели гоняются посредством асм-команд на фпу, и задачи уровня видюхи летают на проце. Но я повторюсь, GDI и дельфи-обёртки поверх него чрезвычайно годный инструмент для определённого круга задач, например: http://programmersforum.ru/showpost....&postcount=169 хотя там сканлайн почти не используется (ну, в паре мест), вся производительность и работа с графикой достигаются практически только канвасом и совсем немного gdi-винапишками (типа bitblt stretchblt) Ну, и следите, пожалуйста, за тегом CODE ПС. sizeof(byte) - в юмор. (ну инт или чар ещё меняются, и код может учитывать их, но байт и ворд - не верю что поменяются, ну а если они вдруг поменяются, то окружающий их код уже точно будет бактериями на дереве эволюции технологий программирования). Последний раз редактировалось phomm; 14.08.2013 в 13:35. |
![]() |
![]() |
![]() |
#9 |
Участник клуба
Регистрация: 07.12.2011
Сообщений: 1,025
|
![]()
Не стесняемся, плюсуем!
![]() |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Трансформация битмапа в DirectX | ds.Dante | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 5 | 03.02.2012 14:39 |
Чтение битмапа | Miha85193 | Общие вопросы Delphi | 12 | 23.02.2011 13:20 |
Получить хендл битмапа | tuip | Общие вопросы C/C++ | 1 | 27.01.2011 15:45 |
запись битмапа в файл | SunKnight | Общие вопросы Delphi | 8 | 09.06.2008 08:56 |
Сжатие битмапа | Rapid | Мультимедиа в Delphi | 7 | 08.12.2007 16:38 |