[résolu] Rapidité: Tableaux vs. PokeB/PeekB

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

[résolu] Rapidité: Tableaux vs. PokeB/PeekB

Message par kelebrindae »

Bonjour à tous,

Je me suis lancé dans la programmation d'un jeu de plateau du genre de "Pentamino" (où il faut placer des pièces de formes différentes sur un plateau de 10 sur 10).
Pour la partie AI du code, je vais utiliser un algo style Minimax => comme il va falloir tester un grand nombre de "coups" jouables, je vais devoir m'arranger pour que ça speede.

J'ai donc fait des petits tests préalables sur les différentes façons de stocker la forme des pièces et de placer ces pièces sur le plateau, avec dans l'idée que PeekB et PokeB seraient plus rapides que la manipulation de tableaux.

Or, ce n'est pas le cas. 8O
- Pour aller relire la forme de la pièce jouée, PeekB est plus rapide qu'un tableau (jusque là, ça va).
- Par contre, pour "cocher" les cases du plateau occupées par la pièce, c'est plus rapide d'écrire dans un tableau que de faire du PokeB. :?

Pouvez-vous me confirmer ça en testant le petit code ci-dessous ? Merci d'avance !
(chez moi, c'est le test n°2, "Ecrire dans un tableau à partir de PeekB", qui est le plus rapide)

P.S.: Si c'est trop rapide ou trop long chez vous, faites varier la valeur de la constante #NBITERATIONS.

P.S. 2: N'oubliez pas de désactiver le debugger... :wink:

Code : Tout sélectionner

#TAILLEPLATEAU = 10
#NBITERATIONS = 10000000

; Définissons un plateau de jeu de 10 sur 10
; Grâce à un tableau:
Dim plateau.b(#TAILLEPLATEAU * #TAILLEPLATEAU)
; et dans un espace mémoire:
*plateau.b = AllocateMemory(#TAILLEPLATEAU * #TAILLEPLATEAU)


; soit un tableau pouvant recevoir 10 pièces de 5 cases maxi chacunes, avec chacune une coord X et une coord Y 
taille.b=5
Dim casesPieces.b(10,taille,2)


; Pour le test, seule la pièce n°1 est décrite:
;       X             :         Y
casesPieces(1,1,1) = 0 : casesPieces(1,1,2) = 0
casesPieces(1,2,1) = 0 : casesPieces(1,2,2) = 1
casesPieces(1,3,1) = 0 : casesPieces(1,3,2) = 2
casesPieces(1,4,1) = -1: casesPieces(1,4,2) = 1
casesPieces(1,5,1) = 1 : casesPieces(1,5,2) = 2

; Pour comparer, on va stocker les mêmes infos dans un espace mémoire
Dim *ptrCases.b(10)
*piecesPtr.b = AllocateMemory(10 * taille * 2) ; un seul espace mémoire pour toutes les pièces
*ptrCases(1) = *piecesPtr                      ; la pièce n°1 est au début de cet espace mémoire
;       X                 :         Y
PokeB(*ptrCases(1)   , 0) : PokeB(*ptrCases(1) +1 , 0)
PokeB(*ptrCases(1) +2, 0) : PokeB(*ptrCases(1) +3 , 1)
PokeB(*ptrCases(1) +4, 0) : PokeB(*ptrCases(1) +5 , 2)
PokeB(*ptrCases(1) +6,-1) : PokeB(*ptrCases(1) +7 , 1)
PokeB(*ptrCases(1) +8, 1) : PokeB(*ptrCases(1) +9 , 2)


; On va poser la pièce n°1 à la case E5
piece.b = 1
x.b = 5: y.b = 5

; Tests A: Ecrire dans un tableau
; Test A1: à l'aide du tableau
t1 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS    
  For i=1 To taille
    plateau(x+casesPieces(piece,i,1) + (y+casesPieces(piece,i,2))*#TAILLEPLATEAU) = piece
  Next i
Next k
t2 = ElapsedMilliseconds()

; Test A2: à l'aide de PeekB
t3 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS
  *tempptr = *ptrCases(piece)
  For i=1 To taille
    plateau(x+PeekB(*tempPtr) + (y+PeekB(*tempPtr+1))*#TAILLEPLATEAU) = piece
    *tempPtr+2
  Next i
Next k
t4 = ElapsedMilliseconds() 

; Tests B: Ecrire dans un espace mémoire
; Test B1: à l'aide du tableau
t5 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS    
  For i=1 To taille
    PokeB(*plateau + x+casesPieces(piece,i,1) + (y+casesPieces(piece,i,2))*#TAILLEPLATEAU ,piece)
  Next i
Next k
t6 = ElapsedMilliseconds()

; Test B2: à l'aide de PeekB
t7 = ElapsedMilliseconds()
For k = 1 To #NBITERATIONS
  *tempptr = *ptrCases(piece)
  For i=1 To taille
    PokeB(*plateau + x+PeekB(*tempPtr) + (y+PeekB(*tempPtr+1))*#TAILLEPLATEAU ,piece)
    *tempPtr+2
  Next i
Next k
t8 = ElapsedMilliseconds() 

MessageRequester("Test tps exécution", "Ecriture dans un tableau" + Chr(10) + "  - à partir d'un tableau: " + Str(t2 - t1) + Chr(10) + "  - à partir de PeekB: " + Str(t4 - t3) + Chr(10) + Chr(10) + "Ecriture par PokeB" + Chr(10) + "  - à partir d'un tableau: " + Str(t6 - t5) + Chr(10) + "  - à partir de PeekB: " + Str(t8 - t7) )
Dernière modification par kelebrindae le mar. 13/mai/2008 22:16, modifié 2 fois.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Pentamino? C'est quoi ce jeu?
Anonyme

Message par Anonyme »

Pique poque , plus rapide :D
didier69
Messages : 61
Inscription : mer. 30/avr./2008 12:50
Localisation : Villeurbanne (Lyon)

Message par didier69 »

Ollivier a écrit :Pentamino? C'est quoi ce jeu?
http://fr.wikipedia.org/wiki/Pentamino

:)

Et au passage je serais curieux de voir comment tu vas
programmer ce jeu. J'en apprendrais un peu plus sur les jeux :).
pb 5.31
kelebrindae
Messages : 579
Inscription : ven. 11/mai/2007 15:21

Message par kelebrindae »

@cpl_bator:
Ok, merci; ça me paraît plus logique. Je vais partir sur les peek/poke, alors.


@Didier69:
En fait, le jeu que je veux programmer s'appelle Cathedral:
http://fr.wikipedia.org/wiki/Cathedral_%28jeu%29 <-- corrigé par Dobro
Il s'agit de placer des bâtiments de formes différentes sur un plateau (comme le Pentamino), avec la possibilité de "capturer" du territoire en l'encerclant; c'est un très bon jeu.

Quant à l'adaptation en PB... Je posterai des sources si jamais j'arrive à quelque chose de "montrable" (c'est pas gagné)... :)
Mais j'ai pas mal avancé, j'aurai peut-être sous peu du code qui fonctionne (même s'il est moche).
Répondre