![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Мне нужно сделать прогу, которая выводит изображение с задержкой. Изображение берётся из одного окна (оконная игра), выводится на другой.
Сделал так: закольцованная очередь на 50 изображений, 2 индекса (вход и выход). Копирую через BitBLT с DC окна игры в буфер на вход, а из выхода с задержкой на свой Canvas. Появились проблемы: 1) BitBLT срабатывает не больше 15 раз в секунду (работает слишком медленно при запущенной игре). 2) Изображение с окна игры почему-то одинаковое в любой момент времени и равно изображению, которое там было при запуске программы. Поэтому пока что копирую с DC экрана с определенных координат, так все ок. 3) Комп начинает зверски тормозить, и игра тоже начинает работать фигово. И наконец вопросы: 1) Как ускорить? Может в OpenGL есть функции для копирования изображения? В статьях в начале раздела нашел только для рисования... 2) Почему изображение всегда одинаковое при копировании с DC окна, но меняетя при копировании экрана? |
|
#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;Последний раз редактировалось Bargest, 22.12.2010 в 17:46. |
|
#4
|
||||
|
||||
|
Кто что скажет?
|