[Tutoriel] Utiliser le Sprite Optimizer
Posté le 19/08/2018 16:39
Ce topic a pour but d'être à la fois la doc et la page de discussion de l'outil.
Ce document peut ne pas être à jour. La référence officielle est le dépôt GitLab
Qu'est-ce que c'est ?
Le
Sprite Optimizer est un outil permettant de générer le code Multi DrawStat optimisé d'une image. Une fois le programme exécuté, il n'y a plus qu'à copier-coller la sortie dans votre éditeur de programme (
BIDE par exemple).
Attention, le programme retourne une solution optimisée, qui peut ne pas être la solution optimale.
En pratique, la solution proposée est souvent très correcte. Si vous pensez pouvoir faire mieux,
n'hésitez pas !
L'outil est librement diffusé sous licence CeCILL 2.1.
Comment l'utiliser ?
Commencez par installer les dépendances puis récupérez l'outil depuis
le dépôt de code.
– Python 3 (n'oubliez pas de cocher l'option « ajouter Python et pip au chemin » sous Windows)
– argparse :
pip install argparse
– bresenham :
pip install bresenham
– pillow :
pip install pillow
Ensuite, le fonctionnement est le suivant (pour Windows, une manip plus simple
est dispo) :
# Affiche le code uniquement
python3 sprite-optimizer image.png
# Affiche la progression, des infos (lignes, temps d'exécution), et le code
python3 sprite-optimizer -pi image.png
# Retourne le code de l'image pour un ViewWindow inversé (origine en bas à gauche)
python3 sprite-optimizer --flip image.png
# Retourne le code avec un offset de (10, 5)
python3 sprite-optmizer --offset 10 5 image.png
# Affiche l'aide intégrée
python3 sprite-optimizer -h
Le programme possède un shebang pour une exécution plus simple sous Linux :
./sprite-optimizer
Par défaut, l'origine des coordonnées
(0, 0) est en haut à gauche. Cela correspond à un
ViewWindow 0, 126, 0, 62, 0, 0. Pour inverser le ViewWindow utilisez l'option
--flip (ou
-f). Pour le décaler, utilisez l'option
--offset (ou
-o).
Options disponibles
usage: sprite-optimizer.py [-h] [-d] [-f] [-i] [-o OFFSET OFFSET] [-p] [-s]
path
Generate the Multi DrawStat code for an image.
positional arguments:
path path of the image to process
optional arguments:
-h, --help show this help message and exit
-d, --draw draw the result into a new file
-f, --flip flip image vertically (for inverted ViewWindow)
-i, --info print informative stats
-o OFFSET OFFSET, --offset OFFSET OFFSET
offset for viewwindow. Default: (0, 0)
-p, --progress print progress info
-s, --show show the result
Exemple de sortie
sprite.png processed in 71 lines (0.622s)
Graph(X,Y)=({16+14T, 7, 11, 5, 17+6T, 14+8T, T, 31, 20-6T, 8+2T, 11+10T, 26-T, 6+6T, 17-6T, 9+T, 7-7T, 27-9T, 29-5T, 4, 4+8T, 26+4T, 2T, 16+5T, 18-T, 28+3T, 23-3T, 13+3T, 11-3T, 6+4T, 7+5T, 15-5T, 22+2T, 22, 16+2T, 12+T, 14-T, 15-2T, 5+T, 2T, 1+T, 29-3T, 25+4T, 21+4T, 19+4T, 25-2T, 6+T, 26-5T, 8+T, 11+T, 25+T, 14+2T, 16-2T, 15-2T, 11+2T, 2T, 2T, 22+3T, 4-3T, 26-4T, 14-4T, 19-2T, 20-7T, 30, 29, 24, 21, 19, 17, 14, 14, 1}, {26-T, 21-11T, 21-10T, 20-9T, 24-8T, 2+T, 11+8T, 11+7T, 15+7T, 14+7T, 25+2T, 13-6T, 23, 11-6T, 11+6T, 6+5T, 27-2T, 21, 15+5T, 22-3T, 7+3T, 28-4T, 28-6T, 13+6T, 25-8T, 14+3T, 13+2T, 8, 10, 6, 24+2T, 20-T, 11-2T, 5+2T, 30-2T, 20+2T, 12+2T, 28-2T, 26+2T, 11+2T, 18+3T, 26-4T, 17-2T, 22+4T, 8-4T, 16+5T, 28-6T, 14+7T, 12+8T, 21-2T, 16-T, 5, 12, 8+2T, 15, 13-T, 27-3T, 22-3T, 14+3T, 2+4T, 17-6T, 25+T, 26, 20, 29, 29, 7, 29, 28, 19, 29})
Pour toute demande d'aide, suggestion ou remarque, vous pouvez commenter ce topic
Fichier joint
Citer : Posté le 02/09/2018 21:56 | #
Je viens de tester, ça marche (bon mon sprite est à 180° en bas a gauche, mais c'est probablement moi qui ai foiré mon ViewWindow)
Citer : Posté le 03/09/2018 07:54 | #
Cf la doc pour ça (--flip)
Tu peux ajouter l'option en modifiant le .bat
Citer : Posté le 25/05/2019 11:06 | #
To draw DarkStorm's sample,
The following settings do not work well.
What settings do I need?
TThetamin ?
TThetamaz ?
TThetaPtch ?
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 25/05/2019 13:08 | #
Hey Sentaro21, ViewWindow 1,127,0,1,63,0 is recommended ViewWindow, I haven't try it but it should work well
Citer : Posté le 25/05/2019 14:19 | # | Fichier joint
Thanks
However this program not work well.
[Fichier joint] SPRITE.g1m
How wrong is it?
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 25/05/2019 14:38 | #
It looks like you've drawn points instead of rendering lines. Did you execute it in the PRGM application and properly set the View-Window with Tmin=0, Tmax=1 and Tstep=1 ?
Citer : Posté le 25/05/2019 14:54 | #
It becomes like this.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 25/05/2019 15:53 | #
I think it's the correct output for the sample program, which obviously does not correspond to the example sprite.
Here's how it works : you pair element of the two lists together, for instance 16-2T with 26-27T, 7-7T with 21-32T, etc. In each pair, the first element is the x axis and the second is the y axis. These two coordinates are evaluated for T=0 and T=1, as these are the values set in the View-Window. The first pair, for instance, draws a line between (16,26) and (14,-1).
You can see that the constant multiplication before T indicates the length of the line along one axis. In the example program, these constants are very large, so the lines must be very long (at least 20 pixels for most of them). This is obviously not the case with the example sprite.
Plus, if you actually run the script on the image, you get something very different which looks much better. I suggest you try this code instead.
Citer : Posté le 26/05/2019 09:11 | #
It works well.
Thanks very much!
And,
Graph(X,Y)= bug of C.Basic was found.
I will fix it.
Ajouté le 26/05/2019 à 14:26 :
Thanks to Lephenixnoir,
The bug fix was completed.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 26/05/2019 14:28 | #
Awesome!
Citer : Posté le 30/05/2019 16:49 | # | Fichier joint
Intrigué par les tentatives de Redeyes d'optimiser l'image ci-dessous, j'ai donné un coup d'oeil au script.
Darks avait laissé des choses très mal optimisées, et le traitement de l'image était beaucoup trop long. J'ai noté ci-dessous les quatre étapes et le temps qu'elles prennent. Je n'ai pas la troisième car j'ai abandonné après 50 minutes.
1» Génération des lignes (rapide - 5 minutes)
2» Élimination des doublons (rapide en théorie - 45 minutes)
3» Élimination des sous-ensembles (très long - ?)
4» Rendu par glouton (rapide - ?)
Total. Très certainement plus de 4/5 heures
J'ai optimisé le script, essentiellement en utilisant des ensembles (arbres binaires ou tables de hachage) partout où c'était approprié. Cela a au passage fusionné les deux premières étapes, et j'ai maintenant les temps suivants :
1» 20 secondes
3» 3 minutes
4» 5 secondes
Total. 3 minutes 25 secondes
L'exemple de Drak prend moins d'une seconde à calculer.
Citer : Posté le 30/05/2019 16:50 | # | Fichier joint
Ci-joint le script modifié, je vais voir pour pousser sur la forge Gitea quand Darks aura migré.
Citer : Posté le 02/06/2019 09:14 | # | Fichier joint
The conversion took almost a day.
Is there a modified script?
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 02/06/2019 10:08 | #
Yes, that was the whole point of Lephenixnoir's previous message
Making the conversion last 3 minutes and 25 seconds rather than a day.
You can get the modified script from the message just above your ♥
Citer : Posté le 02/06/2019 11:39 | #
Thanks.
I used a modified script (6557 bytes) by Lephenixnoir.
But it did not end in a few minutes.
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 02/06/2019 16:20 | #
Hi Sentaro, how long did it take? I measured the time on my computer, which is a Core i3 at about 3.6 GHz, I suppose YMMV.
I'm not sure I can guarantee the execution time on your computer, I just hope it's still significantly faster than the old script.
Ajouté le 02/06/2019 à 16:20 :
Oh wait, did you use the image in my post? It's upscaled x2! The conversion would take a lot longer.
I think this might be the case because your Multi DrawStat output is much larger than mine!
Citer : Posté le 03/06/2019 00:52 | # | Fichier joint
Ah! I'm sorry,I used a large image.
When converted to 44x60, it took only about 7 minutes.(Windows i7 4GHz)
Thanks very much!
Overclocking utilitaire Ftune/Ptune2/Ptune3 est également disponible.
Si vous avez des questions ou un rapport de bogue, n'hésitez pas à me le faire savoir.
Citer : Posté le 03/06/2019 01:54 | #
Excellent! 7 minutes should be pretty decent. It's nice to be able to convert large images like this.
Citer : Posté le 19/02/2022 16:58 | #
Hello !
Quand tu parles de solution optimisée, tu veux dire en temps de dessin ou en place occupée ?
Ajouté le 19/02/2022 à 17:44 :
C'est normal que le sprite mettre 1h à se générer chez moi ?
Citer : Posté le 19/02/2022 17:46 | #
https://www.planet-casio.com/Fr/forums/topic15315-2-tutoriel-utiliser-le-sprite-optimizer.html#165850
Et au passage c'est optimisé au niveau de la vitesse de dessin. En utilisant ce qu'on appelle un le Super DrawStat
(Et de toute façon, vous pouvez pas dire le contraire)
MultipliCasio
RDM Calculs
Back Mirror
A Switch To The Top C
Citer : Posté le 19/02/2022 18:06 | #
https://www.planet-casio.com/Fr/forums/topic15315-2-tutoriel-utiliser-le-sprite-optimizer.html#165850
L'algo de Lephenix a été merge dans le dépôt git non ? Pas besoin d'aller récup le script qu'il donne en pièce jointe après ?
Et au passage c'est optimisé au niveau de la vitesse de dessin. En utilisant ce qu'on appelle un le Super DrawStat
Yes mais pas forcément au niveau de la taille en octets du coup ?