Un exemple pour illustrer le problème du FPS en 3D fenêtré

Archive.
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Un exemple pour illustrer le problème du FPS en 3D fenêtré

Message par comtois »

En mettant FullScreen = 1
j'ai un FPS de 60 ( la fréquence de mon écran )
En mettant FullScreen = 0
J'ai un FPS de 450 .
J'ai essayé en mettant SetFrameRate(30) , et j'obtiens bien un FPS De 30 avec FullScreen = 1 , et ça n'a aucun effet avec FullScreen = 0 ( j'ai toujours 450).

Code : Tout sélectionner

;Mettre cette valeur à 0 pour passer en mode fenêtré
FullScreen = 1

ScreenWidth = GetSystemMetrics_(#sm_cxscreen) 
ScreenHeight = GetSystemMetrics_(#sm_cyscreen) 
#ScreenDepth = 16


If InitEngine3D() = 0
   MessageRequester( "Erreur" , "Impossible d'initialiser la 3D , vérifiez la présence de engine3D.dll" , 0 )
   End
ElseIf InitSprite() = 0 Or InitKeyboard() = 0 
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
EndIf


If FullScreen   
   If OpenScreen( ScreenWidth , ScreenHeight , #ScreenDepth , "Sokoban3D" ) = 0
      MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
      End
   EndIf
Else
   If OpenWindow(0,0,0,ScreenWidth,ScreenHeight,#PB_Window_BorderLess,"Demo3D") = 0 
      MessageRequester( "Erreur", "Impossible d'ouvrir la fenêtre") 
      End 
   EndIf   
   If OpenWindowedScreen( WindowID(0), 0, 0, ScreenWidth , ScreenHeight , 0, 0, 0 ) = 0 
      MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 ) 
      End 
   EndIf 
EndIf 

;-Declare procedures
Declare.f WrapValue( Angle.f )

Structure Parametres
   AngleX.f
EndStructure

Dim entity.Parametres(5)

;- Variables globales
Global Pas.f

;-Mesh
CreateMesh(0) ; Cube
SetMeshData(0, 0, ?CubePoints       , 16)
SetMeshData(0, 1, ?CubeTriangles    , 12)
SetMeshData(0, 2, ?CubeTextures     , 16)

;- Textures
CreateTexture(2,128,128)
StartDrawing(TextureOutput(2))
  Box(0,0,128,128,RGB(255,255,255))
  Box(2,2,124,124,RGB(0,0,200))
StopDrawing()

CreateTexture(3,128,128)
StartDrawing(TextureOutput(3))
  Box(0,0,128,128,RGB(255,255,255))
  Box(2,2,124,124,RGB(0,200,0))
  For a = 0 To 128 Step 4
   For b = 0 To 128 Step 4
      Circle(a,b,2,RGB(10,150,10))
   Next b
Next a
StopDrawing()

;- Material
For a = 2 To 3
   CreateMaterial(a, TextureID( a ))
Next a

;-Entity
Restore Entitys
For a = 0 To 1
   Read materialID.l : Read Type.l
   Read Longueur.f : Read Hauteur.f : Read Largeur.f
   Read X.f : Read Y.f : Read Z.f
   Read AngleX.f
   CreateEntity(a , MeshID(0) ,MaterialID(materialID))
   ScaleEntity(a , Longueur , Hauteur , Largeur )
   EntityLocate(a,X,Y,Z)
   entity(a)\AngleX = AngleX
   RotateEntity(a,entity(a)\AngleX,0,0)
Next a

;- Camera
CreateCamera(0, 0, 0 , 100 , 100)
CameraLocate(0,0,0,20)
AmbientColor(RGB(255,255,255))

;- Procédures
Procedure.f WrapValue(Angle.f) 
   Angle/360 
   Angle-Int(Angle) 
   If Angle<0 
      ProcedureReturn (Angle+1)*360 
   Else 
      ProcedureReturn Angle*360 
   EndIf 
EndProcedure 

Procedure.f NewXValue( X.f , Angle.f , NbUnite.f )
   ;r utiliser conjointement avec NewZvalue pour calculer une position de <NbUnite> dans la direction <angle>
   Valeur.f = X + Cos( Angle  * 0.0174533) * NbUnite
   ProcedureReturn Valeur
EndProcedure

Procedure.f NewZValue( Z.f , Angle.f , NbUnite.f )
   ;r utiliser conjointement avec NewXvalue pour calculer une position de <NbUnite> dans la direction <angle>
   Valeur.f = Z - Sin( Angle * 0.0174533) * NbUnite
   ProcedureReturn Valeur
EndProcedure

Procedure GestionCamera()
   PosXCamera.f = NewXValue(EntityX(0) , entity(0)\AngleX  + 180 , 65) 
   PosYCamera.f = EntityY(0) + 25 
   PosZCamera.f = NewZValue(EntityZ(0) , entity(0)\AngleX  + 180 , 65)
   CameraLocate(0 , PosXCamera , PosYCamera , PosZCamera)
   CameraLookAt(0 , EntityX(0) , EntityY(0) , EntityZ(0))
EndProcedure

Procedure AffAide()
   StartDrawing(ScreenOutput())
   Locate(10,10)
   DrawText("Nombre d'images par seconde = " + StrF(Engine3DFrameRate(#PB_Engine3D_Current)))
   StopDrawing()
EndProcedure

;- Boucle principale

Repeat
   
   ClearScreen(0, 0, 0)
   
   If ExamineKeyboard()
      
      If KeyboardPushed(#PB_Key_Left)
         entity(0)\AngleX = WrapValue( entity(0)\AngleX + 1 )
         RotateEntity(0,1 , 0, 0 )
      ElseIf KeyboardPushed(#PB_Key_Right)
         entity(0)\AngleX = WrapValue( entity(0)\AngleX - 1 )
         RotateEntity(0, -1 , 0, 0 )
      EndIf
      
      If KeyboardPushed(#PB_Key_Up)
         Pas = 2 
      ElseIf KeyboardPushed(#PB_Key_Down)
         Pas = -2 
      Else
         Pas = 0 
      EndIf
      
   EndIf
   
   ;Bouge le perso   
   MoveEntity( 0 , Cos( entity(0)\AngleX * 0.0174533) * Pas , 0, -Sin( entity(0)\AngleX * 0.0174533) * Pas )
  
   ; Gestion de la caméra
   GestionCamera()
   
   RenderWorld()
   AffAide()
   FlipBuffers()
   
Until KeyboardPushed(#PB_Key_Escape)


;-Datas du Cube

DataSection
Entitys:
; le perso
Data.l 2,1 ; matérial
Data.f 6,6,6 ; Dimension longueur , hauteur , largeur
Data.f 200,7,200,0 ; positions X,Y,Z et angle
; le sol
Data.l 3,0 ; matérial
Data.f 1000,8,1000 ; Dimension longueur , hauteur , largeur
Data.f 500,0,500,0 ; positions X,Y,Z et angle

CubePoints:
Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

Data.f -0.5,-0.5,-0.5
Data.f -0.5,-0.5,0.5
Data.f 0.5,-0.5,0.5
Data.f 0.5,-0.5,-0.5

Data.f -0.5,0.5,-0.5
Data.f -0.5,0.5,0.5
Data.f 0.5,0.5,0.5
Data.f 0.5,0.5,-0.5

CubeTriangles:
Data.w 0,4,7
Data.w 0,7,3
Data.w 1,5,4
Data.w 1,4,0
Data.w 2,6,5
Data.w 2,5,1
Data.w 3,7,6
Data.w 3,6,2
Data.w 9,8,11
Data.w 9,11,10
Data.w 12,13,14
Data.w 12,14,15

CubeTextures:
Data.f 0,1
Data.f 1,1
Data.f 0,1
Data.f 1,1

Data.f 0,0
Data.f 1,0
Data.f 0,0
Data.f 1,0

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1

Data.f 0,0
Data.f 1,0
Data.f 1,1
Data.f 0,1

EndDataSection
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

En ajoutant un delay(1) juste après flipbuffer() , j'ai un FPS de 64 à la place de 450 en mode fenêtre , c'est déjà mieux comme ça :)

mais ça ne déconne que chez moi ou quoi ?je n'ai pas vu d'autres posts à ce sujet sur le forum anglais . Alors du coup j'ai vérifié la config de ma carte graphique , et elle a bien le paramètre "attendre la synchro verticale" activé.

Code : Tout sélectionner

   FlipBuffers() 
   Delay(1)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ça fait PAREIL POUR MOI !!

avec une FX57000 ultra !
:)
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Message par cederavic »

j'ai en moyene 80 moi avec ma radeon 9600 mais par moment j'ateint les 300 voir plus (quand je suis sur le bord de la "plateforme")
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

ok merci pour vos réponses, alors j'arrête de dérégler les paramètres de ma carte graphique, elle n'est pas en cause :)
Répondre