Показать сообщение отдельно
  #26  
Старый 06.09.2013, 19:03
sas9568635 sas9568635 вне форума
Прохожий
 
Регистрация: 14.07.2012
Сообщения: 21
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
запустил, посмотрел, вроде все работает, но как-то медленновато.
А что значит медленовато?!... Сколько по времени?... Вы по тесту делали который я предлагал? ( в сообщении 24)
Цитата:
Приношу извинения за то что не пояснил что подразумевается под «торможение»...
Привожу тест для его определения.
Надеюсь от подобного теста Вы получите удовольствие. :-)
Запустите SASEmulator1.2Beta
Выберите в Комбобокс игру: «Аэрокобра(1)» либо откройте её имя файла:Аэрокобра1.LVT
При необходимости проверьте (либо установите) FPS=50, Freq/fps=68000
Установите графический режим 768х512 Меню:Tools\Graphic Mode\768x512
На экране заставка Aerocobara. Нажмите пробел.
На экране: «Ваша задача — забрать....»
Подготовьте часы так чтобы было видно секунды (на компе).
При нажатии пробела одновременно запомните время минуты и секунды.
Происходит «синяя» очистка экрана и далее пошла игра.
Пройдите всеми правдами и не правдами :-) Первый уровень до момента окончания (синяя очистка, перед STAGE 02)
снимите показания времени.
При нормальной работе эмулятора без торможения, время прохождения 1-го уровня должно быть в пределах 47-51 секундах. У меня было 48сек(50сек). Чем ближе к 47 — тем лучше. :-)
При торможении время прохождения увеличивается. У меня было 78 сек.
При изменени граф.режима на 512х512 и торможении, время = 58 сек.
При торможении и увеличении граф.режима более чем 512х512, явно заметно изменение скорости игры по сравнению с более маленькими разрешениями (256х256). При нормальной работе — такого явно заметно быть не должно!... и время прохождения 1-го уровня (на любых граф. Режимах) остается в тех же пределах т.*е. (в пределах 47-51 секундах)
Заранее благодарен за внимание к моему эмулятору и за проведенный тест.

Цитата:
Сообщение от M.A.D.M.A.N.
не желаете исходники открыть?
Полностью нет! А саму процедуру вывода на экран?!... Хм.. будет ли смысл...
Код:
Var
    VRAM : array [0..16383] of byte;  // видео память
    VRAMCardinal: array [0..4095] of Cardinal absolute VRAM; //буфер для быстрой прорисовки
    VRAMDirty : array [0..16383] of Byte; //буфер для быстрой прорисовки
    VRAMDirtyCardinal: array [0..4095] of Cardinal absolute VRAMDirty; //буфер для быстрой прорисовки

procedure TMainFormEmu.DrawScreen;
Var sClientWidth:Word;
sClientHeight:Word;car,{позиция по кардиналу} Byte_,{позиция по байту} ByteSM{байт смещения}:word;
smpx1,smpx2,smpx3,smpx4:word;// смещение для пикселов
begin
{$R-}
IF PortC1Dirty<>Ports[$C1] then
begin// ПОЛНАЯ ПЕРЕРИСОВКА
PortC1Dirty:=Ports[$C1]; fChangeVRAM:=false;
Byte_:=0;
While Byte_<16384 do
        begin{***********}
sClientWidth:= (Byte_ mod 64)*4; sClientHeight:=(Byte_ div 64)*1;
smpx1:=sClientWidth;smpx2:=smpx1+1; smpx3:=smpx2+1; smpx4:=smpx3+1;
       gamecanvas.Canvas.Pixels[smpx1,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],1];
       gamecanvas.Canvas.Pixels[smpx2,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],2];
       gamecanvas.Canvas.Pixels[smpx3,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],3];
       gamecanvas.Canvas.Pixels[smpx4,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],4];
Byte_:=Byte_+1;
        end;{***********}
for car := 0 to 4095 do VRAMDirtyCardinal[car]:= VRAMCardinal[car];  // быстрое копирование массивов
fChangeBitmap:=True;
end// ПОЛНАЯ ПЕРЕРИСОВКА
Else Begin // ЧАСТИЧНАЯ ПЕРЕРИСОВКА
car:=0;fChangeVRAM:=false;
while (car<=4095) do begin
  if (VRAMCardinal[car]<>VRAMDirtyCardinal[car]) then Begin//сравниваем значения , а есть ли изменения
ByteSM:=0;
  while (ByteSM<=3) do begin
Byte_:=(car*4)+ByteSM;
Begin{***********}
   if (VRAM[Byte_]<>VRAMDirty[Byte_]) then //сравниваем значения , а есть ли изменения
        begin
sClientWidth:= (Byte_ mod 64)*4; sClientHeight:=(Byte_ div 64)*1;
smpx1:=sClientWidth;smpx2:=smpx1+1; smpx3:=smpx2+1; smpx4:=smpx3+1;
gamecanvas.Canvas.Pixels[smpx1,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],1];
gamecanvas.Canvas.Pixels[smpx2,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],2];
gamecanvas.Canvas.Pixels[smpx3,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],3];
gamecanvas.Canvas.Pixels[smpx4,sClientHeight]:=SuperColor[ports[$C1],VRAM[Byte_],4];
VRAMDirty[Byte_]:= VRAM[Byte_];
fChangeBitmap:=True;
end;{***********}
        end;
     ByteSM:=ByteSM+1;
  end;// while (ByteSM<=3) do begin
VRAMDirtyCardinal[car]:= VRAMCardinal[car];
    end; // if (VRAMCar[ic]<>VRAMDirtyCar[ic])
  car:=car+1;
end;//while (ic<=4096) do begin
     end;// ЧАСТИЧНАЯ ПЕРЕРИСОВКА

if fChangeBitmap then // если были изменения экрана
Begin
MainFormEmu.Canvas.StretchDraw(rect(0,ToolBar1Height,MainFormEmuClientWidth,MainFormEmuClientHeight),gamecanvas);
fChangeBitmap:=False;
end;
{$R+}
end;
Ответить с цитированием