Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.24;
Скачать: CL | DM;

Вниз

Непокорный FPS, или о том как FPS не хочет меняться...   Найти похожие ветки 

 
NOX   (2004-07-29 12:13) [0]

Здраствуйте. Помогите плз решить такой вопрос: при использовании DirectDraw независимо от количества спрайтов на экране
(от 1 до 1000) количество кадров (FPS) равно 64 и не меняется вообще. Такое ощущение как-будто операционка чем-то
мешает, ведь при одном маленьком спрайтике на экране выдавать 64 кадра, в то время как тот же FarCry местами больше
выдавал, это не правильно. FPS начинают по-тихоньку падать только когда спрайтов больше тысячи (1000~1500) и на отметке
примерно в полторы тысячи  FPS равно примерно 40. Если надо могу показать код, но он довольно таки стандартный и ничего
особенного там нет. Вывожу всё как обычно: сначала очищаю вторичную поверхность (заполняю белым цветом), потом
копирую на неё поверхность с картинкой и переключаю первичную и вторичную поверхности.
Может кто с подобным сталкивался? Подскажите что делать.
Спасибо.


 
Ertong ©   (2004-07-29 12:22) [1]


> сначала очищаю вторичную поверхность (заполняю белым цветом),

Этот кусок кода покажи. Возможно из-за этого


 
NOX   (2004-07-29 12:28) [2]

procedure ScrClean;
var
hRet : HRESULT;
ddbltfx : TDDBLTFX;
begin
ZeroMemory(@ddbltfx, SizeOf(ddbltfx));
ddbltfx.dwSize := SizeOf(ddbltfx);
ddbltfx.dwFillColor := RGB(255, 255, 255);
while True do
begin
 hRet := Back.Blt(nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT, @ddbltfx);
  if hRet = DDERR_SURFACELOST then
   begin
//   if Failed(Restore) then Exit;
   end
   else Break;
end;
end;


 
Ertong ©   (2004-07-29 12:35) [3]

Ну тогда незнаю :)


 
VMcL ©   (2004-07-29 16:55) [4]

>>NOX  (29.07.04 12:13)

Вертикальную синхронизацию отключил?


 
NOX   (2004-07-29 18:58) [5]

А где это можно сделать?


 
NOX   (2004-07-29 19:31) [6]

В настройках драйвера видюхи стоит что вертикальная синхронизация всегда выключена, а где её можно выключить при инициализации DirectDraw не знаю. :0(


 
cyborg ©   (2004-07-29 20:23) [7]

Используй флаг DDFLIP_NOVSYNC при вызове флипинга, будет тебе ПАРАТЫЩ кадров с тремя спрайтами ;).


 
NOX   (2004-07-30 11:41) [8]

Флажок поставил, но ситуация не изменилась! (Частота развёртки у монитора стоит 85Гц) Что делать?
Помогите плиз! Вот код:

procedure TForm1.FormCreate(Sender: TObject);
var hRet : HResult;
   ddsd : TDDSurfaceDesc2;
   ddscaps : TDDSCaps2;
begin
ScrWidth:=800;
ScrHeight:=600;
ScrBitDepth:=32;
MainGraph:=nil;
Primary:=nil;
Back:=nil;

hRet := DirectDrawCreateEx (nil, MainGraph, IDirectDraw7, nil);
if hRet <> DD_OK then Application.Terminate;

hRet := MainGraph.SetCooperativeLevel(Handle, DDSCL_FULLSCREEN or DDSCL_EXCLUSIVE);
if hRet <> DD_OK then Application.Terminate;

hRet := MainGraph.SetDisplayMode (ScrWidth, ScrHeight, ScrBitDepth, 0, 0);
if hRet <> DD_OK then Application.Terminate;

FillChar (ddsd, SizeOf(ddsd), 0);
ddsd.dwSize := SizeOf(ddsd);
ddsd.dwFlags := DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps := DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount := 1;
hRet := MainGraph.CreateSurface(ddsd, Primary, nil);
if hRet <> DD_OK then Application.Terminate;

FillChar(ddscaps, SizeOf(ddscaps), 0);
ddscaps.dwCaps := DDSCAPS_BACKBUFFER;
hRet := Primary.GetAttachedSurface(ddscaps, Back);
if hRet <> DD_OK then Application.Terminate;

ImgSurf:=DDLoadBitmap(MainGraph, "C:\ForImgSurf.bmp", 0 ,0);

timer1.Enabled:=true;
timer2.Enabled:=true;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #27 then
begin
 Timer1.Enabled:=false;
 Timer2.Enabled:=false;  
 Back:=nil;
 Primary:=nil;
 MainGraph:=nil;
 Close;
end;
end;

function Flip : HRESULT;
var
 hRet : HRESULT;
begin
 hRet := DD_OK;
 while TRUE do
  begin
   hRet := Primary.Flip(nil, {0}DDFLIP_NOVSYNC);
   if hRet = DD_OK then Break
    else if hRet = DDERR_SURFACELOST then
          begin
//          hRet := Restore;
           if Failed (hRet) then Break;
          end;
    if hRet <> DDERR_WASSTILLDRAWING then Break;
  end;
 Result := hRet;
end;

procedure ScrClean;
var
hRet : HRESULT;
ddbltfx : TDDBLTFX;
begin
ZeroMemory(@ddbltfx, SizeOf(ddbltfx));
ddbltfx.dwSize := SizeOf(ddbltfx);
ddbltfx.dwFillColor := RGB(0, 255, 0);
while True do
begin
 hRet := Back.Blt(nil, nil, nil, DDBLT_COLORFILL or DDBLT_WAIT, @ddbltfx);
  if hRet = DDERR_SURFACELOST then
   begin
//   if Failed(Restore) then Exit;
   end
   else Break;
end;
end;

procedure Draw;
var DC : HDC;
   str : PAnsiChar;
begin
Back.BltFast(100, 100, ImgSurf, nil, DDBLTFAST_WAIT);
Back.GetDC(DC);
str:=PChar("FPS=" + inttostr(FPS));
TextOut(DC, 400, 50, str, Length(str));
Back.ReleaseDC(DC);
end;  

procedure TForm1.Timer1Timer(Sender: TObject);
begin
inc(Count);
ScrClean;
Draw;
Flip;
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
FPS:=Count;
Count:=0;
end;


 
cyborg ©   (2004-07-30 12:07) [9]

Видимо таймер 85 раз в секунду вызывается, избавляйся от таймера


 
Sapersky   (2004-07-30 15:41) [10]

избавляйся от таймера

Это да. И ещё на некоторых видеокартах нужно к флагам флипинга добавлять DDFLIP_DONOTWAIT.


 
VMcL ©   (2004-07-30 18:18) [11]

>>NOX  (30.07.04 11:41) [8]

"Рисовать" следует не по таймеру (см. [9]), а в обработчике события Application.OnIdle.


 
NOX   (2004-07-30 19:03) [12]

Спасибо большое!!!



Страницы: 1 вся ветка

Текущий архив: 2004.10.24;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.063 c
1-1097470536
BillyJeans
2004-10-11 08:55
2004.10.24
Регулятор громкости на панели задач...


1-1097164516
AlexXn
2004-10-07 19:55
2004.10.24
RecreateWnd


3-1096297927
Павел
2004-09-27 19:12
2004.10.24
D5 + FireBird


3-1096194063
Merfi
2004-09-26 14:21
2004.10.24
Запрос(Query)


3-1095973708
alexda
2004-09-24 01:08
2004.10.24
Чтение и запись из(в) Blob-поля