Bug ou pas Bug ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Bug ou pas Bug ?

Message par pat »

Bonjour à tous,

En voulant mettre au point mes programmes de jeux, j'ai constaté certaines choses.
Faites ceci :
Exécuter un programme écrit en PB x86 qui possède un graphisme en plein écran (avec OpenScreen(...)) et qui gère le multitâche (avec IsScreenActive()). Ce programme ouvert, faites Alt + Tab (pour le multitâche).
Vous retournez sur le Bureau et votre programme est dans une fenêtre minimisé. Pour le moment, pas de problème.
Faites la même chose avec un programme identique (écrit en PB, etc.). Pareil, faites Alt + Tab en choisissant le Bureau. Vous êtes sur le Bureau et vous avez maintenant vos 2 programmes dans une fenêtre minimisé. Pas de problème également.
Maintenant, basculez, par exemple, du premier programme au second programme, et vice-versa, en faisant Alt + Tab. Vous verrez un de vos programmes se planter.
Je pense qu'il s'agit d'un bug PureBasic. Peut-être un problème de pile.
J'ai vérifié sur les versions finalisées 4.41, 4.51 et 4.60 : constat identique, plantage.
Faites l'essai. Qu'en pensez-vous ?
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Bug ou pas Bug ?

Message par G-Rom »

pas bug.
de mémoire, quand tu fait alt-tab pour aller dans d'autre application plein écran , ton contexte peut s’altérer , d'ou le plantage.
tu dois libérer les ressources au moment de la bascule , et les recharger ensuite.

@+
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Bug ou pas Bug ?

Message par Ar-S »

Exactement ce qu'on peut constater dans certains gros jeux. Le retour au jeu prend bien plus de temps que si c'était un simple "retour d'écran".
(Bien long dans starwars the old republique par exemple)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

Merci pour vos réponses.
Et effectivement ce n'est pas un bug PureBasic.
Il faut bien veiller à tout libérer.
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Bug ou pas Bug ?

Message par dayvid »

Sujet intéressent :)

Je comprends maintenant pourquoi quand on revient dans un jeu ça prend pas mal de temps :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

A y regarder de plus près, j'ai trouvé un programme sur le forum anglais. Le voici :

InitSprite()
InitMouse()
InitKeyboard()

OpenScreen(1024, 768, 32, "fllscrn")

CreateSprite(0, 64, 64)
StartDrawing(SpriteOutput(0))
Line( 0, 0, 48, 32,$0FF0FF)
Line( 0, 0, 64, 64,$0FF0FF)
Line( 0, 0, 32, 48,$0FF0FF)
StopDrawing()

Repeat

ExamineMouse()
ExamineKeyboard()

ClearScreen(0)
DisplayTransparentSprite(0, MouseX(), MouseY())
FlipBuffers()

If IsScreenActive() = 0

ReleaseMouse(1)

Repeat

While PeekMessage_(msg.MSG, 0, 0, 0, #PM_REMOVE)
TranslateMessage_(msg)
DispatchMessage_(msg)
Wend
Delay(100)

Until IsScreenActive() <> 0

CloseScreen()
Delay(1000)
OpenScreen(1024, 768, 32, "fllscrn")
ReleaseMouse(0)

CreateSprite(0, 64,64)
StartDrawing(SpriteOutput(0))
Line( 0, 0, 48, 32, $0FF0FF)
Line( 0, 0, 64, 64, $0FF0FF)
Line( 0, 0, 32, 48, $0FF0FF)
StopDrawing()

EndIf

Until KeyboardPushed(#PB_Key_Escape)


Ce programme pour moi est impeccable et ne pose pas de problème.
Faites pourtant ceci :
Créer un exécutable de ce programme et créer un autre exécutable (en changeant le nom des fenêtres).
Exécuter votre premier programme et faites Alt+Tab. Pas de problème, vous retournez sur le bureau avec la fenêtre du programme minimisé.
Faites la même chose avec le deuxième programme (le premier programme doit rester tel quel, c'est-à-dire dans une fenêtre minisé).
Vous avez donc 2 fenêtres minimisé. Basculez avec Alt+Tab du premier programme au second et vice-versa, et vous aurez un bug parce que le premier programme se plantera et des fois se fermera automatiquement.
Il ne vous reste plus qu'à constater ce que je vous ai dit mais n'hésitez pas à faire le test puisque vous avez le programme en question (et ceci en PB 4.41, 4.51 et 4.60).
Alors bug PB ou bug dans le programme ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Bug ou pas Bug ?

Message par Backup »

pour le code , utilise les balises !!!

lorsque tu edite / ou ecris un message , tu as un bouton [ code] , qui sert a mettre les balises ...

ps : tu peux Reediter et corriger ce probleme .. ;)


de plus ....
inutile de multilier les Sujets

tu as deja commencé un sujet ici :
http://www.purebasic.fr/french/viewtopi ... 1&start=15

pourquoi ne pas avoir continué ...

nous t'avons deja apporté une solution , pourquoi ne l'utilise tu pas ?


tu prends ce code :

Code : Tout sélectionner


; Purebasic 4.41
;By Dobro
; exemple de l'utilisation de IsScreenActive()

; quittez le pseudo jeux avec Alt+TAB
; on retourne dans le jeux d'un clique sur la fenetre en barre des taches


Declare  SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser) ; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...


initsprite ()
initmouse ()
initkeyboard ()
Enumeration
	#sprite
EndEnumeration
Structure sprite
	x.i
	y.i
	pas_x.i
	pas_y.i
EndStructure
Dim sprite.sprite(1)
examinedesktops ()
x_screen= desktopwidth (0) ; je recup la rez de l'ecran ;)
y_screen= desktopheight (0)
flag=0




; FlipBuffers(0)

openscreen (x_screen, y_screen, 32, "Fullscreen + ALT-TAB démo" )

releasemouse (0)
createsprite ( #sprite , 64, 64)
startdrawing ( spriteoutput ( #sprite ))
	box (0,0,64,64, rgb (255,13,40))
stopdrawing ()

debut: ; le label qui permet le retour dans le jeux !!
;********* initialisation du sprite **********
If flag=0 ; le joueur n'est jamais sorti du jeu , s'il est sorti on ne fais pas ce bloc de code !!
	sprite(1)\x=x_screen/2 ; on place le sprite au centre
	sprite(1)\y=y_screen/2 ; on place le sprite au centre
	sprite(1)\pas_x=2 ; on donne une vitesse de deplacement a notre sprite
	sprite(1)\pas_y=2 ; on donne une vitesse de deplacement a notre sprite
	Else
	;-nouveau
	ShowWindow_(ScreenID(),#SW_SHOW) ; reaffiche l'ecran ;o)
EndIf





Repeat
	examinekeyboard () ; ne sert que pour quitter le prg avec la touche esc
	
	; ************* gere le deplacement du sprite ***************
	sprite(1)\x=sprite(1)\x+sprite(1)\pas_x
	sprite(1)\y=sprite(1)\y+sprite(1)\pas_y
	; ----------------------------------------------------------------------------
	If sprite(1)\x+64>=x_screen:sprite(1)\pas_x=-sprite(1)\pas_x: EndIf
	If sprite(1)\y+64>=y_screen:sprite(1)\pas_y=-sprite(1)\pas_y: EndIf
	; ----------------------------------------------------------------------------
	If sprite(1)\x<=0:sprite(1)\pas_x=-sprite(1)\pas_x: EndIf
	If sprite(1)\y<=0:sprite(1)\pas_y=-sprite(1)\pas_y: EndIf
	; *******************************************************
	
	
	; ********** affichage du sprite *********************
	displaytransparentsprite ( #sprite , sprite(1)\x, sprite(1)\y)
	
	flipbuffers ()
	clearscreen (0)
	
	; *************** attention toute l'astuce est la !! *******************
	x_screen2= desktopwidth (0) ; je recup la rez de l'ecran  .. encore;)
	y_screen2= desktopheight (0)
	If isscreenactive () = 0  or (x_screen2<>x_screen and y_screen2<>y_screen) ; le joueur a quitter le jeu (Alt-tab)  ou on a changé la resolution !!!
		releasemouse (1) ; je libere la souris ... inutile ici mais bon
		flag=1 ; on note que l'utilisateur est sorti du jeux
		;-nouveau
		ShowWindow_(ScreenID(),#SW_HIDE) ; reduit l'ecran le temps du redessin  ( avant je fermais )
		
		
		; ******* la ruse de guerre !! ****************************
		openwindow (1,1,1,1,1, "toto le jeu " , #PB_Window_Minimize ) ; j'ouvre une fenetre que je minimise en bar des taches
		Repeat :Event= waitwindowevent (2): Until Event= #PB_Event_ActivateWindow ; j'attend qu'on clique sur la fenetre
			closewindow (1) ; je ferme la fenetre
			; je remet la resolution du jeux :
			;-nouveau
			SetResolution(x_screen,y_screen,32,60,1)  ; on remet notre resolution
			Goto debut ; je retourne dans le jeux sans réinitialiser les variables de déplacement (on reprends ou on en etait! !!! )
		EndIf
	Until keyboardpushed ( #PB_Key_Escape ) ; là , on veux vraiment quitter le jeux LOL
	End
	
	
	
	Procedure SetResolution(RezX, RezY, NbCoul, Frequence, Memoriser)  ; Force la resolution
		; si SetResolution=2 la résolution est identique à l'actuelle, si 1 erreur lors de la recherche des infos, sinon regarder #DISP_CHANG_...
		
		dm.DEVMODE
		If EnumDisplaySettings_ (0, -1, @dm)
			If RezX = dm\dmPelsWidth And RezY = dm\dmPelsHeight And NbCoul = dm\dmBitsPerPel And Frequence=dm\dmDisplayFrequency : ProcedureReturn 2 : EndIf
			dmEcran.DEVMODE
			dmEcran\dmSize = SizeOf (dmEcran)
			dmEcran\dmFields = #DM_PELSWIDTH|#DM_PELSHEIGHT|#DM_BITSPERPEL|#DM_DISPLAYFREQUENCY
			dmEcran\dmPelsWidth = RezX
			dmEcran\dmPelsHeight = RezY
			dmEcran\dmBitsPerPel = NbCoul
			dmEcran\dmDisplayFrequency = Frequence
			If Memoriser=1 : Memoriser= #CDS_UPDATEREGISTRY Or #CDS_NORESET : Else : Memoriser= #CDS_FULLSCREEN : EndIf
			dmx = ChangeDisplaySettings_ (@dmEcran,Memoriser)
			ProcedureReturn dmx
			Else
			ProcedureReturn 1
		EndIf
	EndProcedure
	;
	
	
	
	
	
	
	; EPB

tu le compile en Test_swap1.exe et en Test_swap2.exe

tu les lances tout les 2

tu pourra faire tout les tests que tu veux , ça marchera !!

(Alt+Tab ) de l'un a l'autre ,...... Alt+Tab puis clique sur le bouton barre des taches ....

on quitte les pseudo jeux avec ESCape

SANS AUCUN PROBLEME !!!

on passe a autre chose ?
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

A Dobro.

Effectivement, avec ta méthode, utiliser une fenêtre que tu minimises et tu attends que la fenêtre soit activé, ça marche.
Mais je voudrais savoir pourquoi le programme que j'ai trouvé sur le forum anglais (plus haut) avec l'Api de Windows (avec Peek_message(), translate_message() et dispatch_message()) ne fonctionne pas ?
Il doit y avoir une explication.
Et ceci est autre chose que mon autre sujet.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

Bonjour à tous.

Je suis étonné que personne ne puisse me fournir de solution.
Mais peut être avez-vous fait le test de mon programme ci-dessus.
Si c'est le cas, merci de me dire si vous avez le même résultat que moi, c'est-à-dire s'il y a plantage.
Je tiens à préciser que je suis sous Vista SP2 x86.
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: Bug ou pas Bug ?

Message par zaphod »

...
Dernière modification par zaphod le dim. 27/mai/2012 7:15, modifié 1 fois.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

Un super merci zaphod pour ton code.
Comme je ne suis pas chez moi je prends note de ton code mais je ne peux pas l'essayer maintenant.
Je le ferais ce week-end mais je te fais confiance, cela devrait bien fonctionner.
Grâce à ta super aide tu vas pouvoir vraiment m'aider et aussi ceux qui, comme moi, font des jeux en plein écran.
Tu m'as également confirmé que le code que j'ai fourni n'était pas suffisant car il plantait bien.
Il faut savoir que j'ai pris ce code du forum anglais et qu'il se répandait bien mais personne, apparemment, n'avait vu ce bug.
MERCI.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

A zaphod :

J'ai réussi à rentrer le code qu'il faut sur mon ordi aujourd'hui.
Effectivement j'ai bien les 2 fenêtres minimisés et on peut aller d'une fenêtre à l'autre.
J'ai voulu aller plus loin et j'ai donc quitté, pour voir, l'une des fenêtres en faisant Esc (la touche d'échappement qui permet de quitter le programme). Eh bien j'ai constaté que l'autre fenêtre se plantait.
C'est une amélioration mais il manque encore quelque chose pour que tout soit parfait.
Merci quand même. Je pense de plus en plus qu'il y a un bug PB.
A voir...
Merci à ceux, à l'instar de zaphod, qui pourront me renseigner... et m'aider...
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: Bug ou pas Bug ?

Message par zaphod »

...
Dernière modification par zaphod le dim. 27/mai/2012 7:16, modifié 1 fois.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

Merci Zaphod pour cette amélioration.
Je vais voir ça de plus près.
Intéressant ce code, je vais m'y pencher sérieusement.
Merci à toi.
pat
Messages : 411
Inscription : mar. 24/nov./2009 15:13

Re: Bug ou pas Bug ?

Message par pat »

Je viens de rentrer les codes dans mon micro.
CA MARCHE !!!
C'est super. Voilà des mois que je cherchais à résoudre mon problème.
Un grand merci à toi.
En fait le GetActiveWindows(num fenêtre) est très important et change la donne, ainsi que dans la boucle Repeat Until le WaitWindowsEvent() qui attend un événement avant de continuer.
Ton aide sera aussi précieuse à moi qu'à tous ceux qui entreprennent des jeux plein écran.
Répondre