Publié : dim. 22/mars/2009 17:35
Ai Modif mon post...
J'aimerais essayer la version smartsynchro si tu pouvais la compiler. Ca me met une erreur (#PB_Screen_SmartSynchronization constant not found) j'ai une vielle version de PureBasic.djes a écrit :Pas fluide du tout chez moi. Le code le plus fluide est avec la smartsynchro : le haut est parfaitement fluide, en dessous, sur une centaine de pixels c'est hachuré (sur un écran CRT). On voit que la synchro est au timer, et que le double-buffer est swappé là!Dobro a écrit :le code ou j'obtiens la meilleur fluidité
c'est celui ci parceque je commence par un setframerate(50)
avant la boucle!!
Pour le refresh rate, il suffit qu'il soit égal à celui de mon écran pour que ça soit bien fluide. Avec le flipbuffers(1) ou d'autres fréquences, ce n'est jamais aussi fluide. Faudrait que j'essaye sur un écran plat.
Je parle de démos codées avec uniquement des entiers avec utilisation des tables de sinus entiers (etc...) pour un rendu hard XDdjes a écrit :Non, mais on peut encore faire des démos, même techniques! Rien n'empêche de dépasser les limites de Windows, en faisant une démo en ring 0Dr. Dri a écrit :Tout ça pour dire qu'on est plus à l'époque des démos techniques d'affichage d'effet plasma qu'on fait tourner sur un bon vieux DOS avec en sortie un VGA de 320x200...(-hum- j'en serais bien incapable)
Tu tombes justement dans un autre piège. Si tu sais quelle zone [x,y,w,h] tu dois redessiner, pourquoi l'écraser avant de la re-redessiner ?Dobro a écrit :@Dri :
oui, meme qu'un Clearscreen(X,Y,Larg,Haut) serai un vrais plus dans le purebasic !!
Code : Tout sélectionner
StartXXX
yyy
StopXXX
Code : Tout sélectionner
If StartXXX
yyy
StopXXX
EndIF
Code : Tout sélectionner
;-code Dobro plein ecran
Structure sprite
x.l
y.l
vitesse.l
EndStructure
nbr_sprite=1000
Dim sprite.sprite(nbr_sprite)
; Test
EcranX = GetSystemMetrics_(#SM_CXSCREEN)
EcranY = GetSystemMetrics_(#SM_CYSCREEN)
InitSprite(): InitKeyboard()
;hwnd=OpenWindow(1,0,0,EcranX,EcranY,"test", #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget )
OpenScreen (EcranX,EcranY,32,"Test")
; *********** prepare les parametres de chaque sprite *****************
For t=0 To nbr_sprite
sprite(t)\x = Random(EcranX)+1
sprite(t)\y= Random(EcranY)+1
sprite(t)\vitesse=Random(4)+1
CreateSprite(t, sprite(t)\vitesse, sprite(t)\vitesse)
; dessine le sprite
StartDrawing(SpriteOutput(t))
Box(0,0, sprite(t)\vitesse, sprite(t)\vitesse,RGB(Random(100)+100,Random(100)+100,Random(100)+100))
StopDrawing()
Next t
; ***************************************************************
;SetFrameRate(50) ; inutile en mode plein écran
Repeat
go= ElapsedMilliseconds()
For t= 0 To nbr_sprite
DisplaySprite(t,sprite(t)\x,sprite(t)\y)
sprite(t)\x=sprite(t)\x+sprite(t)\vitesse
If sprite(t)\x>EcranX
sprite(t)\x=0
EndIf
Next t
temps=ElapsedMilliseconds()-go
StartDrawing(ScreenOutput())
DrawText(10,10,"Temps: "+Str(temps))
StopDrawing()
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape)
End
EndIf
FlipBuffers(#PB_Screen_WaitSynchronization ) ;- plein écran
;FlipBuffers ( #PB_Screen_SmartSynchronization ) ; <- avec lui en plein écran, çà va saccader
ClearScreen(0)
Delay(2)
ForEver
que veux tu dire ??Ollivier a écrit :, mais savez-vous pourquoi dans CE sujet, ça fait trois pages que j'ai dit que le débat était clos?!?
Ollivier
Dr. Dri a écrit :Mon opinion c'est que ClearScreen est pratique d'un point de vue débutant mais qu'au niveau des perfs c'est vraiment trop gourmand. Et un ClearScreen partiel serait selon moi une perte de ressources identique. Surtout que ça consomme d'autant plus que la résolution est élevée. Donc plus les machines sont puissantes, plus le boulet qu'on traîne est lourd!Dri
Code : Tout sélectionner
;PB 4.30 le 10/01/09 (Comtois)
; Génétiquement modifié pour faire du parallaxe
; par Ollivier pour les intimes
; Cherchez la fonction ScrollMaterial() sur les forum
; D'accord !?!?!
; \\_
; >:D
; //¯
Global Full.I = 1 ; 1 = FullScreen, c'est comme la boîte
; auto : ça marche tout seul...
InitEngine3D()
InitSprite()
InitKeyboard()
;Pour enregistrer au format PNG
UsePNGImageEncoder()
ExamineDesktops()
EcrL = DesktopWidth(0)
EcrH = DesktopHeight(0)
EcrP = DesktopDepth(0)
If Full
OpenScreen(EcrL, EcrH, EcrP, "Tutoriel 3D")
Else
OpenWindow(0, 0, 0, EcrL, EcrH, "DX9ParalX", $80000000)
OpenWindowedScreen(WindowID(0), 0, 0, EcrL, EcrH, 0, 0, 0)
EndIf
;Pour charger une texture, mesh, entity , etc, indiquer le chemin où se trouvent ces médias
Add3DArchive("/", #PB_3DArchive_FileSystem)
Global ScrollX.F
Global ScrollY.F
Global AngleTeta.F
Global Coef.F
Enumeration
#VueDessus
#VueArriere
#VueCote
#VueAvant
EndEnumeration
Global Angle.f, Vitesse.f
Define.l Options, ModeCamera, i
ModeCamera = #VueDessus
Macro NEW_X(x, Angle, Distance)
((x) + Cos((Angle) * 0.0174533) * (Distance))
EndMacro
Macro NEW_Z(z, Angle, Distance)
((z) - Sin((Angle) * 0.0174533) * (Distance))
EndMacro
;- Declaration des procédures
Declare.f CurveValue(actuelle.f, Cible.f, P.f)
Declare GestionCamera(Mode.l)
;-Mesh
#Mesh = 0
CreateMesh(#Mesh, 100)
Options = #PB_Mesh_Vertex | #PB_Mesh_Normal | #PB_Mesh_Color | #PB_Mesh_UVCoordinate
SetMeshData(#Mesh, Options , ?Sommets, 24)
SetMeshData(#Mesh, #PB_Mesh_Face, ?Triangles, 12)
;-Textures
#Texture = 0
CreateImage(#Texture, 64, 64)
;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#Texture))
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), $FFFFFF)
DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#Texture), ImageHeight(#Texture), 0)
StopDrawing()
;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP1.PNG"
SaveImage(#Texture, Fichier$, #PB_ImagePlugin_PNG)
;Maintenant on peut charger notre texture
LoadTexture(#Texture, Fichier$)
#TextureSol = 1
CreateImage(#TextureSol, 256, 256)
;Remplissage de la texture en blanc
StartDrawing(ImageOutput(#TextureSol))
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $0)
For I = 0 To 1000
Plot(Random(255), Random(255), RGB(Random(255), Random(255), Random(255) ) )
Next I
;For i = 0 To 127 Step 10
; Line(i, 0, 0, ImageHeight(#TextureSol), $0000FF)
; Line(0, i, ImageWidth(#TextureSol), 0, $0000FF)
;Next i
DrawingMode(#PB_2DDrawing_Outlined) ; Pour tracer le contour
Box(0, 0, ImageWidth(#TextureSol), ImageHeight(#TextureSol), $000088)
StopDrawing()
;Enregistre l'image dans le même répertoire que le code source
Fichier$="TextureDVP2.PNG"
SaveImage(#TextureSol, Fichier$, #PB_ImagePlugin_PNG)
;Maintenant on peut charger notre texture
LoadTexture(#TextureSol, Fichier$)
;-Matière
#Matiere = 0
CreateMaterial(#Matiere, TextureID(#Texture))
#MatiereSol = 1
CreateMaterial(#MatiereSol, TextureID(#TextureSol))
For I = 1 To 3
AddMaterialLayer(#MatiereSol, TextureID(#TextureSol), #PB_Material_Replace)
Next I
;-Entity
#Entity = 0
CreateEntity(#Entity, MeshID(#Mesh), MaterialID(#Matiere))
ScaleEntity(#Entity, 10, 10, 10) ; Agrandi l'entity
EntityLocate(#Entity, 500, 5, 500)
#EntitySol = 1
CreateEntity(#EntitySol, MeshID(#Mesh), MaterialID(#MatiereSol))
ScaleEntity(#EntitySol, 1000, 2, 1000) ; Agrandi l'entity
EntityLocate(#EntitySol, 500, -50, 500)
;-Camera
#Camera = 0
CreateCamera(#Camera, 0, 0, 100, 100)
;-Light
AmbientColor(RGB(55,55,55)) ; Réduit la lumière ambiante pour mieux voir les lumières
#LightRouge = 0 : CreateLight(#LightRouge,RGB(255, 0, 0), 0, 500, 0)
#LightBleue = 1 : CreateLight(#LightBleue,RGB(0, 0, 255), 0, 500, 1000)
#LightVerte = 2 : CreateLight(#LightVerte,RGB(0, 255, 0), 1000, 500, 1000)
;- Sprite pour afficher l'aide
Procedure SpriteText(Text.S)
CreateSprite(64000, 256, 24)
StartDrawing(SpriteOutput(64000) )
DrawText(0, 0, Text, #White, #Black)
StopDrawing()
EndProcedure
;- Petit échauffement pour éviter un claquage...
SpriteText("Voici l'environnement de travail...")
For i = 0 To 1 << 8
ExamineKeyboard()
FrameRate = Engine3DFrameRate(#PB_Engine3D_Current)
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
RenderWorld()
DisplayTransparentSprite(64000, 0, 0)
FlipBuffers()
Next
;FreeSprite(64000)
;- Démarrage
CameraLocate(#Camera, 500, 500, 500)
RotateCamera(#Camera, 270, 270, 0)
Repeat
Delay(1) ; On prévient Windows qu'on est cool
If Full = 0
WindowEvent()
EndIf
If ExamineKeyboard()
If KeyboardPushed(#PB_Key_Left)
ScrollX - 0.002
ElseIf KeyboardPushed(#PB_Key_Right)
ScrollX + 0.002
EndIf
If KeyboardPushed(#PB_Key_Up)
ScrollY + 0.002
ElseIf KeyboardPushed(#PB_Key_Down)
ScrollY - 0.002
EndIf
EndIf
For I = 0 To 3
Coef = 1.0 / (1 + I)
ScrollMaterial(#MatiereSol, ScrollX / Coef, ScrollY / Coef, #PB_Material_Fixed, I)
Next I
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
FreeSprite(64000)
Procedure.f CurveValue(actuelle.f, Cible.f, P.f)
;Calcule une valeur progressive allant de la valeur actuelle à la valeur cible
Define.f Delta
Delta = Cible - actuelle
If P > 1000.0 : P = 1000.0 : EndIf
ProcedureReturn (actuelle + ( Delta * P / 1000.0))
EndProcedure
Procedure GestionCamera(Mode.l)
Define.f Px, Py, Pz, Pv
Static AngleCamera.f
Pv = 25 * (60 / Engine3DFrameRate(#PB_Engine3D_Current) )
Select Mode
Case #VueDessus
AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 40), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 140, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 40), Pv)
Case #VueArriere
AngleCamera = CurveValue(AngleCamera, Angle + 180, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
Case #VueCote
AngleCamera = CurveValue(AngleCamera, Angle + 120, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
Case #VueAvant
AngleCamera = CurveValue(AngleCamera, Angle, Pv)
Px = CurveValue(CameraX(#Camera), NEW_X(EntityX(#Entity), AngleCamera, 80), Pv)
Py = CurveValue(CameraY(#Camera), EntityY(#Entity) + 40, Pv)
Pz = CurveValue(CameraZ(#Camera), NEW_Z(EntityZ(#Entity), AngleCamera, 80), Pv)
EndSelect
CameraLocate(#Camera, Px, Py, Pz)
CameraLookAt(#Camera, EntityX(#Entity), EntityY(#Entity), EntityZ(#Entity))
EndProcedure
;{ Définition du cube
DataSection
Sommets:
;Dessus 0 à 3
Data.f -0.5,0.5,-0.5
Data.f 0,1,0
Data.L 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 0,1,0
Data.L 0
Data.f 0,1
Data.f 0.5,0.5,0.5
Data.f 0,1,0
Data.L 0
Data.f 1,1
Data.f -0.5,0.5,0.5
Data.f 0,1,0
Data.L 0
Data.f 1,0
;Dessous 4 à 7
Data.f -0.5,-0.5,0.5
Data.f 0,-1,0
Data.l 0
Data.f 0,0
Data.f 0.5,-0.5,0.5
Data.f 0,-1,0
Data.L 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 0,-1,0
Data.L 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f 0,-1,0
Data.L 0
Data.f 1,0
;Devant 8 à 11
Data.f -0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,0.5
Data.f 0,0,1
Data.l 0
Data.f 1,0
;Derrière 12 à 15
Data.f 0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,-0.5
Data.f 0,0,-1
Data.l 0
Data.f 1,0
;Cote gauche 16 à 19
Data.f -0.5,0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 0,0
Data.f -0.5,0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 0,1
Data.f -0.5,-0.5,0.5
Data.f -1,0,0
Data.l 0
Data.f 1,1
Data.f -0.5,-0.5,-0.5
Data.f -1,0,0
Data.l 0
Data.f 1,0
;Cote droit 20 à 23
Data.f 0.5,0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 0,0
Data.f 0.5,0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 0,1
Data.f 0.5,-0.5,-0.5
Data.f 1,0,0
Data.l 0
Data.f 1,1
Data.f 0.5,-0.5,0.5
Data.f 1,0,0
Data.l 0
Data.f 1,0
Triangles:
;Face en Haut
Data.w 2,1,0
Data.w 0,3,2
;Face en Bas
Data.w 6,5,4
Data.w 4,7,6
;Face Avant
Data.w 10,9,8
Data.w 8,11,10
;Face Arrière
Data.w 14,13,12
Data.w 12,15,14
;Face Gauche
Data.w 18,17,16
Data.w 16,19,18
;Face Droite
Data.w 22,21,20
Data.w 20,23,22
EndDataSection
;}