Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.12.2010, 17:13
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию 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  
Старый 22.12.2010, 17:29
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Код в студию, так сложно что либо сказать.
Ответить с цитированием
  #3  
Старый 22.12.2010, 17:38
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
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;
Переменная K показывает FPS. I и O соответственно индексы входа и выхода. A - буфер-очередь. T реализует задержку в 2 кадра (в тестовом режиме, из-за тормозов это примерно 0.3 сек).
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 22.12.2010 в 17:46.
Ответить с цитированием
  #4  
Старый 23.12.2010, 15:15
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Кто что скажет?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 08:12.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter