Page 1 sur 2

fréquence de rafraichissement

Publié : jeu. 01/oct./2009 20:19
par beauregard
En changeant de disque dur, j'ai donc tout réinstallé, et mes programmes tournaient trop vite les bougres: la fréquence de rafraichissement du l'écran est fixé d'origine à 75Hertz (nvidia). Et il faut donc l'abaisser à 60Hz.
Il y a-t-il un moyen de connaitre cette fréquence avec notre pb d'amour ?...

...puis de forcer la carte à passer à 60 Hz si ce n'est pas le cas ?

en vous remerciant.

Re: fréquence de rafraichissement

Publié : jeu. 01/oct./2009 22:03
par Backup
voir :

SetFrameRate(ImagesParSeconde)

SetRefreshRate(TauxDeRafraichissement)

Re: fréquence de rafraichissement

Publié : jeu. 01/oct./2009 22:19
par beauregard
Dobro a écrit :voir :

SetFrameRate(ImagesParSeconde)

SetRefreshRate(TauxDeRafraichissement)
Content de te lire, ton départ m'attriste, comme ne plus revoir un prof qu'on a bien aimé, c'est pas glop.

Je pense que les jeux commerciaux force l'écran à 60Hz, me trompe-je ?

Re: fréquence de rafraichissement

Publié : ven. 02/oct./2009 7:34
par flaith
beauregard a écrit :Je pense que les jeux commerciaux force l'écran à 60Hz, me trompe-je ?
Normalement on doit avoir le choix entre 50 ou 60Hz

Re: fréquence de rafraichissement

Publié : sam. 03/oct./2009 13:36
par beauregard
flaith a écrit :
beauregard a écrit :Je pense que les jeux commerciaux force l'écran à 60Hz, me trompe-je ?
Normalement on doit avoir le choix entre 50 ou 60Hz
mmh, ici j'ai le choix entre 60, 65 et 75 Hz.

50 Hz, j'imagine que c'est pour les regrettés écrans cathodiques d'antan ?

Chez moi je n'arrive pas à forcer la carte réglé à 75Hz à passer à 60Hz, voilà une nouvelle épine dans le pied. :?

Re: fréquence de rafraichissement

Publié : sam. 03/oct./2009 16:13
par Le Soldat Inconnu
non, en fait, il faut laisser l'écran à 75Hz mais mettre le taux de rafraichissement à 60 images par seconde ou moins avec SetFrameRate()

Moi, dans mes jeux, je colle un écran de 75Hz (sinon mon cathodique aime pas bien plus bas) et je mets un SetFrameRate(40) donc 40 images par seconde ce qui est largement suffisant (la télé, c'est 25 images par seconde) et ça passe qlque soit l'écran (LCD 60hz par exemple)

Re: fréquence de rafraichissement

Publié : sam. 03/oct./2009 21:31
par beauregard
Le Soldat Inconnu a écrit :non, en fait, il faut laisser l'écran à 75Hz mais mettre le taux de rafraichissement à 60 images par seconde ou moins avec SetFrameRate()

Moi, dans mes jeux, je colle un écran de 75Hz (sinon mon cathodique aime pas bien plus bas) et je mets un SetFrameRate(40) donc 40 images par seconde ce qui est largement suffisant (la télé, c'est 25 images par seconde) et ça passe qlque soit l'écran (LCD 60hz par exemple)
mmh, je me rend compte que je ne sais pas où mettre SetFrameRate()

tu met cette commande juste après OpenWindow ? ou après OpenWindowedScreen ? ou encore dans la boucle principale ?

Re: fréquence de rafraichissement

Publié : sam. 03/oct./2009 22:20
par Le Soldat Inconnu
une seule fois après OpenWindowedScreen :) ou OpenScreen

Re: fréquence de rafraichissement

Publié : sam. 03/oct./2009 23:13
par beauregard
Le Soldat Inconnu a écrit :une seule fois après OpenWindowedScreen :) ou OpenScreen
effectivement, en testant avec le jeu Oldskull 2 Revamped ! de kelebrindae, cette commande fonctionne à merveille.

Seulement, si on met le joyeux directx9 en sous-système, patatra, cette commande n'a plus d'effet ! Voilà pourquoi çà ne marche pas avec mes codes. D'un côté çà me rassure, car le mystère est enfin résolu, "grâce à nos petites cellules grises" comme dirai Hercule poirot, à l'horripilante moustache.

Bon, maintenant, c'est quand même embêtant, car je n'ai pas beaucoup progressé.

C'est normal que cette commande ne fonctionne pas en directx9 en sous-système, ou c'est, comme je le crains, un bug facétieux :?:

Re: fréquence de rafraichissement

Publié : sam. 03/oct./2009 23:33
par Anonyme
Bloque ton FPS à la main , tu limites le nombre d'appel à FlipBuffers() , ( 50hz ) devrais donner quelque chose de fluides sur toute les machines. :wink:

Re: fréquence de rafraichissement

Publié : sam. 03/oct./2009 23:49
par beauregard
Cpl.Bator a écrit :Bloque ton FPS à la main , tu limites le nombre d'appel à FlipBuffers() , ( 50hz ) devrais donner quelque chose de fluides sur toute les machines. :wink:
le problème c'est que soit j'ai du 20 image/s, soit du 63 image/s, mais j'arrive pas à obtenir du 50 i/s

en 75Hz j'ai de vilaines petites saccades, et ceux quel que soit le fps

tu met Flipbuffers en noSynchronization ?


...non, avec noSynchronization, je n'arrive pas à obtenir un truc aussi fluide qu'en WaitSynchronisation, chuis une belle quiche moi. :lol: dommage, parcequ'en noSynchronization, le cpu se tourne les pouce...


dernière découverte:
avec pb4.40beta3, que l'on choisisse:
FlipBuffers(#PB_Screen_WaitSynchronization )
ou
FlipBuffers ( #PB_Screen_SmartSynchronization )

, cela ne fait plus de différence.

voir pour exemple code de Dobro:
http://www.purebasic.fr/french/viewtopi ... 268#p95268

La lutte sera rude.

Re: fréquence de rafraichissement

Publié : dim. 04/oct./2009 9:49
par Anonyme

Code : Tout sélectionner

OpenConsole()

FPS_LIMIT = 50


Repeat
      
      If (ElapsedMilliseconds() > CheckTime + 1000 / FPS_LIMIT)
            CheckTime = ElapsedMilliseconds()


            /*AFFICHAGE ICI*/
                     
            
            Else
                Delay(1)
      EndIf
      
      
            /* ALGORITHME , ROUTINES DIVERSES , ICI */
            /* IA , PATHFINDING , COLLISION , ETC... */
      
      
ForEver 

Re: fréquence de rafraichissement

Publié : dim. 04/oct./2009 11:30
par Le Soldat Inconnu
J'ai regarder dans mes jeux, et je fais comme ça sinon

je ne limite pas le nombre d'images par secondes mais la fréquence à laquelle on fait les calculs pour déplacer et gérer les éléments du jeux

Code : Tout sélectionner

ExamineDesktops()
Ecran_Largeur = DesktopWidth(0)
Ecran_Hauteur = DesktopHeight(0)

; On ouvre l'openscreen
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
  End
EndIf

SetRefreshRate(DesktopFrequency(0))
If OpenScreen(Ecran_Largeur, Ecran_Hauteur, 32, "Ecran") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

; limite de vitesse des éléments à 25 pas par seconde
; Je parle de limite de vitesse et pas de limite de fréquence de l'écran
; Avec un écran à 75Hz, un FPS à 75, et des éléments qui bouge comme si on n'avait que 25 images par secondes
#Jeu_Traitement_Seconde = 25
#Jeu_Avance = 1000 / #Jeu_Traitement_Seconde

; un petit sprite
CreateSprite(0, 64, 64)
StartDrawing(SpriteOutput(0))
	Circle(32, 31, 31, $FFFFFF)
StopDrawing()


Repeat
  ClearScreen($000000)
	
  ; On lit les évènements clavier et souris
  ExamineMouse()
  ExamineKeyboard()
  
  ; Position de la souris
  x = MouseX()
  y = MouseY()
  
  ; Vitesse du jeux
	Jeu_Temps_Actuel = ElapsedMilliseconds()
  If Jeu_Temps_Actuel > Jeu_Temps_Memoire
    Jeu_Temps_Memoire + #Jeu_Avance
    Jeu_Avance = 1
	Else
    Jeu_Avance = 0
	EndIf
	
	;  La position des éléments évolue uniquement quand j'ai Jeu_Avance
	If Jeu_Avance
		Sprite_X + 1
		Sprite_Y + 1
		If Sprite_X >= Ecran_Largeur
			Sprite_X = - SpriteWidth(0)
		EndIf
		If Sprite_Y >= Ecran_Hauteur
			Sprite_Y = - SpriteHeight(0)
		EndIf
	EndIf
	
	; Je dessine à chaque fois
	DisplaySprite(0, Sprite_X, Sprite_Y)
  
	If StartDrawing(ScreenOutput())
			
			DrawingMode(#PB_2DDrawing_Transparent)
			FrontColor($FFFFFF)
			
			; Calcul du FPS
			FPS_Cpt + 1
			If FPS_Cpt >= fps.f
				fps = FPS_Cpt * 1000 / (ElapsedMilliseconds() - FPS_Temps)
				FPS_Cpt = 0
				FPS_Temps = ElapsedMilliseconds()
			EndIf
			
			DrawText(0, 0, "FPS = " + StrF(fps, 1))
		StopDrawing()
	EndIf
	
  FlipBuffers(#PB_Screen_WaitSynchronization)
  
Until KeyboardPushed(#PB_Key_Escape)

Re: fréquence de rafraichissement

Publié : dim. 04/oct./2009 11:51
par beauregard
Le Soldat Inconnu a écrit :J'ai regarder dans mes jeux, et je fais comme ça sinon

je ne limite pas le nombre d'images par secondes mais la fréquence à laquelle on fait les calculs pour déplacer et gérer les éléments du jeux

Code : Tout sélectionner

ExamineDesktops()
Ecran_Largeur = DesktopWidth(0)
Ecran_Hauteur = DesktopHeight(0)



SetRefreshRate(DesktopFrequency(0))
merci pour ces commandes :) ,j'avais complètement occulté la bibliothèque Desktop.

Mes jeux sont toujours trop speed en 75Hz, mais je pense que je m'approche du but.

je trouve dommage de ne pas pouvoir mettre simplement un:

Code : Tout sélectionner

SetRefreshRate(DesktopFrequency(60))
pour forcer le bureau à tourner à 60Hz, hum.



Bien, alors, heu..., je viens de tester ton code, et je te remercie au passage de ton effort :) , mais en 75Hz le disque blanc se déplace plus rapidement qu'en 60Hz, avec cette petite saccade qui me nargue.

Donc, si pour toi, il n' y a pas de variation de vitesse entre 60 et 75Hz, une conclusion s'imposera d'elle même: ma carte vidéo trouvera bien tôt le chemin de la poubelle.

Code : Tout sélectionner

Note: Sous Windows XP, le taux de rafraîchissement peut être bloqué par le système ou par les drivers vidéo. Le résultat de cette fonction n'est donc pas forcément fiable. 
voilà qui n'est pas glop.

Par contre çà marche bien sur mon vieux PC et sa petite carte ati, quel que soit la fréquence le disque se comporte de la même manière. Bon et bien, c'est ma machine de dev qui a un problème à ce niveau là alors...

merci à tous :)

Re: fréquence de rafraichissement

Publié : dim. 04/oct./2009 16:01
par beauregard
Oyé, oyé, joyeux compagnon !

J'ai passé le week end a essayer de faire marcher des commandes qui ne fonctionnent pas avec directx9. Alors oui, parfois on avance pas, on a tous connu çà. Mais çà fait toujours aussi mal de sacrifier un week end pour rien, alors que le vendredi soir je pensais naivement terminer cette broutille en 1 heure, erreur.

Avec un écran à 75Hz, le code suivant fonctionne joyeusement car la fréquence est mis à 60 par la commande suivant:

Code : Tout sélectionner

SetRefreshRate(60) ; forcer à 60Hz
le ptit code( merci au soldat inconnu pour le rappel des bases, j'ai épuré pour bien cerner le problème):

Code : Tout sélectionner

ExamineDesktops()
Ecran_Largeur = DesktopWidth(0)
Ecran_Hauteur = DesktopHeight(0)

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSprite3D() = 0
  MessageRequester("Erreur", "Impossible d'initialiser la souris ,le clavier ou l'écran. Vérifiez la présence de DirectX 7 ou supérieur.", 0)
  End
EndIf

SetRefreshRate(60) ; forcer à 60Hz
If OpenScreen(Ecran_Largeur, Ecran_Hauteur, 32, "Ecran") = 0
  MessageRequester("Erreur", "Impossible d'ouvrir l'écran.", 0)
  End
EndIf

Repeat
  ClearScreen($000000)
  ExamineKeyboard()

  If Val ( FormatDate ( "%ss" , Date ()))=sek
    fps+1
  Else
    FPS$= Str (fps)
    fps=0
  EndIf
  sek= Val ( FormatDate ( "%ss" , Date ()))
  StartDrawing ( ScreenOutput ())
    DrawingMode (1)
      FrontColor ( RGB (255,255,255))
      DrawText (1,1, "FPS: " +FPS$)
  StopDrawing ()
   
  FlipBuffers(#PB_Screen_WaitSynchronization)
 
Until KeyboardPushed(#PB_Key_Escape)
Mais si le subsystem est mis en directx9, alors ce code n'est plus opérationnel. :?

ps: Si les plus anciens peuvent se remémorer les anciennes versions de pb, afin de savoir si çà le problème est récent... d'avance merci.

j'ai lancé une bouteille à la mer:
http://forums.purebasic.com/english/vie ... 70#p301704

et une réponse de Djes sur un autre post mais pour un problème similaire, enfin je crois:http://forums.purebasic.com/english/vie ... 0adbdf1570

D'après les réponses il s'agit bien d'un bug, connu depuis longtemps, attendons sagement sa résolution...