Bug ou pas Bug ?
Bug ou pas Bug ?
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 ?
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 ?
Re: Bug ou pas Bug ?
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.
@+
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.
@+
Re: Bug ou pas Bug ?
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)
(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
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳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
Re: Bug ou pas Bug ?
Merci pour vos réponses.
Et effectivement ce n'est pas un bug PureBasic.
Il faut bien veiller à tout libérer.
Et effectivement ce n'est pas un bug PureBasic.
Il faut bien veiller à tout libérer.
Re: Bug ou pas Bug ?
Sujet intéressent 
Je comprends maintenant pourquoi quand on revient dans un jeu ça prend pas mal de temps

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
Mon forum http://purebasic.forumphp3.com/index.php
Re: Bug ou pas Bug ?
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 ?
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 ?
Re: Bug ou pas Bug ?
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 :
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 ?
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 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 ?
Re: Bug ou pas Bug ?
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.
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.
Re: Bug ou pas Bug ?
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.
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.
Re: Bug ou pas Bug ?
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.
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.
Re: Bug ou pas Bug ?
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...
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...
Re: Bug ou pas Bug ?
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.
Je vais voir ça de plus près.
Intéressant ce code, je vais m'y pencher sérieusement.
Merci à toi.
Re: Bug ou pas Bug ?
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.
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.