Page 1 sur 1

Stockage de Sprite en memoire

Publié : dim. 16/janv./2005 14:48
par Dräc
Je suis confronté à un désagréable problème pour mon jeu :
Je suis rapidement limité dans la quantité de sprites à charger en mémoire et ceci malgré l’option #PB_Sprite_Memory pour la commande LoadImage() ! :?

La limite dépend du format d’encodage, ce qui parait assez normal afin que le micropro puisse décompresser l’image, mais malgré tout, ca ne va pas bien loin : trois images de 1000x120x8 bits = 3*120Ko seulement (pour 192 Mo de RAM) !!!

En meme temps, on remplie vite la RAM a ce rythme.
Aussi, quelqu’un peut il m’expliquer comment stocker efficacement en mémoire un maximum de sprites ?

Publié : dim. 16/janv./2005 15:36
par Dräc
C’est assez étrange, je peux charger par contre 4 images de 1020x120x8 bits !

Le problème ne serait-il pas plus une question de « compatibilité » en terme d’agencement des bits que de place mémoire ?!?

Publié : dim. 16/janv./2005 16:00
par comtois
tu as combien de mémoire vidéo ?
pourquoi tu ne les charges pas en tant que sprite ?

Code : Tout sélectionner

#ScreenWidth = 800 
#ScreenHeight = 600
#ScreenDepth = 32
;{- Initialisation
If InitSprite() = 0 Or InitKeyboard() = 0 
   MessageRequester( "Erreur" , "Impossible d'initialiser DirectX 7 Ou plus" , 0 )
   End
ElseIf OpenScreen( #ScreenWidth , #ScreenHeight , #ScreenDepth , "M3D_Matrix3D" ) = 0
   MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 )
   End
EndIf
;}
Debug AvailableScreenMemory() 
For i=1 To 10
CreateSprite(i,1000,120)
Next i

Debug AvailableScreenMemory() 

End

Publié : dim. 16/janv./2005 16:03
par Le Soldat Inconnu
c'est peut-être le 8bits qui fous le bazar, essai en 24bits

Publié : dim. 16/janv./2005 16:04
par Dräc
En fait ca marche si l’image fait 1001x120x8bits et non 1000x120x8bits 8O
Je suis en pleine 4ieme dimension … :??:

Publié : dim. 16/janv./2005 16:08
par Dräc
Le Soldat Inconnu a écrit :c'est peut-être le 8bits qui fous le bazar, essai en 24bits
Meme topo en 24bits:
1000x120x24 bits marche pas!
1001x120x24 bits marche !

Je ne vois pas de logique pour l'instant :?

Publié : dim. 16/janv./2005 16:14
par Dräc
comtois a écrit :tu as combien de mémoire vidéo ?
pourquoi tu ne les charges pas en tant que sprite ?
Quoi ca ?
Dois-je répondre à cette question ? Car ca me complexe un peu vois tu! :)
En fait c'est quasi inexistant chez moi: ... 4MB !
Et oui je sais, ca fait un choc! :lol:

Publié : dim. 16/janv./2005 16:48
par Dräc
Ce qui est intéressant avec ton exemple Comtois, c’est que ca marche bien pour moi aussi (moyennant l’option #PB_Sprite_Memory, n’y revenons plus :) ).
Donc utiliser CreateSprite() marche.
Alors j’ai cherché à combiner CreateSprite() et LoadSprite(), et sa marche!
D'abord CreateSprite() puis LoadSprite()

Par contre si on utilise #PB_Any dans CreateSprite, le nombre #sprite qu’elle retourne est trop grand pour l’utiliser dans LoadSprite…

Donc 2 problèmes:
- il y a un probleme avec la fonction LoadSprite() au niveau de l'allocation memoire.
- CreateSprite() retourner un #sprite qui peut etre trop grand s’il est utilisé avec #PB_Any.

Publié : dim. 16/janv./2005 17:23
par Dräc
Je vous propose de tester ca pour savoir si c’est un probleme général.
2 codes et une image.
Pour moi, la première partie du code n°1 marche mais pas la deuxième…

L’image est la:
http://drac.site.chez.tiscali.fr/PB_tes ... /blank.rar
Et le code n°1 ici :

Code : Tout sélectionner

InitSprite()
OpenWindow(0,10,10, 100, 100, 0, "test")
OpenWindowedScreen(WindowID(),10,10, 100, 100, 0,0,0)
FileName$="blank.bmp"

spriteID1 = CreateSprite(1, 1000,120, #PB_Sprite_Memory)
LoadSprite( 1, FileName$, #PB_Sprite_Memory )
Debug 1
spriteID2 = CreateSprite( 2, 1000,120, #PB_Sprite_Memory)
LoadSprite( 2, FileName$, #PB_Sprite_Memory )
Debug 2
spriteID3 = CreateSprite( 3, 1000,120, #PB_Sprite_Memory)
LoadSprite( 3, FileName$, #PB_Sprite_Memory )
Debug 3
spriteID4 = CreateSprite( 4, FileName$, #PB_Sprite_Memory )
LoadSprite( 4, FileName$, #PB_Sprite_Memory )
Debug 4

For i=1 To 4
  FreeSprite(i)
Next
Debug "-------------------------------"

;spriteID1 = CreateSprite(1, 1000,120, #PB_Sprite_Memory)
LoadSprite( 1, FileName$, #PB_Sprite_Memory )
Debug 1
;spriteID2 = CreateSprite( 2, 1000,120, #PB_Sprite_Memory)
LoadSprite( 2, FileName$, #PB_Sprite_Memory )
Debug 2
;spriteID3 = CreateSprite( 3, 1000,120, #PB_Sprite_Memory)
LoadSprite( 3, FileName$, #PB_Sprite_Memory )
Debug 3
;spriteID4 = CreateSprite( 4, FileName$, #PB_Sprite_Memory )
LoadSprite( 4, FileName$, #PB_Sprite_Memory )
Debug 4
Et pour le probleme de CreateSprite avec l'option #PB_Any voici le code n°2:

Code : Tout sélectionner

InitSprite()
OpenWindow(0,10,10, 100, 100, 0, "test")
OpenWindowedScreen(WindowID(),10,10, 100, 100, 0,0,0)
FileName$="blank.bmp"

spriteID1 = CreateSprite( #PB_Any, 1000,120, #PB_Sprite_Memory)
Debug Str(spriteID1)
LoadSprite( spriteID1, FileName$, #PB_Sprite_Memory )

Publié : dim. 16/janv./2005 17:47
par comtois
oui ça plante aussi chez moi pour le test 2

par contre si tu remplaces le loadsprite par un displaysprite , ça passe

Code : Tout sélectionner

InitSprite() 
OpenWindow(0,10,10, 100, 100, 0, "test") 
OpenWindowedScreen(WindowID(),10,10, 100, 100, 0,0,0) 
FileName$="blank.bmp" 

spriteID1 = CreateSprite( #PB_Any, 1000,120, #PB_Sprite_Memory) 
Debug Str(spriteID1) 
DisplaySprite( spriteID1, FileName$, #PB_Sprite_Memory )

tu peux faire comme ça aussi

Code : Tout sélectionner

InitSprite() 
OpenWindow(0,10,10, 100, 100, 0, "test") 
OpenWindowedScreen(WindowID(),10,10, 100, 100, 0,0,0) 
FileName$="blank.bmp" 

spriteID1 = CreateSprite( #PB_Any, 1000,120, #PB_Sprite_Memory) 
SaveSprite(spriteID1,"toto.bmp") 
Debug spriteID1 
FreeSprite(spriteID1)
spriteID1=LoadSprite(#PB_Any, FileName$, #PB_Sprite_Memory )
Ceci dit , à quoi ça te sert de faire un loadsprite après un createSprite ??

Publié : dim. 16/janv./2005 19:59
par Dräc
Ok, je reprends :
Pour moi le test 1 marche jusqu’à la ligne 22 et le test 2 plante.

Effectivement le mieux serait que je puisse directement écrire

Code : Tout sélectionner

LoadSprite( 1, FileName$, #PB_Sprite_Memory) 
Mais ca ne marche pas forcement chez moi.

Or en prenant la précaution de faire un CreateSprite avant :

Code : Tout sélectionner

CreateSprite(1, 1000,120, #PB_Sprite_Memory) 
LoadSprite( 1, FileName$, #PB_Sprite_Memory ) 
et bien ca marche !!!

C’était le sense du test 1.

D’après ta réaction, j’en conclus donc que le test 1 marche entièrement pour toi…

Le test 2 et ta remarque sur DisplaySprite() montre simplement que LoadSprite() ne supporte pas un numéro de sprite > 10000000 ce signale de débugger mais pas la doc.