|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
OpenGL или чего ещё
Мне нужно сделать прогу, которая выводит изображение с задержкой. Изображение берётся из одного окна (оконная игра), выводится на другой.
Сделал так: закольцованная очередь на 50 изображений, 2 индекса (вход и выход). Копирую через BitBLT с DC окна игры в буфер на вход, а из выхода с задержкой на свой Canvas. Появились проблемы: 1) BitBLT срабатывает не больше 15 раз в секунду (работает слишком медленно при запущенной игре). 2) Изображение с окна игры почему-то одинаковое в любой момент времени и равно изображению, которое там было при запуске программы. Поэтому пока что копирую с DC экрана с определенных координат, так все ок. 3) Комп начинает зверски тормозить, и игра тоже начинает работать фигово. И наконец вопросы: 1) Как ускорить? Может в OpenGL есть функции для копирования изображения? В статьях в начале раздела нашел только для рисования... 2) Почему изображение всегда одинаковое при копировании с DC окна, но меняетя при копировании экрана? jmp $ ; Happy End! The Cake Is A Lie. |
#2
|
|||
|
|||
Код в студию, так сложно что либо сказать.
|
#3
|
||||
|
||||
Код:
const wi = 700; he = 500; mb = 49; type ABitMap = array [0 .. mb] of TBitMap; var a: ABitMap; i, o: integer; h: hwnd; dc: hdc; t: integer; k: integer; ... procedure TForm1.FormCreate(Sender: TObject); begin h := FindWindow(nil, 'Окно игры'); if h = 0 then begin showmessage('Не найдено окно игры'); halt; end; dc:=GetDC(0); // раньше стояло GetDC(h); for i := 0 to mb do begin a[i] := TBitMap.Create; a[i].Width := wi; a[i].Height := he; end; i := 0; o := 0; t := 0; k := 0; tmPaint.Interval := 50; // тут пробовал разные значения от 50 до 2 мс, ниче не спасает end; procedure Tform1.tmPaintTimer(Sender: TObject); begin tmPaint.Enabled := false; BitBLT(a[i].Canvas.Handle, 0, 0, wi, he, dc, 0, 0, SRCCOPY); inc(i); if i > mb then i := 0; if t < 2 then inc(t) else begin BitBLT(Canvas.Handle, 0, 0, wi, he, a[o].Canvas.Handle, 0, 0, SRCCOPY); inc(o); if o > mb then o := 0; end; inc(k); tmPaint.Enabled := true; end; procedure TForm1.tmFPSTimer(Sender: TObject); begin Edit1.Text := inttostr(k); k := 0; end; jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 22.12.2010 в 17:46. |
#4
|
||||
|
||||
Кто что скажет?
jmp $ ; Happy End! The Cake Is A Lie. |