Page 1 sur 2

Bug graphique selon carte graphique

Publié : ven. 14/déc./2007 15:01
par SPH
Dingue !

Ce code qui marchait impec sur mon ancien matos ne marche plus sur mon nouvel ordi (en cause la carte gfx ??)

Ce n'est pas la premiere foius que ca m'arrive et c'est deja arrivé a d'autres, je me rapelle leur post avec le screenshot du decallage gfx.

Code : Tout sélectionner

; SPH(2007) 
; PB4.02 

If InitSprite()=0 Or InitMouse() =0 Or InitKeyboard() =0 
MessageRequester("Erreur", "Ne peux ouvrir DirectX7+...") : End 
EndIf 

;SetPriorityClass_ ( GetCurrentProcess_ (), #IDLE_PRIORITY_CLASS ) 

If ExamineDesktops() =0 
MessageRequester("Erreur", "Parametres du bureau introuvable...") : End 
EndIf

   dw.w=DesktopWidth(0) 
   dh.w=DesktopHeight(0) 
   dc.w=DesktopDepth(0) 
    


If dc<>32 
MessageRequester("Message", "Le jeu va essayer de passer en couleurs 32 bits...") 
EndIf 


If OpenScreen(dw,dh,32,"") =0 
MessageRequester("Erreur", "ScreenOpen 32 bits impossible...")
If OpenScreen(dw,dh,dc,"") =0 
MessageRequester("Erreur", "ScreenOpen avec les couleurs actuelles impossible...") : End
EndIf 
Else
dc=32
EndIf 

;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 

dw2.w= dw*2+Random(2000) 
dh2.w= dh*2+Random(2000) 
Dim p.l(dw2*dh2) 

marge.b=4

dw_min.w=marge
dw_max.w=dw-marge-1 
dh_min.w=marge 
dh_max.w=dh-marge-1

deca_x=0 
deca_y=0 


dw2_line.w=dw2*dc/8
dw_line.w=dw*dc/8
dw_color.w=dw* dc/8
deca_x_line.w=deca_x*dc/8
;CopyMemory(@p()+ (deca_y+u)*dw2_line+ deca_x_line, MemVideo+ dw_line*u, dw_color) 





For i=1 To 10000 
p(Random(dw2*dh2))=RGB(Random(155)+100,Random(155)+100,Random(155)+100) 
Next 
For i=0 To dh2-1 
p(i*dw2)=RGB(255,140,140) 
Next 
For i=0 To dh2-1 
p(i*dw2+dw2-1)=RGB(50,255,50) 
Next 
For i=0 To dw2-1 
p(i)=RGB(255,255,255) 
p(i+(dw2*(dh2-1)))=RGB(0,255,255) 
Next 





;If LoadSprite(0, "pointeur01.bmp") =0
;MessageRequester("Erreur", "Sprite introuvable...") : End 
;EndIf
;If LoadSprite(1, "pointeur02.bmp") =0
;MessageRequester("Erreur", "Sprite introuvable...") : End 
;EndIf


xmouse.w=dw/2 
ymouse.w=dh/2 





sensiblemouse.f=3  ;  RAPIDITé DE LA SOURIS (de 0.5 a 5) ******* 
sensiblescroll.f=2  ;  RAPIDITé DU SCROLL des bordures (de 0.5 a 5) ******** 
sensiblescrollm.f=4   ;  RAPIDITé DU SCROLL de la souris (de 0.5 a 5) ******** 

Mbouton_r_actu.b=0
Mbouton_l_actu.b=0
mbouton_x1.w=0
mbouton_y1.w=0
mbouton_x2.w=0
mbouton_y2.w=0
scrollinverse_x.b=1 ; (1 ou -1)
scrollinverse_y.b=1 ; (1 ou -1)
deplacement.b=0
scrollsensiblemouse.b=1 ; (de 0 a 16; 16= souris super sensible)
pointeur.b=0
dkx.b=0
dky.b=0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

Repeat ; Until KeyboardPushed(#PB_Key_All) 

ExamineMouse() 
xdelta=MouseDeltaX() 
ydelta=MouseDeltaY() 
Mbouton_r.b = MouseButton(#PB_MouseButton_Right)
Mbouton_l.b = MouseButton(#PB_MouseButton_Left)

;;;;;;;;;;;;;;;;;;;;;;; analyse des coordonnées de la souris

xmouse+xdelta*sensiblemouse 
ymouse+ydelta*sensiblemouse 

If xmouse<dw_min 
deca_x+xdelta*sensiblescroll 
xmouse=dw_min 
  If deca_x<0 
  deca_x=0 
  EndIf 
Else 
If xmouse>dw_max 
deca_x+xdelta*sensiblescroll 
xmouse=dw_max 
  If deca_x>dw2-dw 
  deca_x=dw2-dw 
  EndIf 
EndIf 
EndIf 

If ymouse<dh_min 
deca_y+ydelta*sensiblescroll 
ymouse=dh_min 
  If deca_y<0 
  deca_y=0 
  EndIf 
Else 
If ymouse>dh_max 
deca_y+ydelta*sensiblescroll 
ymouse=dh_max 
  If deca_y>dh2-dh 
  deca_y=dh2-dh 
  EndIf 
EndIf 
EndIf 
;;;;;;;;;;;;;;;;;;;;;;; end



;;;;;;;;;;;;;;;;;;;;;;; analyse des boutons de la souris
If mbouton_r<>0 
pointeur=1
dkx=20
dky=20
If mbouton_r_actu=0

mbouton_r_actu=1
mbouton_x1= xmouse
mbouton_y1= ymouse
Else

If deplacement=0
If xmouse<mbouton_x1-scrollsensiblemouse Or xmouse>mbouton_x1+scrollsensiblemouse
;;;;; deplace t'on la souris avec le bouton droit enfoncé ?
deplacement=1
EndIf
If ymouse<mbouton_y1-scrollsensiblemouse Or ymouse>mbouton_y1+scrollsensiblemouse
;;;;; deplace t'on la souris avec le bouton droit enfoncé ?
deplacement=1
EndIf
Else
;;;;; on est bien en deplacement donc, on scroll ici
deca_x+xdelta*sensiblescrollm*scrollinverse_x
deca_y+ydelta*sensiblescrollm*scrollinverse_y

  If deca_x<0 
  deca_x=0 
  EndIf 
  If deca_x>dw2-dw 
  deca_x=dw2-dw 
  EndIf 

  If deca_y<0 
  deca_y=0 
  EndIf 
  If deca_y>dh2-dh 
  deca_y=dh2-dh 
  EndIf 
EndIf

EndIf

Else ; si mbouton_r=0 
If deplacement=0
;;;;;; ici, on a relaché le bouton droit. On peux faire apparaitre un menu
EndIf

If pointeur=1
mbouton_r_actu=0
deplacement=0
pointeur=0
dkx=0
dky=0
EndIf
EndIf
;;;;; end



;If mbouton_r=0 And mbouton_r_actu=1
;mbouton_r_actu=0
;mbouton_x2= xmouse
;mbouton_y2= ymouse
;;;;;;;; on viens de lacher le bouton droit de la souris
;Beep_(700,100)
;End
;;;;;;;; end
;EndIf


;;;;;;;;;;;;;;;;;;;;;;; end

StartDrawing(ScreenOutput()) 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
MemVideo = DrawingBuffer() 
deca_x_line.w=deca_x*4

For u=0 To dh-1 
CopyMemory(@p()+ (deca_y+u)*dw2_line+ deca_x_line, MemVideo+ dw_line*u, dw_color) 
Next 

;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
;;;;;;;;;;; 
Circle(xmouse,ymouse,20,RGB(255,255,255)) 
StopDrawing() 
;DisplayTransparentSprite(pointeur, xmouse-dkx, ymouse-dky) 
;***** 
FlipBuffers(1) 
Delay(1) 

ExamineKeyboard() 
Until KeyboardPushed(#PB_Key_All) 
End 

Publié : ven. 14/déc./2007 15:12
par djes
Sur nos machines "accélèrées", l'accès à la mémoire graphique est à proscrire, surtout quand tu peux utiliser des routines câblées pour le même job. Là, un coup de grabsprite devrait faire l'affaire...

Publié : ven. 14/déc./2007 15:23
par Backup
sur ma carte Winfast 7600GT TDH , ça marche impec ! :)

Publié : ven. 14/déc./2007 16:20
par djes
djes a écrit :Sur nos machines "accélèrées", l'accès à la mémoire graphique est à proscrire, surtout quand tu peux utiliser des routines câblées pour le même job. Là, un coup de grabsprite devrait faire l'affaire...
Ca veut bien sûr dire qu'ici ça ne marche pas... Intel IGP oblige ;)

Publié : ven. 14/déc./2007 17:26
par SPH
je suis passé de amd2000+ + 7600 gs a intel cor2duo 2200 + 8600 gts

FRED : Ce ne devrait pas etre à l'utilisateur de modifier sa routine mais à PB de prendre en compte les differences de matos !

J'ai un affichage incomplet en espece de colonne. Bref, il y a un décallage quelque part !!

Publié : ven. 14/déc./2007 18:21
par Chris
Chez moi, ça marche pas non plus. J'ai un gros bug en bas de l'écran.

Publié : ven. 14/déc./2007 19:30
par SPH
Chris a écrit :Chez moi, ça marche pas non plus. J'ai un gros bug en bas de l'écran.
Donne ta config pour voir (intel ?)

Publié : ven. 14/déc./2007 19:37
par case
SPH a écrit : FRED : Ce ne devrait pas etre à l'utilisateur de modifier sa routine mais à PB de prendre en compte les differences de matos !
heuu non :)
pure basic ne bug pas, c'est ton code qui est incompatible avec ton materiel et la en l'occurence tu es l'auteur de ce code , pas fred c'est a toi de prendre en compte les differences de materiel dans ton code :)

as tu penser a regarder du coté des commandes suivantes.

DrawingBufferPitch()
DrawingBufferPixelFormat()

ca peux aider :)

Publié : ven. 14/déc./2007 19:45
par case
ligne 255

Code : Tout sélectionner

	CopyMemory(@p()+ (deca_y+u)*dw2_line+ deca_x_line, MemVideo+ DrawingBufferPitch()*u, dw_color)
essaie ca par exemple :)


la taille d'une ligne dans memoire video n'est pas forcement la taille réelle d'une ligne en l'occurence tu calcule la taille avec

nombre de pixels * 4 octets

soit dans mon cas un 'pitch' de 6720 octets (resolution de 1680*1050)
ma carte graphique (8800GT) utilise un pitch de 8192 octets
(2048 pixels *4 bytes) sans doute parceque ca doit etre un multiple de 512.

donc retour a la ligne tout les 2048 octets au lieu de 6720 calcules par ton programme.

ce qui explique le decalage et le gros bug en bas de l'ecran

car tu ecris ta ligne avant le retour a la ligne de ta carte. :)

Publié : ven. 14/déc./2007 20:13
par Chris
SPH a écrit :
Chris a écrit :Chez moi, ça marche pas non plus. J'ai un gros bug en bas de l'écran.
Donne ta config pour voir (intel ?)
Intel, oui.

Intel Core2 Duo 2.66 GHz
RAM 3Go
CG NVidia 8800GTS
Vista Home Premium

Publié : ven. 14/déc./2007 21:48
par SPH
case a écrit : heuu non :)
pure basic ne bug pas, c'est ton code qui est incompatible avec ton materiel et la en l'occurence tu es l'auteur de ce code
En disant cela, tu remets en cause la compatibilité entre "pc" et "pc". Hors, tous PC en dehors d'IMB est un COMPATIBLE PC.

DONC, un QUELCONQUE programme compatible PC doit s'executer de la meme facon. Il ne manquerait plus que ce soit a l'utilisateur de PB de gerer les simple core, les dual core, les instructions SSE presents ou absent et autre !!

Publié : ven. 14/déc./2007 21:49
par djes
SPH a écrit :
case a écrit : heuu non :)
pure basic ne bug pas, c'est ton code qui est incompatible avec ton materiel et la en l'occurence tu es l'auteur de ce code
En disant cela, tu remets en cause la compatibilité entre "pc" et "pc". Hors, tous PC en dehors d'IMB est un COMPATIBLE PC.

DONC, un QUELCONQUE programme compatible PC doit s'executer de la meme facon. Il ne manquerait plus que ce soit a l'utilisateur de PB de gerer les simple core, les dual core, les instructions SSE presents ou absent et autre !!
N'importe quoi.

Publié : ven. 14/déc./2007 22:16
par case
SPH a écrit : DONC, un QUELCONQUE programme compatible PC doit s'exécuter de la même façon. Il ne manquerait plus que ce soit a l'utilisateur de PB de gérer les simple core, les dual core, les instructions SSE presents ou absent et autre !!
le programme s'exécute de la même façon, il copie bêtement des plages mémoires d'un endroit a un autre, il le fait exactement comme tu lui a dit de le faire , c'est juste toi qui n'utilise pas les fonctions prévue pour cet usage :)

a savoir

DrawingBufferPitch() pour connaitre la taille en octet d'une ligne de ton image

DrawingBufferPixelFormat() pour connaitre le type de pixel utilises a savoir rrggbb ou bbggrr ou aabbggrr etc... 16 bits 8 bits ...


et dans ce cas surtout la commande drawingbufferpitch()

car en modifiant la ligne 255 de ton programme.. étrangement cela fonctionne parfaitement sur toute les configurations...

Code : Tout sélectionner

   CopyMemory(@p()+ (deca_y+u)*dw2_line+ deca_x_line, MemVideo+ DrawingBufferPitch()*u, dw_color) 
en tout cas ce n'est certainement pas un bug :)

Publié : ven. 14/déc./2007 22:23
par Chris
Avec la modif de Case, ça fonctionne chez moi aussi

Publié : ven. 14/déc./2007 22:58
par Anonyme

Code : Tout sélectionner

; SPH(2007)
; PB4.02

If InitSprite()=0 Or InitMouse() =0 Or InitKeyboard() =0
MessageRequester("Erreur", "Ne peux ouvrir DirectX7+...") : End
EndIf

;SetPriorityClass_ ( GetCurrentProcess_ (), #IDLE_PRIORITY_CLASS )

If ExamineDesktops() =0
MessageRequester("Erreur", "Parametres du bureau introuvable...") : End
EndIf

   dw.w=DesktopWidth(0)
   dh.w=DesktopHeight(0)
   dc.w=DesktopDepth(0)
   


If dc<>32
MessageRequester("Message", "Le jeu va essayer de passer en couleurs 32 bits...")
EndIf


If OpenScreen(dw,dh,32,"") =0
MessageRequester("Erreur", "ScreenOpen 32 bits impossible...")
If OpenScreen(dw,dh,dc,"") =0
MessageRequester("Erreur", "ScreenOpen avec les couleurs actuelles impossible...") : End
EndIf
Else
dc=32
EndIf

;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;

dw2.l= dw*2+Random(2000)
dh2.l= dh*2+Random(2000)
Dim p.l(dw2*dh2)

marge.b=4

dw_min.w=marge
dw_max.w=dw-marge-1
dh_min.w=marge
dh_max.w=dh-marge-1

deca_x=0
deca_y=0


dw2_line.w=dw2*dc/8
dw_line.w=dw*dc/8
dw_color.w=dw* dc/8
deca_x_line.w=deca_x*dc/8
;CopyMemory(@p()+ (deca_y+u)*dw2_line+ deca_x_line, MemVideo+ dw_line*u, dw_color)





For x = 0 To dw2-1
For y = 0 To dh2-1
p(x+dw2*y) = COL* (((Cos(x)*Sin(y))/(x*y))*2000)
COL+1

If COL>$FFFFFF
COL=$000000
EndIf 
Next
Next 






Ms$ = "142;164;158;166;166;138;64;132;170;164;156;138;66" : For i = 1 To 13 :   M$ + Chr(  Val(StringField(Ms$,i,";"))/2 ) : Next   

LoadFont(1, "Arial", 128)

StartDrawing(ScreenOutput()) :  DrawingMode(#PB_2DDrawing_Transparent) : DrawingFont(FontID(1))
 DrawText(0,0,M$,$FFFFFF) : 

For y = 1 To TextHeight(M$)
  For x = 1 To TextWidth(M$)
  
         If Point(x,y)=$FFFFFF
            p((512+x) + Dw2 * (512+y))=$FFFFFF         
          EndIf 
   
  Next 
Next 

StopDrawing()














;If LoadSprite(0, "pointeur01.bmp") =0
;MessageRequester("Erreur", "Sprite introuvable...") : End
;EndIf
;If LoadSprite(1, "pointeur02.bmp") =0
;MessageRequester("Erreur", "Sprite introuvable...") : End
;EndIf


xmouse.w=dw/2
ymouse.w=dh/2





sensiblemouse.f=3  ;  RAPIDITé DE LA SOURIS (de 0.5 a 5) *******
sensiblescroll.f=2  ;  RAPIDITé DU SCROLL des bordures (de 0.5 a 5) ********
sensiblescrollm.f=4   ;  RAPIDITé DU SCROLL de la souris (de 0.5 a 5) ********

Mbouton_r_actu.b=0
Mbouton_l_actu.b=0
mbouton_x1.w=0
mbouton_y1.w=0
mbouton_x2.w=0
mbouton_y2.w=0
scrollinverse_x.b=1 ; (1 ou -1)
scrollinverse_y.b=1 ; (1 ou -1)
deplacement.b=0
scrollsensiblemouse.b=1 ; (de 0 a 16; 16= souris super sensible)
pointeur.b=0
dkx.b=0
dky.b=0

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Repeat ; Until KeyboardPushed(#PB_Key_All)

ExamineMouse()
xdelta=MouseDeltaX()
ydelta=MouseDeltaY()
Mbouton_r.b = MouseButton(#PB_MouseButton_Right)
Mbouton_l.b = MouseButton(#PB_MouseButton_Left)

;;;;;;;;;;;;;;;;;;;;;;; analyse des coordonnées de la souris

xmouse+xdelta*sensiblemouse
ymouse+ydelta*sensiblemouse

If xmouse<dw_min
deca_x+xdelta*sensiblescroll
xmouse=dw_min
  If deca_x<0
  deca_x=0
  EndIf
Else
If xmouse>dw_max
deca_x+xdelta*sensiblescroll
xmouse=dw_max
  If deca_x>dw2-dw
  deca_x=dw2-dw
  EndIf
EndIf
EndIf

If ymouse<dh_min
deca_y+ydelta*sensiblescroll
ymouse=dh_min
  If deca_y<0
  deca_y=0
  EndIf
Else
If ymouse>dh_max
deca_y+ydelta*sensiblescroll
ymouse=dh_max
  If deca_y>dh2-dh
  deca_y=dh2-dh
  EndIf
EndIf
EndIf
;;;;;;;;;;;;;;;;;;;;;;; end



;;;;;;;;;;;;;;;;;;;;;;; analyse des boutons de la souris
If mbouton_r<>0
pointeur=1
dkx=20
dky=20
If mbouton_r_actu=0

mbouton_r_actu=1
mbouton_x1= xmouse
mbouton_y1= ymouse
Else

If deplacement=0
If xmouse<mbouton_x1-scrollsensiblemouse Or xmouse>mbouton_x1+scrollsensiblemouse
;;;;; deplace t'on la souris avec le bouton droit enfoncé ?
deplacement=1
EndIf
If ymouse<mbouton_y1-scrollsensiblemouse Or ymouse>mbouton_y1+scrollsensiblemouse
;;;;; deplace t'on la souris avec le bouton droit enfoncé ?
deplacement=1
EndIf
Else
;;;;; on est bien en deplacement donc, on scroll ici
deca_x+xdelta*sensiblescrollm*scrollinverse_x
deca_y+ydelta*sensiblescrollm*scrollinverse_y

  If deca_x<0
  deca_x=0
  EndIf
  If deca_x>dw2-dw
  deca_x=dw2-dw
  EndIf

  If deca_y<0
  deca_y=0
  EndIf
  If deca_y>dh2-dh
  deca_y=dh2-dh
  EndIf
EndIf

EndIf

Else ; si mbouton_r=0
If deplacement=0
;;;;;; ici, on a relaché le bouton droit. On peux faire apparaitre un menu
EndIf

If pointeur=1
mbouton_r_actu=0
deplacement=0
pointeur=0
dkx=0
dky=0
EndIf
EndIf
;;;;; end



;If mbouton_r=0 And mbouton_r_actu=1
;mbouton_r_actu=0
;mbouton_x2= xmouse
;mbouton_y2= ymouse
;;;;;;;; on viens de lacher le bouton droit de la souris
;Beep_(700,100)
;End
;;;;;;;; end
;EndIf
ClearScreen(0)

;;;;;;;;;;;;;;;;;;;;;;; end

StartDrawing(ScreenOutput())
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
MemVideo = DrawingBuffer()
deca_x_line.w=deca_x*4

For u=0 To dh-1
   CopyMemory(@p()+ (deca_y+u)*dw2_line+ deca_x_line, MemVideo+ DrawingBufferPitch()*u, dw_color) 
Next

;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
;;;;;;;;;;;
Circle(xmouse,ymouse,20,RGB(255,255,255))
StopDrawing()
;DisplayTransparentSprite(pointeur, xmouse-dkx, ymouse-dky)
;*****
FlipBuffers(1)
Delay(1)

ExamineKeyboard()
Until KeyboardPushed(#PB_Key_All)
End 
C'est nickel aussi ici ( Warning, le code du dessus est craignos pour vos yeux :D )