![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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  
			
			
			
			
		 
		
		
	 | 
||||
		
		
  | 
||||
| 
	
	
		
			
			 Кто что скажет? 
		
	
		
		
		
		
			
		
		
		
		
	
		
		
	
	
	 |