Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Вниз

Непокорный 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 вся ветка

Форум: "Media";
Текущий архив: 2004.10.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.05 c
14-1096877390
gn
2004-10-04 12:09
2004.10.24
я болдею с бенигейтси чесное слово


14-1097125698
КаПиБаРа
2004-10-07 09:08
2004.10.24
Опрос - Время.


14-1096643578
Anatoly Podgoretsky
2004-10-01 19:12
2004.10.24
Слухи о защищенности Оперы и Мозиллы оказались сильно преувеличен


6-1092270292
bles
2004-08-12 04:24
2004.10.24
утилита для пингования


3-1095710137
Донской
2004-09-20 23:55
2004.10.24
Прога закрывается сразу после запуска - ADO ???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский