"Compilation" niveau
Posté le 29/01/2016 20:35
Bonjour,
Ayant envie de passer à la vitesse supérieure niveau prog, je suis actuellement en train de travailler sur un jeu de plateforme fonctionnant par tableaux successifs (d'ailleurs si quelqu'un sait comment gérer du scrolling en basic, je suis preneur x), et pour me faciliter la tâcher, j'ai créé un éditeur dans lequel je peux modifier un des tableaux assez facilement avec le test et tout le bazar.
Le plan étant d'ensuite proposer une sorte de "compilation" rudimentaire où la calculatrice me condenserait toute la matrice de travail (de 21*7) dans une seule ligne que j'ajouterais dans un programme stockant les niveaux que le programme chargerait ensuite quand le joueur se déplace de tableau en tableau. Oui je suis flemmard et j'ai moyennement envie de recopier tout ça à la main vu que je prévois une centaine de tableaux xD (en espérant que les 60ko de la puce tiennent le coup)
Du coup là où survient le problème, c'est que j'aimerais que le compilateur "lise" la matrice case par case (ça c'est facile) mais qu'il me transfère le résultat dans le presse-papier afin que je puisse le coller ensuite avec le reste des niveaux, ce qui revient à renvoyer ce genre de texte : [[1,2,3,..,21][[1,2,3,..,21]...]
Est-ce que c'est possible, où y'aurait moyen de contourner le problème ?
Merci par avance !
(je mets le prog d'édition et de test en pièce-jointe, si vous avez envie de vous crever les yeux c'est par là
: les progs marchent avec les matrices C et D dimensionnées à 7*21)
Fichier joint
Citer : Posté le 31/01/2016 18:37 | # | Fichier joint
Finalement, je suis parvenu à créer une belle initialisation de matrice ! A vrai, ça a été plus d'attente de compilation qu'autre chose, mais je suis enfin venu à bout de tout ce qui me gênait Avec énormément de travail, je pourrais optimiser et générer les matrices de manières procédurale (vu que y'a énormément de vide) mais chaque chose en son temps et ça ne risque pas d'être facile ! Bref, à présent tu peux supprimer la matrice C, il ne te suffira que d'exécuter INIT~W1 et tout sera bon, y compris pour les strings ^o^ Je te mets tout ça, prochaine étape le moteur de jeu et après, je refais peu à peu tous les niveaux !
Une dernière chose, est-ce que tu sais si y'a moyen de dire à la calculatrice : pendant les X prochaines cases, tu remplis avec ça ? Ça pourrait faire gagner masse place bien utilisé !
En tout cas ça avance bien, merci pour les tuyaux ! (ba-dam-tzin)
Citer : Posté le 31/01/2016 18:52 | #
Super !
Bonne chance pour générer de manière procédurale !
Je test ça
Une boucle for ?
Mais de rien je suis content que ça avance si bien (mario, tuyaux, je l'ai )
edit : "now compilig" ?
Sinon c'est bien fait et fluide de ce que j'ai pu voir
La compilation est longue mais ça va.
edit 2 : Je n'arrive pas à placer de blocs
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 31/01/2016 19:21 | # | Fichier joint
J'ai regardé Bin2Str et tu peux l'optimiser en enlevant tous les If Then IfEnd pour les remplacer par "⇒" (cf fichier joint )
Et tu n'es pas obligé de mettre les return, arrivé à la fin du sous-programme, ça le fait automatiquement
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 31/01/2016 20:15 | # | Fichier joint
C'est bon ! Première version jouable \o/ Y'a juste besoin d'avoir le programme PLATFORM et INIT~W1 pour que ça fonctionne ! (Inutile de tout initialiser manuellement, il suffit de passer par le programme PLATFORM dont sa première tâche sera de loader le niveau.)
Par contre, je ne sais toujours pas comment je vais simuler un bloc qui se casse, ça c'est moyen vu que les textures sont déjà calculées... Bref, je pense que j'ai ma dose pour aujourd'hui, je vais build le monde 1 dans la semaine et voir ce que ça donne
Ajouté le 31/01/2016 à 20:25 :
Alors, en tant que bon triso, j'avais pas vu la deuxième page, donc je vais t'expliquer pourquoi j'ai rajouté du return de partout dans Bin2Str. L'idée, c'est de gagner un max de temps lors de la compilation, or il s'avère que cette dernière est environ 20% plus rapide lorsque je lui demande immédiatement de revenir. En fait, je pars du principe que dès lors qu'il a trouvé ce qu'il devait faire, il n'a pas besoin de lire la suite et de perdre du temps : donc retour au prog de base (du coup adieu la flèche inutile c'est pour ça)
La boucle for, j'y ai pensé, mais du coup faut repenser entièrement la manière de générer la matrice, il est là le vrai problème mais bien tenté xD
Alors, pour ce qu'il est de placer des blocs, je vais t'expliquer la manière foireuse dont ça fonctionne. Dans la caméra normale, tu peux techniquement placer des blocs, mais tu n'en vois pas la répercussion immédiatement (il faut compiler avec F<->D sur la ligne que tu veux actualiser). C'est pour cela que j'ai ajouté ce mode au fonctionnement dynamique en appuyant sur ALPHA : la caméra est fixe, mais tu vois ce que tu fais. Si tu veux être sûr que tu es en train de placer le bon bloc dans ce mode, il faut appuyer sur SHIFT (c'est une petite flemmardise de ma part que je ne vais pas tarder à corriger) et là, tu vois en haut à droite le bloc que tu t'apprêtes à poser. Ensuite, EXE pour placer un bloc ou le retirer si y'en a déjà un.
Citer : Posté le 31/01/2016 20:43 | #
J'ai possiblement beaucoup plus pratique pour l'édition, mais là j'ai pas le temps donc on en parle demain sur skype ou TS si tu veux
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 31/01/2016 22:00 | #
Salut !
Tu as l'air de bien avancer et de savoir où tu vas, ça fait plaisir à voir !
Au sujet de la compilation, tu as bien sûr raison, Arkenstone est simpliste de ce côté là, c'était plutôt l'idée en elle-même que je pensais que tu pouvais exploiter.
Tu m'excuseras de ne pas avoir regardé en détail tes programmes mais disons que tes maps comportent 8 éléments différents (7 "briques" + l'élément vide). Tu peux donc considérer chaque "case" de ta map comme étant en base 8. Ensuite tu peux convertir en base 2 (sur 4 bits donc). Là où ça devient intéressant c'est que tu peux "agglomérer" les cases deux par deux pour obtenir des octets (2 fois 4 bits = 8 bits = 1 octet).
Et c'est là qu'intervient l'astuce : tu peux créer un "dictionnaire" comportant 255 caractères différents (c'est important, tu peux les trouver dans le menu caractère spéciaux). Ainsi à un caractère donné correspondra un index unique, et inversement.
Du coup tu peux convertir l'octet binaire de tout à l'heure en base 10, pour obtenir un nombre décimal entre 0 et 255 et venir chercher le caractère d'index cet entier décimal dans ton catalogue.
Si tu m'as bien suivi : 2 cases = 1 seul caractère.
Puisque que tu peux mettre 255 caractères dans une Str, ça veut dire que tu peux faire des niveaux de 510 cases de long ! Et pour la hauteur il suffit de mettre autant de Str que tu le souhaites.
J'ai fait la démonstration pour des cases octales mais si tu fonctionnes sur une autre base c'est le même principe ! Il faut juste que ton programme soit capable de toujours agglomérer les cases en binaire puis de découper en octets, et bien sur de savoir faire l’inverse sans perdre d'info.
J'espère que c'est clair, sinon n'hésite pas à me faire signe.
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 31/01/2016 23:18 | #
Waouw, c'est très compliqué à saisir ce que tu me proposes là, mais là tu as grandement piqué mon attention... Je pense que ton aide m'est précieuse mais là ça me dépasse : je n'ai aucune idée de la manière dont la calculatrice encode les informations, enfin si mais c'est vague vu que je me fie à la taille du programme qui change en fonction de ce que l'on met dedans. Beaucoup de questions se bousculent dans ma tête, et comme je n'ai pas la réponse aux premières je suis largué au milieu de ton explication, donc je vais tenter de m'ordonner :
- Comment faire pour convertir un élément de ma base 8 sur 4 bits ? Si je comprends bien, l'idée c'est de déduire un nouveau caractère de cette alliance de deux éléments de base, non ? Si oui, comment je les allie ? (vu que la calculatrice gère la mémoire de son côté sans demander son reste) Et après, que suis-je sensé faire de ce caractère ? Créer un dictionnaire à 256 entrées ? C'est chaud o_O
-Après, je ne comprends pas tellement pourquoi on repasse en base 10, c'est pour exploiter une pseudo-librairie sur 256 caractères du coup ? Après comment je créé mon Str, je vais devoir reconvertir dans les 8 blocs disponibles afin de pouvoir y voir quelque chose et du coup on est à la case départ... Y'a forcément un intérêt quelque part mais j'ai du louper un truc.
Je comprends à peu près le concept de ce que tu me conseilles mais là j'ai l'impression que c'est du code trop violent pour moi (qui est un débutant oklm), mais je peux tenter de bouffer et voir si je vomis le tout après ou si j'arrive à digérer :x
En tout cas merci de m'aider, encore une fois ce n'est pas du tout anodin quand je vois qu'un niveau est obligé de tenir dans près de 5000 octets, optimiser la place c'est pas rien quand on voit comment Casio nous met (sans la moindre forme de pression) des puces datant de la seconde guerre mondiale dans ses caltos. Après, c'est cohérent avec le proco aussi puissant que celui d'une Game Boy mais enfin bon ce sont les limites de ce genre de machines qui créent la magie de la création foireuse de jeux dessus ^^'
Bon go dodo, parce que là j'vais m'endormir sur mon bureau.
Citer : Posté le 01/02/2016 13:18 | #
Ahah non ce n'est pas compliqué en fait, c'est juste que j'ai voulu aller trop vite sans écrire d'exemple. Ca ne touche en rien la façon dont la calculatrice encode les informations, ça n'utilise que des fonctions que tu maîtrises visiblement déjà.
Avant tout je vais repréciser le but de la manip' car ça ne semble pas être limpide. Le but ici est de "compresser" les niveaux en mémoire pour que ton programme pèse moins lourd et donc que tu puisses potentiellement mettre plus de maps. Il faut bien comprendre que l'on ne peut pas jouer en direct un niveau "compressé" car la calculatrice n'a pas assez de ressources pour le permettre. En revanche, au début d'un niveau ou d'un monde comportant plusieurs niveaux, on peut imaginer un temps de chargement qui va venir décompresser les maps.
Bien. Maintenant place à la technique.
Prenons le cas où tu as 15 blocs différents possibles, plus le bloc vide. C'est à dire que dans tes matrices actuelles tu as des valeurs comprises entre 0 et 15. Alors tu peux les convertir en binaire sur 4 bits. Par exemple la case 13 deviendra le mot binaire 1101. Jusqu'ici ça va ? Si tu transformes toutes tes cases de cette façon tu obtiendras une matrice remplie de mots binaires de 4 bits. Imaginons qu'à droite de la case comportant la valeur 13 nous avons une case de valeur 5. Le mot correspondant à cette case est 0101. Si je récapitule jusqu'à présent, [13][5] devient [1101][0101]. Ensuite vient l'agglomération : deux cases successives peuvent être agglomérées en un seul mot binaire sur 8 bits, soit 1 octet : ici 11010101. Tu me suis toujours ?
Si à présent on transforme cet octet en base 10, on obtient par définition un nombre décimal compris entre 0 et 255. Dans notre exemple on obtient 213. Si on reprend l'idée du dictionnaire comportant 256 caractères différents, ça veut dire que tu peux remplacer tes deux cases par le caractère unique d'index 213.
Tout ce que je viens de décrire est le processus de compression, c'est à dire qu'après ça tu peux écrire en dur dans tes programmes des chaines de caractères qui sont beaucoup plus compactes et légères que tes matrices. Au moment de jouer, il suffit de faire exactement le script inverse, qui va reconstruire à partir d'une série de caractères un matrice complète.
Est-ce que c'est plus clair ?
EDIT :
Au sujet du dictionnaire, je l'ai mis entre guillemet car ce n'en est pas vraiment un. En fait il s'agit juste de remplir une Str avec 256 caractères différents. En compression il faudra simplement utiliser la fonction qui permet d'extraire le caractère d'index i (cet index est connu, c'est le nombre décimal obtenu à la fin), et en décompression c'est l'inverse : on connait le caractère, et grâce à la fonction de recherche dans une Str on récupère l'index puis on le trifouille jusqu'à récupérer les valeurs des 2 cases.
EDIT 2 :
J'ai pensé à une autre technique qui pourrait te rapporter très gros en terme d'économie d'espace. J'avais fait un programme qui faisait rentrer 30 matrices en une, la seule contrainte étant que les valeurs des cases soient comprises entre 0 et 9. Bien sûr on peut adapter le petit algo pour qu'il fasse rentrer 15 matrices en une seul, avec des valeurs comportant 2 digits (entre 0 et 99).
En fait l'astuce est toute bête. Voici un exemple hyper simple pour lequel je fais rentrer 4 matrices de valeurs à 1 digit dans une seule.
matrice 1 :
1 7
3 4
matrice 2 :
2 5
6 3
matrice 3 :
7 9
5 6
matrice 4 :
9 7
1 2
matrice "optimisée" :
1279 7597
3652 4362
L'avantage c'est que ça prend exactement le même espace en mémoire, mais que ça comporte les informations de plusieurs matrices, et que les calculs à effectuer sont très simples et donc rapide en terme de temps d'execution.
Tu peux utiliser ça de deux façons :
T'en servir pour la dimension "verticale" de tes matrices. De cette façon tu n'auras plus une matrice de 7 par 155 mais de 1 par 155, tu divises par 7 quasiment le poids.
T'en servir pour compacter plusieurs niveaux dans une seule matrice. Moins tu as d'éléments différents sur ta map, plus tu vas pouvoir mettre de niveaux en une seule matrice (jusqu'à 30 disais-je, si tu n'as pas plus de 9 éléments différents, plus l'élément vide).
Combiner les deux possibilités précédentes...
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 01/02/2016 13:32 | #
Fort, très fort. Du coup les techniques comme celle d'Huffman sont pas très rentable niveau temps d'exécution / facilité à mettre en oeuvre je suppose ?
Citer : Posté le 01/02/2016 13:34 | #
Un topic fort intéressant avec beaucoup d'informations très utiles et en plus, un très bon jeu en perspective, j'ai hâte de voir ça sortir parce que là, ça tient du niveau de Ne0' / Rémiweb
Citer : Posté le 01/02/2016 13:48 | #
Je t'aurais bien codé tout ça Epicmario, ça aurait été bien plus simple, mais je suis en Norvège pour 6 mois et je n'ai pas pris ma calculatrice fétiche...
Au fait, si tu veux toujours et encore gagner de la place, tu peux tirer profit des nombres complexes. J'en avais déjà parlé mais je ne retrouve pas où sur le forum. En gros tu peux ajouter le double de digits à une variable sans qu'elle ne soit arrondie par la calculatrice (je ne sais plus si c'est 14 ou 15). Exemple : 123456789012345 + i12345678912345 ne sera pas tronqué. Du coup tu as potentiellement 30 (ou 28 j'ai un trou de mémoire) "cases" dans une variable pour y insérer des valeurs à 1 digit (comprises entre 0 et 9).
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 01/02/2016 19:36 | #
Très intéressant ce que tu racontes Ne0tux.
Par contre attention, une matrice avec un complexe dedans double sa taille. Donc pas d'optimisation de mémoire à ce niveau là
Personnellement, je déconseille les matrices pour stocker des données. C'est lourd avec tous les crochets et les virgules. Ecrire une matrice en brut dans le code prend une place folle :
[[X,X,X...]...[X,X,X...]] les crochets et et les virgules prennent trop de place.
Pour une List c'est pas beaucoup mieux, il y a toujours ces virgules qui prennent de la place pour rien.
Ce que je conseille, c'est d'utiliser les Str pour stocker en dur les infos.
Je vais donner un exemple :
Imaginons que tu ais un monde comme cela :
100103
101111
"400009"->Str 1
"100103"->Str 2
"101111"->Str 3
36 octets au lieu de 44 avec les matrices (C'est pas énorme comme différence, mais l'écart se creuse d'autant que le monde est grand !!)
A première vue, on ne peut stocker que des nombres en 0 et 9. Mais l'astuce consiste à utiliser les lettres alphabétiques.
Pour enregistrer un bloc d'id 12, on utilise la lettre "C".
En effet quand tu vas décompresser ta Str pour la transformer en Matrice, tu vas faire un Exp(...)->Mat A[J] pour chaque caractère.
Si au préalable, on a fait 10->A:11->B:12->C ... alors on récupère la bonne valeur si le programme Exp(...) un "C"
Ce qui peut donner "1000CAA"->Str 1 pour enregistrer les blocs 1, 0, 0, 0, 12, 10, 10
Un autre avantage c'est de pourvoir éviter les redondances. Par exemple une ligne qui comporte 9 fois des 0 d'affillé, on pourrait le coder :
"...Z09..."->Str 1
Le Z caractère spécial qui signifie : attention redondance de 9 fois le bloc 0
Et là je peux te dire tes niveaux vont pas prendre beaucoup de place en mémoire
Citer : Posté le 01/02/2016 20:19 | #
Par contre attention, une matrice avec un complexe dedans double sa taille. Donc pas d'optimisation de mémoire à ce niveau là
Oui tout à fait, je pensais l'avoir écrit mais je l'ai omis, tu as raison de le préciser. Par contre, entre avoir deux matrices de même taille et une matrice avec des complexes je préfère la seconde solution si c'est de la compression. Je n'ai pas ma calculatrice pour vérifier si le poids des deux solutions sont égaux ou s'il y a une maigre différence.
Personnellement, je déconseille les matrices pour stocker des données. C'est lourd avec tous les crochets et les virgules. Ecrire une matrice en brut dans le code prend une place folle
C'est tout à fait vrai mais si le jeu vient au format .g2r (c.a.d que la matrice n'est pas codée en dur dans le programme) le poids est nettement plus faible (bien qu'il y ait un risque que l'utilisateur efface la matrice, auquel cas le programme doit être capable d'avertir ce dernier de retransférer la matrice).
36 octets au lieu de 44 avec les matrices
Ca c'est si on le code dans le programme donc, pas si on la transfère directement depuis la mémoire. Encore une fois je n'ai pas ma calculatrice pour voir si pour de grandes dimensions les chaînes de caractère l'emportent quand elles ne sont pas codées en dur dans un programme, comparées aux matrices.
Globalement je suis d'accord que les chaînes de caractères sont plus appropriées lorsqu'il s'agit de coder des niveaux, c'est d'ailleurs ce que j'utilise, mais on notera un inconvénient qui peut avoir son importance : les fonctions de manipulation des chaînes sont lentes, donc si on a beaucoup de traitements à faire sur ces données ou si le jeu nécessite un temps d'accès rapide à ces dernières, je pense (toujours soumis à réserve de vérification), qu'il est préférable d'utiliser des matrices.
Un autre avantage c'est de pourvoir éviter les redondances. Par exemple une ligne qui comporte 11 fois des 0 d'affillé, on pourrait le coder :
"...Z09..."→Str 1
Le Z caractère spécial qui signifie : attention redondance de 9 fois le bloc 0
Et là je peux te dire tes niveaux vont pas prendre beaucoup de place en mémoire
J'avais commencé à rédiger un message pour expliquer cette méthode là aussi que j'aime beaucoup, mais comme les précédentes, ça dépend de la nature des données qu'il a à sauvegarder. S'il n'a aucune redondance il ne gagnera pas de place en mémoire, au contraire. Sinon effectivement le gain sera énorme !
En fait, à chaque structure de données sa compression. Personnellement c'est ce qui m'a toujours plu quand je sortais ma calculatrice, et j'ai beaucoup de projets qui ne vont pas plus loin que l’architecture et la représentation mémoire des données que je prévoyais d'utiliser, ce qui est... tout à fait ridicule.
Ajouté le 01/02/2016 à 20:28 :
J'ai eu récemment des cours de cybernétique en Norvège qui m'ont fait penser à de nouvelles méthodes pour économiser de la place. On vient de voir ce que l'on appelle les "DH conventions", qui permettent de représenter une position relativeà une autre dans l'espace avec seulement 4 paramètres (au lieu de 6 !). Du coup je me dis que si on arrive à créer une structure de données qui a des conventions semblables on peut peut-être arriver à quelquechose. Certes il y a des limitations pour que ça fonctionne, mais c'est toujours le même discours, pour peu que les données rentrent dans ces limitations ça fonctionnera, ou même, on peut probablement trouver des conventions différentes pour que ça "colle" avec les données. C'est à la mode de mélanger les sciences en ce moment, et parfois il en sort des choses intéressantes alors c'est peut-être une impasse mais je vais y regarder de plus près.
EDIT :
Au sujet de la comparaison Mat VS Str, est-ce que quelqu'un pourrait nous communiquer le poids d'une matrice 1*9 remplie avec le nombre "12345678901234 + i12345678901234" et le poids d'une chaîne de caractère remplie avec 234 caractères ?
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 01/02/2016 20:39 | #
C'est incroyable le nombre de techniques efficaces et possibles pour optimiser de la mémoire que vous arrivez à trouver même tant de temps après la sortie de ce langage Ce serait bien si d'autres anciens revenaient un peu sur le site pour en débattre, ça fait un sujet de conversation sympathique et utile
Citer : Posté le 01/02/2016 20:54 | #
Je confirme tout ce qu'à dit Ninestars !
J'utilise les Str pour stocker mes niveaux de Mario et ça prend beaucoup moins de place. De plus une fois que l'on à compris comment les exploiter (changer ce qu'on veut dedans), on peut faire tout ce qu'on veut !
Un beat them all pour les CPC 19
Un jeu de Tank multijoueur en version graphique
Un jeu de boxe rigolo
Le moteur de combat épique d'un RPG
soccer physics : Un jeu de foot totalement wtf !
Survie 1 & 2 te laisseras-tu attraper par la méchante IA ?
Séquestrez les tous avec Catch'em all !
Joué à la calcultarice et pécher ? Facile !
Battle un système de combat dément !!
Débombe pas tout à fait un démineur
Mon mario pour le concours des 10 ans de PC
Casio jump un doodle jump pas comme les autres !
Rush four your life : tu cours ou tu meurs
Cookie clicker ! More cookies MOOORE !
Move et esquive : bouge pour esquiver les ennemis !
Guitar Hero !! Let's rock !
INVASION : Au secours on se fait envahir !
Un devine nombre entièrement customisable (mon 1er jeu)
Un outil pour dessiner des sprites en super drawstat et qui vous le compile pour vous donner un code utilisable dans vos programmes
Un super programme de dessin bourré de trucs funcs
Sortir une version finale de Tankasio
Bien m'améliorer en C parce que pour l'instant c'est pas jojo
Une ou plusieurs idées qui mûrissent petit à petit
Citer : Posté le 01/02/2016 21:23 | #
Tiens je viens de penser à une autre technique , prenons comme exemple
1 2 2 1 3 1 1 2
2 4 3 3 3 3 1 1
2 2 2 1 1 3 1 1
Et bien là, on peux compresser chaque ID séparément en binaire de cette manière
ID 1 : 10010110, 00000011, 00011011
ID 2 : 01100001, 10000000, 11100000
ID 3 : 00001000, 00111100, 00000100
ID 4 : 00000000, 01000000, 00000000
Ce qui nous donne reconverti en décimal :
ID 1 : 150, 3, 27
ID 2 : 97, 128, 224
ID 3 : 8, 60, 4
ID 4 : 0, 64, 0
Ensuite, on passe par le "dictionnaire" des 256 valeurs et obtiendrais seulement un caractère par ligne de cette manière, et on pourra ensuite tout coller dans une Str, ce qui nous ramènera à :
Une Matrice 4*8 -> Str de 12 caractères ! (Contre 24 avec l'autre technique)
Bien sur il faut couper les lignes si elles dépassent 8 cases car sinon ça pourra dépasser une valeurs de 256 lors de la compression binaire, mais si la largeur et la hauteur sont connues, ça passe .
Bon après je sais pas trop ce que ça donnerais pour plus d'ID ou plus de lignes/colonnes ...
Pourras-tu survivre plus de 20 secondes dans ce fameux tunnel appelé Graviton
Rebondis entre les murs en évitant les piques dans SpikeBird
Pourras-tu éviter de te faire écraser dans FallBlocs (élu Jeu Du Mois)
La version 2048 tactile amélioré au plus haut point : 2048 Delux !
Pars à la recherche des morceaux d'étoile dans Lumyce (élu Jeu Du Mois)
Citer : Posté le 01/02/2016 22:00 | #
Ca c'est si on le code dans le programme donc, pas si on la transfère directement depuis la mémoire. Encore une fois je n'ai pas ma calculatrice pour voir si pour de grandes dimensions les chaînes de caractère l'emportent quand elles ne sont pas codées en dur dans un programme, comparées aux matrices.
Pour les Str , de base 24 octets puis 1 octet par caractère sauf pour certain caractère type List, Mat, Im, Arg... qui pèsent 2 octets
Pour une Matrice, de base 36 octets de base, puis 12 octets par cellule, peut importe ce qu'elle contient, sauf si elle contient un seul ou plus imaginaire et dans ce cas chaque cellule pèse 24 octets
Ceci, c'est le poids des Str et matrices quand elles sont stockées dans la mémoire.
Le poids qu'elle pèsent écrit en dur dans un programme est différent.
Pour une Str, c'est sensiblement la même chose, 1 octet par caractère (en général), les guillemets, puis le ->Str X.
Pour une matrice, il y a les crochets, puis les valeurs, puis les virgules, puis le ->Mat X
Donc avec la virgule, une matrice écrit en dur pèse au minimum 2 fois plus qu'une Str
S'il n'a aucune redondance il ne gagnera pas de place en mémoire, au contraire.
En fait, à chaque structure de données sa compression. Personnellement c'est ce qui m'a toujours plu quand je sortais ma calculatrice, et j'ai beaucoup de projets qui ne vont pas plus loin que l’architecture et la représentation mémoire des données que je prévoyais d'utiliser, ce qui est... tout à fait ridicule.
les fonctions de manipulation des chaînes sont lentes, donc si on a beaucoup de traitements à faire sur ces données ou si le jeu nécessite un temps d'accès rapide à ces dernières, je pense (toujours soumis à réserve de vérification)
Cependant, la solution du changement de base semble être très prométeuse !
D'ailleurs avec un peu de recul, utiliser les lettres en plus des nombres, c'est augmenter la base, passer d'une base 10 à une base 10+26=36. Cela ne serait pas d'ailleurs la solution la plus optimale de monter la base. C'est bien ce qu'on fait un informatique, avec l'héxadécimal non ?
J'ai eu récemment des cours de cybernétique en Norvège qui m'ont fait penser à de nouvelles méthodes pour économiser de la place.
J'ai regardé le lien wiki, bon je n'y comprend pas grand chose, mais ça me fait un peu penser à : tu as une matrice 3x3, donc 9 paramètres, tu la diagonalises 3 valeurs propres + les 3 vecteurs propres. Donc 6 paramètres au lieu de 9.
Je ne vois pas à quoi correspond ID1 ... ID 4Kirafi :/
Citer : Posté le 01/02/2016 22:17 | #
9*, à propos de la diagonalisation, ça marche pas vu que tes 3 vecteurs propres comportent chacun 3 coordonnée
Assez intéressant comme topic, je peux le renommer et le mettre en post-it ?
Citer : Posté le 01/02/2016 22:20 | #
Pour une Matrice, de base 36 octets de base, puis 12 octets par cellule, peut importe ce qu'elle contient, sauf si elle contient un seul ou plus imaginaire et dans ce cas chaque cellule pèse 24 octets
Mettons que l'on veuille sauvegarder 512 chiffres. Avec les Str il nous en faut 2 pour que ça rentre, donc on a de base 2*24=48 octets, plus 2*256*1=512 octets. Donc au total 560 octets.
Si on le fait avec les matrices complexes, on peut mettre 28 chiffres par case. Donc on fait rentrer 512 chiffres dans 19 cases (et même 20 chiffres bonus). Je fais le même calcul que précedemment : 1*36 octets de base, plus 24*19=456. Donc au total 492 octets.
J'ai peut-être omis qqchose mais sinon je viens de montrer qu'avec une matrice tu peux mettre 20 chiffres de plus que 512 qu'avec une Str, pour 68 octets de moins, ce n'est pas rien tout de même ! Et ça marche aussi pour 256 chiffres, on peut en caser 24 de plus pour 4 octets de moins.
Ajouté le 01/02/2016 à 22:25 :
Donc avec la virgule, une matrice écrit en dur pèse au minimum 2 fois plus qu'une Str
Oui oui oui, ça c'est indéniable, la matrice n'est pas chouette en dur, c'est bien ce que je dis aussi.
Ajouté le 01/02/2016 à 22:27 :
Justement je dirais que c'est que bénefique. Si il n'y a pas de redondance, ça ne change rien à ce qui aurait été fait normalement.
Oui tu as raison, je n'avais pas pensé qu'on peut ne faire apparaître Z que lorsqu'il y a redondance, donc effectivement ça ne peut être que bénéfique !
La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Citer : Posté le 01/02/2016 22:40 | #
Après, la solution par string est beaucoup plus intéressante lorsqu'il s'agit de les coller dans un programme pour personnaliser les niveaux (comme dans Arkenstone), puisque ne perdant pas de place à cause des crochets et virgules.
Après (je retrouve plus la quote, passons…) au niveau de la vitesse, les fonctions sur les strings sont bien plus rapides que celles sur les matrices en lecture, et en écriture tout dépend de ce que l'on écrit. J'estime la différence de rapidité à un facteur 3 à 5 sur la lecture. Après, tout va se jouer au niveau des opérations. Écrire une valeur dans une matrice est bien plus rapide que d'écraser un caractère, mais compresser avec la méthode de 9* (10000000001 > "1Z091") reste vachement intéressante, surtout si en plus on optimise au niveau du dictionnaire.
Idée surgie comme ça justement pour améliorer cette méthode : si une map fait 21 caractères de long par ligne, on peut attribuer 19 caractères spéciaux qui serviront à compresser encore plus, indiquant à la suite d'un bloc le nombre de répétition. Exemple avec A = 3, B = 4, etc., mais faut adapter aux blocs déjà existants dans le dico
1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0
0 1 1 1 1 0 2 3 0 1 0 3 2 2 2 2 0 3 1 3
Map semi-encodée selon la méthode de 9*
1 Z09 Z13 Z05 1 0
0 Z14 0 2 3 0 1 0 3 Z24 0 3 1 3
Map encodée via ma méthode
1 9G 1A 0C 1 0
0 1B 0 2 3 0 1 0 3 2C 0 3 1 3
Comparaison :
1Z09Z13Z05100Z140230103Z240313
19G1A0C1001B02301032C0313
C'est pas grand chose, mais on gagne 1 octet à chaque répétition. Donc très efficace sur des répétitions rapides de motifs qui vont de longueur 3 à 5-6.
Ajouté le 01/02/2016 à 22:41 :
Bien entendu, c'est juste pour le stockage des données, ces méthodes sont bien trop lentes pour le jeu en temps réèl.
Après, soit on utilise les strings (comme dans Calcraft), soit les matrices, au choix et selon les besoins du jeu.
Citer : Posté le 01/02/2016 22:48 | #
Ca marche pas vu que tes 3 vecteurs propres comportent chacun 3 coordonnée
Oui oui oui, ça c'est indéniable, la matrice n'est pas chouette en dur, c'est bien ce que je dis aussi.
En effet ton calcul est juste Ne0tux De ce point de vu, les matrices sont moins lourdes que les Str, je ne m'y attendais pas.
Et d'ailleurs on peut rajouter des chiffres dans la puissance de 10, c'est ça ton 20 chiffre bonus ?
Bien vu Dark Storm. Comme vous dites, chaque compression va s'adapter au cas par cas.