{{notification.text}}

MirGames

17.01.09 00:43
0
При разработке проекта, столкнулся с огромной для меня проблемой - когда начал на локации расставлять объекты, FPS упало до 3. Хотя объекты 100 треуголок.
В чем может быть проблема?
Вообще не представляю что может быть не так.
Кто может помочь советом как можно оптимизировать проект( ну кроме октановых деревьев )?
Ссылку на свой проект скоро подцеплю.

И вопрос для Dan`a - новый двиг скоро? и как он дружит с FPS?
#1
17.01.09 03:14
0
BarakudaX777 а жо этого фпс какой?мб каждый треугл отдельно рисуешь?)))
#2
Почетный ламер :)
17.01.09 05:02
0
BarakudaX777
ты действительно веришь в тепатические способности или прикалываешься? ну как тут можно ответить? код в студию.
#3
17.01.09 12:35
0
Деревья убрал. Вместо этого попробывал билбордами сделать траву. Тотже результат. ФПС =3.
Вот код самого проекта. Функции и классы у меня сохранены в отдельном юните. Код юнита ниже.
Кстате, возможно это немного тормозит?

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DJXLights, DJXMeshes, DJXTextures, DJXTimer, DJX, DJXClasses,
  DJXUtils, MMsystem, Math, Direct3D9, DJXFonts,DJXLandscape,TypeDef,ZealAudio;

type
  TForm1 = class(TForm)
    DanJetX1: TDanJetX;
    DJXTimer1: TDJXTimer;
    DJXTextureList1: TDJXTextureList;
    DJXMeshList1: TDJXMeshList;
    DJXLightList1: TDJXLightList;
    DJXFontList1: TDJXFontList;
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormKeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure DJXTimer1Timer(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  DJXman: TDJXman;                   //Персонаж нового класса TDJXman
  Flashes: array of TFlash;          //массив огоньков
  Cam: TCam;                         //камера нового класса TCam
  BtnW,BtnS,BtnQ,BtnA: boolean;      //Клавиши W,S,Q,A
  Billboards: boolean;               //определяет, нужно ли выводить огоньки
  WorldLandscape:TLandscape;         //Ландшавт
  Audio:TZAudio;                     //Аудио
  Light:TDJXLight;                   //свет
  showinfo:boolean;
//  Wood:array of TTree;               //лес
  Forest: array of TFlash;          //массив огоньков
const
  anims: array[0..3] of string = ('Stand1','Stand2','Walk','Run');//действия персонажа

implementation
{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
var
i,j,ind: integer;
x,z: single;
begin
  Prepare(DanJetX1,800,600,false,true);     //подготовка компонента
  DanJetX1.Start(Form1.Handle);
  Audio:=TZAudio.Create;
  Audio.Init(Form1.handle,true);
  //Загрузка данных
  Audio.LoadFromFile('SFX\Morning.mp3','morning');
  Audio.LoadFromFile('SFX\Step2.wav','step');
  Audio.Find('step').Volume:=90;
  DJXFontList1.CreateFont('font1','Times New Roman',24);
  DJXMeshList1.LoadFromFile('MESHES\DJXman.djxm');
  DJXTextureList1.CreateTextureFromFile('GFX\snow.jpg','flash');
  DJXTextureList1.CreateTextureFromFile('GFX\grass.png','tree');
  DJXTextureList1.CreateTextureFromFile('GFX\DJXman.jpg','DJXman');
  DJXMeshList1.find('DJXmanStand1').SetTexture(DJXTextureList1.find('DJXman'));
  DJXMeshList1.find('DJXmanStand2').SetTexture(DJXTextureList1.find('DJXman'));
  DJXMeshList1.find('DJXmanWalk').SetTexture(DJXTextureList1.find('DJXman'));
  DJXMeshList1.find('DJXmanRun').SetTexture(DJXTextureList1.find('DJXman'));
  //Освещение
  DJXLightList1.SetDirLight(-2,2,-1,256,256,256,0,0,0,1,1,1).enabled:=true;
  Light:=DJXLightList1.SetDirLight(0,-2,1,256,256,256,0,0,0,1,1,1);
  light.Enabled := true;
  DanJetX1.Lights3D:=true;
  //Камера
  DanJetX1.Camera.SetView(0,15,-15,0,0,0,0,1,0);
  DanJetX1.Camera.SetPerspective(4/3,1,10000);
  Cam.back:=5;
  Cam.up:=1;
  //включаем таймер отрисовки
  DJXTimer1.Enabled:=true;
  //создаём персонажа
  DJXman:=TDJXman.Create(100,100,100);
  //Создаем ландшавт с качеством 1
  WorldLandscape:=TLandscape.Create;
  WorldLandscape.InitLandscape(1,200,200,15,15,30);
  //создаем билборды
    setLength(Flashes,200);
  for i:=0 to high(Flashes) do
  with flashes[i] do
  begin
    x:=random(401)-200;
    z:=random(401)-200;
    y:=random(70)+10;
    col:=DJXColor(random(200)+55,random(200)+55,random(200)+55);
  end;
  //Создаем лес
{  setLength(wood,70);
  for i:=0 to high(wood) do begin
  wood[i]:=TTree.Create('MESHES\tree1.x','GFX\tree1.jpg',0,0,0,'tree1');
  wood[i].x:= random(160)+20;
  wood[i].z:=random(160)+20;
  wood[i].y:=WorldLandscape.Landscape.Altitude[wood[i].x,wood[i].z]-0.6;
  end;      }
  setLength(Forest,20000);
  for i:=0 to high(Forest) do
  with Forest[i] do
  begin
    x:=random(160)+20;
    z:=random(160)+20;
    y:=WorldLandscape.Landscape.Altitude[x,z]+0.2;          
    col:=DJXColor(255,255,255);
  end;
//Выключаем вывод билбордов(по умолчанию)
  Billboards:=true;
  showinfo:=true;
end;

procedure TForm1.DJXTimer1Timer(Sender: TObject);
var
i: integer;
dist: double;
begin
//ЗВУК
  if not Audio.Find('morning').IsPlaying then Audio.Find('morning').Play;
  //НЕбо
   DanJetX1.ClearScreen(128,200,255);
  DanJetX1.BeginRender;
    DanJetX1.Camera.SetView(
    DJXman.x+Cam.back*Sin(DJXman.angle),
    Max(WorldLandscape.Landscape.Altitude[DJXman.x+Cam.back*Sin(DJXman.angle),DJXman.z+Cam.back*Cos(DJXman.angle)]+Cam.up,
      DJXman.y+Cam.up
    ),
    DJXman.z+Cam.back*Cos(DJXman.angle),
    DJXman.x-5*Sin(DJXman.angle),DJXman.y,DJXman.z-5*Cos(DJXman.angle),0,1,0
  );
  DanJetX1.Zbuffer:=false;
  DanJetX1.States.RenderStates.FogEnable:=false;
  DanJetX1.Matrices3D.ClearWorldMatrix;
  DanJetX1.Matrices3D.ScaleWorld(5,5,5);
  DanJetX1.Matrices3D.MoveWorld(
    DanJetX1.Camera.EyePtX,
    DanJetX1.Camera.EyePtY,
    DanJetX1.Camera.EyePtZ
  );
  DanJetX1.Matrices3D.ApplyWorldMatrix;
  DanJetX1.Lights3D:=true;
  DanJetX1.Zbuffer:=true;

  DanJetX1.Matrices3D.ClearWorldMatrix;
  DanJetX1.Matrices3D.ApplyWorldMatrix;
  WorldLandscape.Landscape.Render;
  DJXman.process(DJXTimer1.Lag,WorldLandscape.Landscape.Altitude[DJXMan.x,DJXMan.z]+1);

  //Draw DJXman
  DanJetX1.States.RenderStates.AlphaBlendEnable:=false;
  DanJetX1.Matrices3D.ClearWorldMatrix;
  DanJetX1.Matrices3D.ScaleWorld(0.001,0.001,0.001);
  DanJetX1.Matrices3D.RotateWorldY(DJXman.angle);
  DanJetX1.Matrices3D.MoveWorld(DJXman.x,DJXman.y,DJXman.z);
  DanJetX1.Matrices3D.ApplyWorldMatrix;
  DJXMeshList1.find('DJXman'+anims[DJXman.anim]).Render(DJXman.animPos);
  DanJetX1.States.RenderStates.AlphaBlendEnable:=true;
  //Выводим лес
//  for i:=0 to high(wood) do wood[i].Render;

  //Draw billboards
  if Billboards then
  begin
    DanJetX1.Matrices3D.ClearWorldMatrix;
    DanJetX1.States.RenderStates.ZWriteEnable:=false;
    DanJetX1.BlendMode:=TDJXBlendMode(1);
    DanJetX1.Lights3D:=false;
    for i:=0 to high(flashes) do
    with flashes[i] do
    begin
      dist:=distance_dbl(x,y,z,0,0,0);
      if y<WorldLandscape.Landscape.Altitude[Sin(timeGetTime/50000+x)*dist,Cos(timeGetTime/50000+z)*dist]+1 then y:=WorldLandscape.Landscape.Altitude[Sin(timeGetTime/50000+x)*dist,Cos(timeGetTime/50000+z)*dist]+1;
      DJXTextureList1.find('flash').DrawBillboard(
        Sin(timeGetTime/50000+x)*dist,y,Cos(timeGetTime/50000+z)*dist,
        -1,1,1,1,1,-1,-1,-1,
        DJXColor(200,200,200),DJXColor(200,200,200),DJXColor(200,200,200),DJXColor(200,200,200),timeGetTime/10000,3,3,0
      );
    end;
    DanJetX1.States.RenderStates.ZWriteEnable:=true;
    DanJetX1.Lights3D:=true;
    DanJetX1.BlendMode:=TDJXBlendMode(0);

      DanJetX1.Matrices3D.ClearWorldMatrix;
    DanJetX1.States.RenderStates.ZWriteEnable:=false;
//    DanJetX1.BlendMode:=TDJXBlendMode(32);
    DanJetX1.Lights3D:=false;
    for i:=0 to high(Forest) do
    with Forest[i] do
    begin
      DJXTextureList1.find('tree').DrawBillboard(
        x,y,z,
        -1,1,1,1,1,-1,-1,-1,
        $ffffffff,$ffffffff,$ffffffff,$ffffffff,0,0.2,0.2,0
      );
    end;
    DanJetX1.States.RenderStates.ZWriteEnable:=true;
    DanJetX1.Lights3D:=true;
//    DanJetX1.BlendMode:=TDJXBlendMode(0);
  end;

  if BtnQ then Cam.back:=Cam.back-0.1*DJXTimer1.SpeedFactor;
  if BtnA then Cam.back:=Cam.back+0.1*DJXTimer1.SpeedFactor;
  if BtnW then Cam.up:=Cam.up+0.1*DJXTimer1.SpeedFactor;
  if BtnS then Cam.up:=Cam.up-0.1*DJXTimer1.SpeedFactor;

  if showinfo then begin

  DJXFontList1.find('font1').Print(
    10,10,
    'FPS: '+inttostr(DJXTimer1.FPS)
  );
  DJXFontList1.find('font1').Print(
    10,40,
    'Interval: '+inttostr(DJXTimer1.ProcInterval)
  );
  DJXFontList1.find('font1').Print(
    10,100,
    'Q - move camera forward'
  );
  DJXFontList1.find('font1').Print(
    10,130,
    'A - move camera backward'
  );
  DJXFontList1.find('font1').Print(
    10,160,
    'W - move camera up'
  );
  DJXFontList1.find('font1').Print(
    10,190,
    'S - move camera down'
  );
  DJXFontList1.find('font1').Print(
    10,250,
    'B - toggle billborads'
  );
  end;


  DanJetX1.EndRender;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=vk_escape then close;
  if key=vk_left then DJXman.l:=true;
  if key=vk_right then DJXman.r:=true;
  if key=vk_up then DJXman.u:=true;
  if key=vk_down then DJXman.d:=true;
  if key=vk_shift then DJXman.shift:=true;
  if key=Ord('Q') then BtnQ:=true;
  if key=Ord('A') then BtnA:=true;
  if key=Ord('W') then BtnW:=true;
  if key=Ord('S') then BtnS:=true;
  if key=Ord('B') then Billboards:=not Billboards;  
  if key=Ord('I') then ShowInfo:=not ShowInfo;
end;

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if key=vk_left then DJXman.l:=false;
  if key=vk_right then DJXman.r:=false;
  if key=vk_up then
  begin
    DJXman.u:=false;
    DJXman.anim:=random(2);
    DJXman.animTime:=timeGetTime;
    Audio.Find('step').Stop;
  end;
  if key=vk_down then
  begin
    DJXman.d:=false;
    DJXman.anim:=random(2);
    DJXman.animTime:=timeGetTime;
    Audio.Find('step').Stop;
  end;
  if key=vk_shift then DJXman.shift:=false;
  if key=Ord('Q') then BtnQ:=false;
  if key=Ord('A') then BtnA:=false;
  if key=Ord('W') then BtnW:=false;
  if key=Ord('S') then BtnS:=false;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  DJXMan.Free;
  Audio.Free;
end;

end.



Код Юнита:

Код

unit TypeDef;

interface

Uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DJXLights, DJXMeshes, DJXTextures, DJXTimer, DJX, DJXClasses,
  DJXUtils, MMsystem, Math, Direct3D9, DJXFonts,DJXLandscape,D3DX9;

Type
  TDJXman = class
    x,y,z: double;                   //Положение персонажа по мировым координатам
    angle: single;                   //угол (направление взгляда персонажа)
    l,r,u,d,shift: boolean;          //Определяет повороты персонажа(l и r-повернуть налево или право,u и d-поднять камеру вверх и вниз)
    speed: single;                   //скорость перемещения персонажа
    animPos: double;                 //текущий кадр анимации
    anim: integer;                   //
    animTime: longint;               //
    procedure process(Lag: double;NY:single);  //процедура управления персонажем и камерой
    constructor create(nx,ny,nz:single);              //создаёт персонажа
  end;

    TTree = class
    public
    name:string;
    mesh_path:string;//путь к модельки
    Mesh:TDJXMeshStatic;//моделька
    Tex:TDJXTexture;
    x,y,z:single; //Положение на карте
    constructor Create(H_mesh_path:string;H_tex_path:string;H_X,H_Y,H_Z:single;H_name:string);
    procedure Render;
  end;

  TModel = class
    public
    Caption:string;//адресс
    mesh_path:string;//путь к модельки
    Mesh:TDJXMeshStatic;//моделька дома
    Tex:TDJXTexture;
    x,y,z:single; //Положение на карте
    constructor Create(H_mesh_path:string;H_tex_path:string;H_X,H_Y,H_Z:single;H_Caption:String);
    procedure PrintCaption;
    procedure Render(rotX,rotY,rotZ:single);
  end;


    TMyButton = class
      public
      Texture:TDJXTexture;
      index:integer;
      width,height:integer;
      checked,focused:boolean;
      x,y:integer;
      constructor create(tex:string;T_x,T_y:integer;T_width,T_height:integer);
      procedure Render;
      procedure isPicked;
  end;


  TLandscape=class
    public
    Landscape: TDJXLandscape;
    procedure GenerateMask(tex: TDJXTexture; hmbmp: TBitmap; Min,Max: integer; LowGrad,HighGrad: single);
    procedure InitLandscape(LOD: integer;NSizeX,NSizeZ:single;NTileX,NTileZ:integer;MaxHight:single);
  end;

  //Flying billboards
  TFlash = record
    x,y,z: single;
    col: TDJXColor;
  end;

  //Camera behind the player
  TCam = record
    back, up: single;
  end;

  procedure Prepare(DJX:TDanJetX;SWidth,SHeight:integer;FullScrean:boolean;fog:boolean);
  Procedure SkySphereDraw;


implementation

uses Unit1;

{ TModel }

constructor TModel.Create(H_mesh_path: string;H_tex_path: string; H_X, H_Y,
  H_Z: single;H_Caption:string);
begin
  Mesh_path:=H_mesh_path;
  Mesh:=Form1.DJXMeshList1.CreateMeshFromFile(H_mesh_path,caption);
  Tex:=Form1.DJXTextureList1.CreateTextureFromFile(H_tex_path,caption);
  Mesh.SetTexture(Tex);
  X:=H_X;
  Y:=H_Y;
  Z:=H_Z;
  //Здесь нужно расположить объект на карте по заданным X,Y,Z, но не знаю как!
  Caption:=H_Caption;
end;

procedure TModel.PrintCaption;
Var HitPos, TextPos: TD3DXVector3;
    dist:single;
begin
{  if mesh.IsPicked(dist,HitPos) then  begin
    TextPos := D3DXVector3(0, Mesh.SizeY + Mesh.MinBounds.y + 5, 0);
    D3DXVec3Project(
      TextPos, TextPos,
      Form1.DanJetX1.ViewPort,
      Form1.DanJetX1.Matrices.P,
      Form1.DanJetX1.Matrices.V,
      Form1.DanJetX1.Matrices.W
    );
    FontS.Print(
      Round(TextPos.x) - FontS.GetTextWidth(Caption) div 2,
      Round(TextPos.y) - FontS.GetTextHeight(Caption) div 2,
      Caption,
      $ff8080ff
    );
  end;
}

end;

procedure TModel.Render(rotX,rotY,rotZ:single);
begin
  Form1.DanJetX1.Zbuffer:=true;

  Form1.DanJetX1.Matrices3D.ClearWorldMatrix;
  if ((RotX<>0) or (RotY<>0) or (RotZ<>0)) then begin
    Form1.DanJetX1.Matrices3D.RotateWorld(Rotx,Roty,Rotz);
  if rotx<>0 then rotx:=rotx+1;
  if roty<>0 then roty:=roty+1;
  if rotz<>0 then rotz:=rotz+1;
  end;
  Form1.DanJetX1.Matrices3D.MoveWorld(x,y,z);
  Form1.DanJetX1.Matrices3D.ApplyWorldMatrix;
  Mesh.Render(0);
  Form1.DanJetX1.Zbuffer:=false;
//  PrintCaption;
end;



{ TButton }

constructor TMyButton.create(tex: string; T_x, T_y: integer;T_width,T_height:integer);
begin
  checked:=false;
  focused:=false;
  width:=T_Width;
  Height:=T_Height;
  index:=0;
  x:=T_X;
  y:=T_Y;
  Texture:=Form1.DJXTextureList1.CreateTextureFromFile(tex,'Button1');

end;

procedure TMyButton.isPicked;
begin
  if PtInRect(
  Rect(Round(X),Round(Y),Round(X + Width), Round(Y + Height) ), Form1.DanJetX1.MousePos ) then begin
  focused:=true;
  end else begin
  focused:=false;
  end;
end;

procedure TMyButton.Render;
begin
  Form1.DanJetX1.Zbuffer:=false;
  Form1.DanJetX1.States.RenderStates.FogEnable := false;
  IsPicked;
  if focused and not checked then index:=1 else index:=0;
  if checked then index:=2;
  if focused and checked then index:=3;
  Texture.Draw(x,y,DJXColor(clWhite),index, width,height);
  Form1.DanJetX1.Zbuffer:=true;
  Form1.DanJetX1.States.RenderStates.FogEnable := true;

end;


procedure TLandscape.GenerateMask(tex: TDJXTexture; hmbmp: TBitmap; Min,
  Max: integer; LowGrad, HighGrad: single);
var
  i,j,k: integer;
  cl: byte;
  Hgrad,Lgrad: single;
  Hgradv,Lgradv: integer;
  x,y: integer;
begin
  Hgrad:=HighGrad/2;
  Lgrad:=LowGrad/2;
  Hgradv:=round((Max-Min)*Hgrad);
  Lgradv:=round((Max-Min)*Lgrad);
  tex.TexLock(0);
  for j:=0 to tex.Height-1 do
  for i:=0 to tex.Width-1 do
  begin
    x:=round((hmbmp.Width-1)*(i/(tex.Width)));
    y:=round((hmbmp.Height-1)*(j/(tex.Height)));
    cl:=GetRValue(
      hmbmp.Canvas.Pixels[
        x,
        y
      ]
    );
    if (cl>=Min) and (cl<=Max) then
    begin
      if cl-Min<Lgradv then
      tex.Pixels[i,j]:=DJXColor(
        255,255,255,
        trunc(((cl-Min)/Lgradv)*255)
      )
      else
      if Max-cl<Hgradv then
      tex.Pixels[i,j]:=DJXColor(
        255,255,255,
        trunc(((Max-cl)/Hgradv)*255)
      )
      else
      tex.Pixels[i,j]:=DJXColor(
        255,255,255,255
      );
    end
    else
    tex.Pixels[i,j]:=DJXColor(255,255,255,0);
  end;
  tex.TexUnlock(0);
  tex.GenerateMipMaps;
end;

procedure TLandscape.InitLandscape(LOD: integer;NSizeX,NSizeZ:single;NTileX,NTileZ:integer;MaxHight:single);
var
  i,j: integer;
  hm: TBitmap;
  tex,tex2,tex3,tex4,mask,mask2,mask3,mask4,LightMap:TDJXTexture;
begin

  //Ландшафт
  if Landscape<>nil then FreeAndNil(Landscape);
  Landscape := TDJXLandscape.Create(Form1.DanJetX1);
  Landscape.LOD := LOD;

  Landscape.SizeX := NSizeX;
  Landscape.SizeZ := NSizeZ;

  Landscape.MagDistance := 55;

  Landscape.TileX := NTileX;
  Landscape.TileZ := NTileZ;

  Landscape.Init(25,25);

  //After the landscape is initialized you can set
  //hights and Layers of splatting
  //No other parameters must be changed after initialization!

    //создаём текстурки
  tex:=Form1.DJXTextureList1.CreateTextureFromFile('GFX\GROUND1\ground1.jpeg','tex1',16);
  mask:=Form1.DJXTextureList1.CreateTexture(64,64,'mask1',16);
  tex2:=Form1.DJXTextureList1.CreateTextureFromFile('GFX\GROUND1\ground2.jpeg','tex2',16);
  mask2:=Form1.DJXTextureList1.CreateTexture(64,64,'mask2',16);
  tex3:=Form1.DJXTextureList1.CreateTextureFromFile('GFX\GROUND1\ground3.jpeg','tex3',16);
  mask3:=Form1.DJXTextureList1.CreateTexture(64,64,'mask3',16);
  tex4:=Form1.DJXTextureList1.CreateTextureFromFile('GFX\GROUND1\ground4.jpeg','tex4',16);
  mask4:=Form1.DJXTextureList1.CreateTexture(64,64,'mask4',16);
  lightmap:=Form1.DJXTextureList1.CreateTextureFromFile('GFX\lightmap.bmp','lightmap',16);
  Form1.DanJetX1.MultiTexBlends.CreateBlendFromFile('GFX\lightmap.mtb','lightmap');
  Form1.DanJetX1.MultiTexBlends.CreateBlendFromFile('GFX\default.mtb','default');

  hm := TBitmap.Create;
  hm.LoadFromFile('hm.bmp');
  Landscape.SetHeightsFromBMP(hm,MaxHight);
  GenerateMask(Mask,hm,0,65,0,0);
  GenerateMask(Mask2,hm,60,90,0.5,0.5);
  GenerateMask(Mask3,hm,80,130,0.5,0.5);
  GenerateMask(Mask4,hm,0,255,0.5,0);
  hm.Free;

  Landscape.LayerCount := 4;

  Landscape.Layers[0].Texture := tex4;           //светлый
  Landscape.Layers[0].Mask := mask4;
  Landscape.Layers[0].LightMap := lightmap;
  Landscape.Layers[1].Texture := tex2;           //темный
  Landscape.Layers[1].Mask := mask2;
  Landscape.Layers[1].LightMap := lightmap;
  Landscape.Layers[2].Texture := tex3;           //средняк
  Landscape.Layers[2].Mask := mask3;
  Landscape.Layers[2].LightMap := lightmap;
  Landscape.Layers[3].Texture := tex;            //грязь
  Landscape.Layers[3].Mask := mask;
  Landscape.Layers[3].LightMap := lightmap;

end;


constructor TDJXman.create(nx,ny,nz:single);
begin
  inherited create;
  x:=nx;
  y:=ny;
  z:=nz;
  anim:=1;
  angle:=pi;
  speed:=0.04;
end;
procedure TDJXman.process(Lag: double;NY:single);
var
acc: double;
begin
  acc:=form1.DJXTimer1.SpeedFactor;
  if r then angle:=angle+0.02*acc;
  if l then angle:=angle-0.02*acc;
  if u then
  begin
    if not Audio.Find('step').IsPlaying then Audio.Find('step').Play;
    if shift then
    begin
      x:=x-Sin(angle)*speed*1.8*acc;
      z:=z-Cos(angle)*speed*1.8*acc;
      anim:=3;
    end
    else
    begin
      x:=x-Sin(angle)*speed*acc;
      z:=z-Cos(angle)*speed*acc;
      anim:=2;
    end;
  end;
  if d then
  begin
    if not Audio.Find('step').IsPlaying then Audio.Find('step').Play;
    if shift then
    begin
      x:=x+Sin(angle)*speed*1.8*acc;
      z:=z+Cos(angle)*speed*1.8*acc;
      anim:=3;
    end
    else
    begin
      x:=x+Sin(angle)*speed*acc;
      z:=z+Cos(angle)*speed*acc;
      anim:=2;
    end;
  end;
  y:=NY;
  if d then
  begin
    if shift then
    animPos:=-(timeGetTime-animTime)/(0.4/speed)
    else
    animPos:=-(timeGetTime-animTime)/(0.5/speed)
  end
  else
  if u then
  begin
    if shift then
    animPos:=(timeGetTime-animTime)/(0.4/speed)
    else
    animPos:=(timeGetTime-animTime)/(0.5/speed)
  end
  else
  animPos:=((timeGetTime-animTime)/100);
  //Ограничения
  if x<0 then x:=0;
  if x>WorldLandscape.Landscape.SizeX then x:=WorldLandscape.Landscape.SizeX;
  if z<0 then z:=0;
  if z>WorldLandscape.Landscape.SizeZ then z:=WorldLandscape.Landscape.SizeZ;

end;


Procedure SkySphereDraw;
var
  tex: TDJXTexture;
begin
  Form1.DanJetX1.Zbuffer := false;
  Form1.DanJetX1.States.RenderStates.FogEnable:=true;
    Form1.DanJetX1.CullMode := cullCW;
    Form1.DanJetX1.Lights3D:=false;
  tex := Form1.DJXTextureList1.Find('sky');
  Form1.DanJetX1.Matrices3D.ClearWorldMatrix;
  Form1.DanJetX1.Matrices3D.ScaleWorld(2, 2, 2);
  Form1.DanJetX1.Matrices3D.MoveWorld(Form1.DanJetX1.Camera.EyePtX, Form1.DanJetX1.Camera.EyePtY, Form1.DanJetX1.Camera.EyePtZ);
  Form1.DanJetX1.Matrices3D.ApplyWorldMatrix;
  if tex <> nil then
  Form1.DanJetX1.Primitives3D.SphereTex(
    0,0,0,
    200,15,15,
    DJXColor(100,100,100,255),
    tex
  );
Form1.DanJetX1.CullMode := cullCCW;
  Form1.DanJetX1.Zbuffer := True;
//    Form1.DanJetX1.States.RenderStates.FogEnable:=True;
      Form1.DanJetX1.Lights3D:=true;
end;


procedure Prepare(DJX: TDanJetX; SWidth, SHeight: integer;
  FullScrean: boolean;fog:boolean);
begin
    Form1.Position:=poScreenCenter;
    DJX.States.RenderStates.SpecularEnable := true;
    if FullScrean then begin
      DJX.Width:=Screen.Width;
      DJX.Height:=Screen.Height;
      DJX.DepthStencilWidth := DJX.Width;
      DJX.DepthStencilHeight := DJX.Height;

      Form1.Width:=Screen.Width;
      Form1.Height:=Screen.Height;
      Form1.BorderStyle:=bsnone;
      Form1.WindowState:=wsMaximized;
    end
    else begin
      DJX.Width:=SWidth;
      DJX.Height:=SHeight;
      Form1.Width:=SWidth;
      Form1.Height:=SHeight;
      Form1.BorderStyle:=bsSingle;
      Form1.WindowState:=wsNormal;
    end;
    DJX.Start(form1.Handle);
    DJX.Filtering:=true;
    DJX.MipMaps:=true;
    DJX.Vsync:=true;    
    //Туман
    if fog=false then exit;
    DJX.States.RenderStates.FogEnable := true;
    DJX.States.RenderStates.FogColor := DJXColor(200,220,239);
    DJX.States.RenderStates.FogStart := 100;
    DJX.States.RenderStates.FogEnd := 560;
    DJX.States.RenderStates.FogVertexMode := D3DFOG_LINEAR;
end;

{ TTree }

constructor TTree.Create(H_mesh_path, H_tex_path: string; H_X, H_Y,
  H_Z: single;H_name:string);
begin
  Name:=H_name;
  Mesh_path:=H_mesh_path;
  if not fileexists(H_mesh_path) then
  exit;
  
  if Form1.DJXMeshList1.Find(name)=nil then Form1.DJXMeshList1.CreateMeshFromFile(H_mesh_path,name);
  if Form1.DJXTextureList1.Find(name)=nil then Form1.DJXTextureList1.CreateTextureFromFile(H_tex_path,name);
  Mesh:=TDJXMeshStatic(Form1.DJXMeshList1.Find(name));
  Tex:=Form1.DJXTextureList1.Find(name);
  Mesh.SetTexture(Tex);
  X:=H_X;
  Y:=H_Y;
  Z:=H_Z;
end;

procedure TTree.Render;
var dist:single;
    HitPos:_D3DVector;
begin
  if Mesh=nil then
    exit;
  Form1.DanJetX1.Zbuffer:=true;
  Form1.DanJetX1.Matrices3D.ClearWorldMatrix;
  Form1.DanJetX1.Matrices3D.MoveWorld(x,y,z);
  Form1.DanJetX1.Matrices3D.ApplyWorldMatrix;
  Mesh.Render(0);
end;

end.
#5
Dan
The One
17.01.09 17:49
0
нет даже самой банальной проверки попадения объектов в поле зрения камеры.
ландшафт это делает сам, а все остальные объекты - нет.
#6
17.01.09 20:11
0
BarakudaX777 и всё таки какой фпс?
#7
18.01.09 15:00
0
Цитата(lans @ 17.01.2009 - 19:11) [snapback]91976[/snapback]

BarakudaX777 и всё таки какой фпс?

Кадров в секунду ток 3.

Цитата(Dan @ 17.01.2009 - 16:49) [snapback]91970[/snapback]

нет даже самой банальной проверки попадения объектов в поле зрения камеры.
ландшафт это делает сам, а все остальные объекты - нет.

Пробывал реализовать при помощи фрастума, так у меня то появляются объекты то исчезают. зависит от положения камеры.
Можешь пример реализации привести?
#8
Почетный ламер :)
18.01.09 19:12
0
Цитата
Пробывал реализовать при помощи фрастума, так у меня то появляются объекты то исчезают. зависит от положения камеры

ага было и такое. очисть матрицу мира.. не то перед отрисовкой ланшафта не то после... и еще было, но тут сам был виноват- пивоты не посмотрел наобъектах.... а еще в DJX ,был втроен GrassEngine.... а еще гдубина отрисовки ... ограничь ее (set perspective) фрустум глубиной 10000... это кончно круто, но не оптимально
Отредактировано: 18.01.09 19:27
#9
19.01.09 14:58
0
Цитата(Murzik18 @ 18.01.2009 - 18:12) [snapback]92018[/snapback]

ага было и такое. очисть матрицу мира.. не то перед отрисовкой ланшафта не то после... и еще было, но тут сам был виноват- пивоты не посмотрел наобъектах.... а еще в DJX ,был втроен GrassEngine.... а еще гдубина отрисовки ... ограничь ее (set perspective) фрустум глубиной 10000... это кончно круто, но не оптимально


Спасибо!
НУ пивоты точно верны. Матрицу попробую сбросить. Перспективу тоже ограничу, но думаю это может привести к заметному ухудшению зоны видимости.
Твои проекты я смотрел,у тебя проекты оптимизованные, а у меня чет ваще висяк а не проекты.
ВОт и решил произвести оптимизацию. А еще у меня компу уже 8 лет. Все не поменяю, это тоже играет главную роль в тормозах.
И еще. Как лучше делать лес? Создать масив деревьев или же массив координат, а рендерить одно дерево в разных местах? Что лучше по быстродействию и оптимальности?
#10
19.01.09 15:51
0
Спасибо всем. Немного оптимизовал проект. Щяс хоть не так сильно тормозит. Сейчас у меня 18 FPS. Это хоть уже получше.
Кажется я нашел более весомую ошибку в написании кода.
Я создавал класс, в котором хранил весь мешь, а не указатель на него. Это все забивало память. Думаю щяс исправлять эту туповатую ошибку =)
Да и ваще у меня с моим компом просто ландшавт выдает всего 26 FPS.
#11
Почетный ламер :)
19.01.09 16:43
0
а зачем это- в смысле, зачем хранить мешь да и ссылку на него в классе??? вор должен сидеть в тюрьме а меш в меш-листе. в классе разве что его имя.
#12
19.01.09 19:32
0
Цитата(Murzik18 @ 19.01.2009 - 15:43) [snapback]92049[/snapback]

а зачем это- в смысле, зачем хранить мешь да и ссылку на него в классе??? вор должен сидеть в тюрьме а меш в меш-листе. в классе разве что его имя.

Сейчас я так и переделал. но FPS по прежнему мало.
#13
Dan
The One
19.01.09 19:59
0
выложи сам проект пусть люди потестируют и будешь знать сколько фпс на современных машинах.
#14
19.01.09 22:42
0
Выкладываю повторно ссылку. Но это уже немного оптимизованная версия.

http://www.x2b.ru/get/23752

Просьба потестить и написать у кого какой FPS!
Отредактировано: 19.01.09 22:47
#15
Студент
20.01.09 01:30
0
Примерно около 30, когда смотришь на ландшафт целиком.
Radeon X1650Xt.
#16
20.01.09 12:21
0
50 fps
GTX260 , да жестоко....
#17
аксакал
20.01.09 12:25
0
Цитата
---------------------------
Landsacpe
---------------------------
Access violation at address 03571B02 in module 'vp6dec.ax'. Read of address 00000040.
---------------------------
ОК
---------------------------
Отредактировано: 20.01.09 12:26
#18
20.01.09 14:41
0
~30 когда вблизи, снижается до 10 при общем обзоре.
ЗЫ:GF Fx 5600 128 :)
ЗЗЫ:Билборды на фпс не влияли)
#19
20.01.09 20:58
0
12 - при виде на весь ландшафт сверху
38 - тот же вид тоько без билбордов
#20
21.01.09 01:18
0
Что же так туговато.
А теперь я напишу свои:

Незнаю как вы с вида сверху все запечатлили, но у меня же отсечние перспективы стоит )
Но при первоначальном виде стабильно 24 FPS Самая ниское FPS -12 было.

Radeon 9600 256

Ну а как текстуринг и локация?
На верхней горе деревня будет. Главный перс будет ребенок. Спасибо Дану, пока пользуюсь его челом(некогда моделить). Но вот если все так виснуть будет, далеко не уйдешь =(
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}