π
<-

[JEU] BOOST sur ta TI (tunnel 3D)

Assembleur, Axe, C/C++, ICE...

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby Plokki » 13 Jun 2015, 18:45

Salut :)
J'ai pas mal avancé et une prochaine grosse update du programme devrait bientôt arriver qui débouchera sur une démo jouable ;)

Rect remplissage.gif

Comme on peut le voir je me suis débrouillé pour me faire un algorithme pour remplir un quadrilatère (les équations de droites m'en ont fait voir de toutes les couleurs :( ) Le clipping n'est pas génial et les performances me paraissent assez faible je voudrais donc un peu d'aide pour l'optimisation.

Actuellement, je calcule pour chaque coordonnée Y de mon rectangle les deux coordonnées X qui correspondent. je relie ensuite mes deux points avec la commande Line( , j'ai aussi testé avec Rect( mais ça n'accélère pas beaucoup. A la place je préférerais modifier directement les bits de la memoire concernés, existe t-il une commande pour modifier un seul bit ?

Autre chose:
C'est la partie du programme du tunnel qui me semble la plus intéressante à optimiser car c'est la plus gourmande en temps (après le traçage des lignes mais ça j'y peux rien).
Code: Select all

For(10)

sign{B}+RAYON→r₁                       //Je récupère la distance du point par rapport au centre de l'arc de cercle

COSθCERCLE*r₁//128+X→XP
SINθCERCLE*r₁//128+Y+16→YP    //Je calcule ses coordonnées X et Y
sign{C}→ZP                                 //Je lui assigne un Z

XP*COSθCAM-(ZP*SINθCAM)//128→r₁ 
XP*SINθCAM+(ZP*COSθCAM)//128→r₂     //J'effectue les rotations

r₁*32//YP+48→{F}                             //Je fais la projection de mon point et je récupère sa coordonnée X
r₂-16*32//YP+48→{F+1}                    //Pareil mais pour la coordonnée Y (le "-16" me permet d'avoir la caméra au sol et pas au milieu que je compense avec "+48" au lieu d'un "+32" pour que ça reste centré sur l'écran

F+2→F
B++
C++
End


Tant que j'y suis c'est quoi le mieux entre F+2→F et F++ F++ ?

Voilà, si quelqu'un pouvait m'optimiser ça ce serait génial :D

[edit] Je viens d'avoir une idée: toutes mes divisions sont par 128 car mes cos sont de -128 à 128. Si je les délimitais de -256 à 256 le gain de vitesse serait plutôt important puisque je n'aurais plus qu'à utiliser le premier octet (même plus besoin de division) ?
[edit2] J'ai rien dis, d'après la commandlist je passe de 23 à 20 cycles :?
You do not have the required permissions to view the files attached to this post.
User avatar
Plokki
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 40.6%
 
Posts: 124
Joined: 02 Sep 2014, 15:15
Location: Près de... ah bah non !
Gender: Male
Calculator(s):
MyCalcs profile
Class: T°S-spé math

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby Lu_Lu54 » 14 Jun 2015, 07:31

matref wrote:Ça n'existe pas, et non ça ne marche pas. L'Axe n'existe sur aucune calculatrice couleur, il faudrait tout refaire en ASM.

ben, qui s'y colle ? :D :D :D
Image

Tu as une TI-nspire cx cas ?
Mes programmes :
certains utiles : CalcTriangles, HowManyDiv, DivEuclid step by step, factorisation de polynômes par la division euclidienne, Dénombrement, TransDioptres step by step
d'autres plus expérimentaux ;) : sommes2dés, DecPi
et encore plus à venir !
User avatar
Lu_Lu54Premium
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 3.4%
 
Posts: 449
Images: 8
Joined: 06 Sep 2014, 14:30
Location: Près de Nancy
Gender: Male
Calculator(s):
MyCalcs profile
Class: 1ère S

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby Plokki » 14 Jun 2015, 11:11

tu pourrais toujours y jouer sur ta ti-83plus mais à 5 fps (ou moins) :/
User avatar
Plokki
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 40.6%
 
Posts: 124
Joined: 02 Sep 2014, 15:15
Location: Près de... ah bah non !
Gender: Male
Calculator(s):
MyCalcs profile
Class: T°S-spé math

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby Lu_Lu54 » 14 Jun 2015, 20:34

j'ai pas de 83 plus, c'est un bug avec le nom "83 premium CE"...
dédi à toi, mon cher Vic ;)
Image

Tu as une TI-nspire cx cas ?
Mes programmes :
certains utiles : CalcTriangles, HowManyDiv, DivEuclid step by step, factorisation de polynômes par la division euclidienne, Dénombrement, TransDioptres step by step
d'autres plus expérimentaux ;) : sommes2dés, DecPi
et encore plus à venir !
User avatar
Lu_Lu54Premium
Niveau 13: CU (Calculateur Universel)
Niveau 13: CU (Calculateur Universel)
Level up: 3.4%
 
Posts: 449
Images: 8
Joined: 06 Sep 2014, 14:30
Location: Près de Nancy
Gender: Male
Calculator(s):
MyCalcs profile
Class: 1ère S

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby TheMachine02 » 15 Jun 2015, 10:03

Wish granted. Pas sûr que ça boost les fps énormément, mais bon :p J'ai pas encore testé par ailleurs donc faut voire si ça marche ><

Code: Select all
Y+16→Y
B--
C
#ExprOn                                       // si tu l'as pas mis
For(10)r                                       //et oui, rajouter un petit r (celui de radian) ne change pas la taille, mais augmente la vitesse (uniquement si tu loop moins de 256 fois)

sign{}→ZP                                 //Je lui assigne un Z  [ C est dans hl ]
sign{B++}+RAYON                       //Je récupère la distance du point par rapport au centre de l'arc de cercle

Select(,*SINθCERCLE//128+Y→YP)    //Je calcule ses coordonnées X et Y, select trick, voir plus bas. Equivalent de push hl \ calcul \ pop hl
*COSθCERCLE//128+X

Select(,*COSθCAM-(ZP*SINθCAM)//128→r₁ )
*SINθCAM+(ZP*COSθCAM)//128-16→r₂     //J'effectue les rotations

.r₁*32//YP+48→{F}                             //Je fais la projection de mon point et je récupère sa coordonnée X
.r₂-16*32//YP+48→{F+1}                    //Pareil mais pour la coordonnée Y (le "-16" me permet d'avoir la caméra au sol et pas au milieu que je compense avec "+48" au lieu d'un "+32" pour que ça reste centré sur l'écran

32*256/YP                                          // à vérifier que ça accélère vraiment  (normalement oui)
Select(,*r₁//256+48→{F} )                  // select renvoie toujours le premier paramètre dans hl
*r₂//256+48→{F+1}                            //→{x} renvoie x dans hl
+1→F

C++
End
Y-16→Y


Par ailleurs, à propos du filling, utilise plutôt HLine(Y,X1,X2) plutôt que line ou rect. Les perf seront déjà meilleurs.
Après j'ai des routines pour remplir des triangles, et donc par extension des quadri, mais je sais pas si les perf seront meilleurs
User avatar
TheMachine02Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 30%
 
Posts: 342
Images: 0
Joined: 16 Jan 2013, 18:27
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: Médecine

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby pierrotdu18 » 15 Jun 2015, 10:07

Plokki :

Code: Select all
void drawLine(int x1, int y1, int x2, int y2, unsigned short c)
{
   int dx = abs(x2-x1);
   int dy = abs(y2-y1);
   int sx = (x1 < x2)?1:-1;
   int sy = (y1 < y2)?1:-1;
   int err = dx-dy;
   int e2;

   while (!(x1 == x2 && y1 == y2))
   {
      setPixel(x1,y1,c);
      e2 = 2*err;
      if (e2 > -dy)
      {      
         err = err - dy;
         x1 = x1 + sx;
      }
      if (e2 < dx)
      {      
         err = err + dx;
         y1 = y1 + sy;
      }
   }
}


Super rapide pour faire un segment... c'est du C plus qu'à réadapter ? (je sais pas si c'est avec ça que tu galères mais je vois sur ton gif que tes segments sont un peu caca donc au cas où ^^)
Bonjour
User avatar
pierrotdu18Premium
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 40.5%
 
Posts: 975
Joined: 07 Nov 2013, 20:18
Location: Paris V
Gender: Male
Calculator(s):
MyCalcs profile
Class: MP* Lycée Henri IV

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby TheMachine02 » 15 Jun 2015, 10:11

D'abord c'est pas mon gif, et après cet algo est plus lent à faire en axe qu'en asm, et je suis pas sûr qu'il veuille en faire :p
User avatar
TheMachine02Modo
Niveau 16: CC2 (Commandeur des Calculatrices)
Niveau 16: CC2 (Commandeur des Calculatrices)
Level up: 30%
 
Posts: 342
Images: 0
Joined: 16 Jan 2013, 18:27
Gender: Not specified
Calculator(s):
MyCalcs profile
Class: Médecine

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby pierrotdu18 » 15 Jun 2015, 10:12

Youps je corrige
Bonjour
User avatar
pierrotdu18Premium
Niveau 15: CC (Chevalier des Calculatrices)
Niveau 15: CC (Chevalier des Calculatrices)
Level up: 40.5%
 
Posts: 975
Joined: 07 Nov 2013, 20:18
Location: Paris V
Gender: Male
Calculator(s):
MyCalcs profile
Class: MP* Lycée Henri IV

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby Plokki » 15 Jun 2015, 19:12

Pierrotdu18> Ton algo à l'air plus simple que le mien et peut être plus rapide je regarderais plus en détail comment ça marche ;)
Mais il ne suffit pas de relier les deux points de ma ligne pour que ça marche: il doivent être reliés obligatoirement du haut vers le bas, pour chaque côté de mon rectangle tout en enregistrant la coordonnée y, de plus je dois trier mes 4 points dans un ordre préçis (avec 3 cas possibles)
Enfin bref j'ai un truc assez artisanal:

[EDIT 2] Retro pédalage: cet algo ne fonctionne pas pour les cas particuliers cités (il plante juste quoi :D )
Code: Select all
.RECT

Data(0,2,L₁+255ʳ,2,6,L₁+255ʳ,0,4,L₁+256ʳ,4,6,L₁+256ʳ,0,6,L₁+255ʳ,0,2,L₁+256ʳ,2,4,L₁+256ʳ,2,6,L₁+256ʳ,0,2,L₁+255ʳ,2,4,L₁+255ʳ,4,6,L₁+255ʳ,0,6,L₁+256ʳ)→GDB1POLY //Une liste de quel point doit être relié à quel autre, dans quel ordre et à quel pointeur je doit stocker ses coordonnées

//Vous pouvez aller directement à lbl SORT

Fix 5

[appvAXECOS]→GDB1COS 

L₃→°Z1
L₃+2→°Z2
L₃+4→°DX
L₃+6→°DY
L₃+8→°GD
L₃+10→°FPS
L₃+12→°X1
L₃+14→°Y1


0→FPS

16→R
0→θ
10→Z1
48→X1
32→Y1

Lbl REPEAT

Repeat getKey(15)
FPS++
Pxl-On(0,FPS^64)

getKey(2)-getKey(3)+R→R
getKey(1)-getKey(4)+θ→θ
getKey(54)-getKey(48)+Z1→Z1

getKey(52)-getKey(53)+X1→X1
getKey(49)-getKey(50)+Y1→Y1

128-Z1→Z2
θ-Z1→{L₂}
θ+Z1→{L₂+1}
θ-Z2→{L₂+2}
θ+Z2→{L₂+3}

L₂→Z2
L₁→A
For(4)
COS({Z2})*R//128+X1→{A}
SIN({Z2})*R//128+Y1→{A+1}
Z2++
A+2→A
End



Lbl SORT
For(4) //Je trie mes points (1,2,3,4) par ordre de Y croissant
L₁→r₁
For(3)
If sign{r₁+1}>>sign{r₁+3}
Exch(r₁,r₁+2,2)
End
r₁+2→r₁
End
End

If sign{L₁+2}-sign{L₁+4}>>0  //Le x du point 2 doit être inférieur à celui du point 3
Exch(L₁+2,L₁+4,2)
End
0→r₆


sign{L₁+2}-sign{L₁}→r₁
sign{L₁+4}-sign{L₁+6}→r₂

If r₁>>0 and (r₂>>0)  //Si le point avec le Y le plus petit et celui avec le Y le plus grand sont du même côté (les deux à droite) j'ai un cas particulier
16→r₆
ElseIf r₁<<0 and (r₂<<0)  //Si ils sont les deux à gauche alors autre cas
32→r₆
End
If r₆
If sign{L₁+2}-sign{L₁+4}>>0  //Selon les situations je dois réinverser les points 2 et 3 lors des cas particuliers pour tracer mes côté dans le bon ordre
Exch(L₁+2,L₁+4,2)
End
End

//mes points ont été triés, j'indique maintenant lesquels devront être relié à partir de la liste de data tout en haut.
r₆+GDB1POLY→r₆→r₅
L₂→r₂
For(8)

{{r₆}+L₁}ʳ→{r₂}ʳ
{{r₆+1}+L₁}ʳ→{r₂+2}ʳ

r₆+4→r₆
r₂+4→r₂
End

//le tracé des lignes (enfin  :'( )
Lbl LINE

L₂→r₆
For(4)
{r₅+2}ʳ→A //le pointeur au niveau duquel je range mes coordonnées
r₅+4→r₅

sign{r₆+2}-sign{r₆}→DX
sign{r₆+3}-sign{r₆+1}→DY

If (DX//DY) //le premier cas où la ligne est plus "horizontale" que "verticale"

DY*sign{r₆}//DX-sign{r₆+1}→P    //le p du Y=Mx+p

DX<<0?⁻1,1
→GD   //Si ma ligne doit être tracée vers la gauche ou la droite

sign{r₆}→r₁ //le x de départ
If DX
For(abs(DX))

r₁*DY//DX-P→r₂  //le Y correspondant
.Pxl-On(r₁,r₂)
r₁→{r₂*2+A}  //Je le stocke
r₁+GD→r₁    //incrémentation du x

End
End

Else   //l'autre cas où la ligne est plus "verticale" que "horizontale"

Exch(°DX,°DY,2) 
sign{r₆+1}→r₁         //J'échange les rôles des x et des y
DY*sign{r₆+1}//DX-sign{r₆}→P

If DX
For(abs(DX))
r₁*DY//DX-P→r₂  //le x en fonction du y
.Pxl-On(r₂,r₁)
r₂→{r₁*2+A}    //que je stocke
r₁++     //j'incrémente le y (toujours de +1 puisque mes lignes sont tracées du haut vers le bas)

End
End

End

r₆+4→r₆  //et hop on passe à la ligne d'après
End

//je peux maintenant remplir mon quadrilatère (et pas parallèlogramme, ce serait trop facile)
sign{L₂+1}*2+L₁+255→B  //l'endroit ou j'ai rangé mes 2 x )
sign{L₂+1}→A    //mon Y de départ
For(abs(sign{L₂+7}-sign{L₂+1}))    //le nombre total de lignes

Line(sign{B}>>0*sign{B},A,sign{B+1},A)    //un truc très moche

B+2→B
A++
End   //arf, c'était long  :)


DispGraphClrDraw
End



Lbl SIN
-64
Lbl COS
sign{^256+GDB1COS}


Voilà je vais essayer d'améliorer cette "chose"

Themachine02> Merci pour l'optimisation, j'ajoute aussi vite que possible ;)
Il y avait des trucs évidents et d'autres moins, j'espère ça accélérera un peu

Au sujet des lignes je pensais faire un truc entièrement manuel au lieu de HLine(Y,X1,X2):

Les points à relier: P1(13;32) et P2(49;32)

Fill(32*96+L6+(13/8),49-13/8,-1)
not(e*(13^8)-1)->{32*96+(13/8)+L6}
e*(49^8)-1->{32*96+(49/8)+L6}
(j'espère ne pas avoir écrit de bêtises)

Mais je sais pas si c'est plus rapide.

[edit] A la base l'algo était pour des triangles mais j'ai adapté pour 4 points pour ne pas devoir calculer 2* un même côté
User avatar
Plokki
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 40.6%
 
Posts: 124
Joined: 02 Sep 2014, 15:15
Location: Près de... ah bah non !
Gender: Male
Calculator(s):
MyCalcs profile
Class: T°S-spé math

Re: [JEU] BOOST sur ta TI (tunnel 3D)

Unread postby Plokki » 20 Jun 2015, 17:43

ça y est mon algorithme est complétement fonctionnel !
Rect remplissage V2.gif

Le clipping fonctionne également (normal vu que HLine le fait tout seul :D ).
Pour les perfs je pense qu'il y a encore du boulot mais je n'ai pas pu résister:
Boost V6.gif

C'est du 15Mhz, faut pas demander l'impossible :p
J'ai intégré tes optimisations Themachine02, il y a un gain de vitesse mais à ce stade il n'est pas incroyable, en tout cas c'est toujours ça de pris ;)

L'objectif est de pouvoir afficher 2 à 3 obstacles à la fois, je pourrais ensuite faire les collisions pour sortir une démo et enfin intégrer les boosts B-)
You do not have the required permissions to view the files attached to this post.
Last edited by Plokki on 20 Jun 2015, 19:23, edited 1 time in total.
User avatar
Plokki
Niveau 8: ER (Espèce Rare: nerd)
Niveau 8: ER (Espèce Rare: nerd)
Level up: 40.6%
 
Posts: 124
Joined: 02 Sep 2014, 15:15
Location: Près de... ah bah non !
Gender: Male
Calculator(s):
MyCalcs profile
Class: T°S-spé math

PreviousNext

Return to Langages alternatifs

Who is online

Users browsing this forum: ClaudeBot [spider] and 2 guests

-
Search
-
Social TI-Planet
-
Featured topics
Comparaisons des meilleurs prix pour acheter sa calculatrice !
"1 calculatrice pour tous", le programme solidaire de Texas Instruments. Reçois gratuitement et sans aucune obligation d'achat, 5 calculatrices couleur programmables en Python à donner aux élèves les plus nécessiteux de ton lycée. Tu peux recevoir au choix 5 TI-82 Advanced Edition Python ou bien 5 TI-83 Premium CE Edition Python.
Enseignant(e), reçois gratuitement 1 exemplaire de test de la TI-82 Advanced Edition Python. À demander d'ici le 31 décembre 2024.
Aidez la communauté à documenter les révisions matérielles en listant vos calculatrices graphiques !
1234
-
Donations / Premium
For more contests, prizes, reviews, helping us pay the server and domains...
Donate
Discover the the advantages of a donor account !
JoinRejoignez the donors and/or premium!les donateurs et/ou premium !


Partner and ad
Notre partenaire Jarrety Calculatrices à acheter chez Calcuso
-
Stats.
1163 utilisateurs:
>1146 invités
>12 membres
>5 robots
Record simultané (sur 6 mois):
6892 utilisateurs (le 07/06/2017)
-
Other interesting websites
Texas Instruments Education
Global | France
 (English / Français)
Banque de programmes TI
ticalc.org
 (English)
La communauté TI-82
tout82.free.fr
 (Français)