Logicielsmoto.com

Nous sommes le 29 Mar 2024, 00:19

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 598 messages ]  Aller à la page Précédente  1 ... 33, 34, 35, 36, 37, 38, 39, 40  Suivante
Auteur Message
MessagePosté: 07 Nov 2022, 17:30 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
je positionne un point d'arrêt en $6100, puis j'appuie du le pad directionnel à droite, ensuite je note le nb de cycles entre chaque point d'arrêt en $61DB (boucle principale).
ça me permet de comparer précisément le nb de cycles depuis le départ.

Ce qui vient perturber le relevé c'est l'IRQ qui joue la musique.
Tu peux désactiver la partie lecture audio ici en plaçant un jmp au lieu du jsr sur IRQSecond :

Code:
UserIRQ_Pal_ObjSmps
        jsr   PalCycling
        jsr   IrqSecond ; =>         jmp   IrqSecond
        jmp   IrqObjSmps


Ainsi ça bougera moins le nb de cycles dans chaque boucle principale.

Le déplacement du personnage est joué 5 fois par boucle principale pour conserver la vitesse du jeu d'origine en abaissant le framerate des graphismes.
donc quand tu es à 100 000 cycles de boucle principale le personnage se déplace "normalement".
Quand tu es sur un endroit où il y a des tuiles vides, ça va plus vite (env. 85 000 à 90 000 cycles par boucle)
Quand tu rencontres un pont avec un écran rempli de tuiles tu es aux alentours des 114 000 cycles, tu sens que ça ralenti ...

Quand j'ai besoin de faire des traces spécifiques je rebuild theodore, mais l'encapsulation dans retroarch n'est pas pratique ...

Je n'ai pas d'outils avancés pour le debug et le suivi de performance, mais j'ai pas mal d'idées sur le sujet.
Je voudrais faire un build custom de teo pour ajouter des outils de debug spécifiques au moteur de jeu en utilisant : https://github.com/ocornut/imgui
Mais pour ça il faudrait déjà que j'arrive à build teo sur mon windows, j'ai essayé plusieurs fois mais sans succès. Je ne dois pas utiliser les bonnes librairies ...
Si qq a déjà un setup des sdk et autres libs pour le build sur windows je suis preneur ...
Avec le temps les versions des sdk disparraissent où ça devient compliqué de les trouver.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 17:55 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Ah tiens on peut gagner un peu dans la sauvegarde de U lors des "JSR ,X" en utilisant un extended et un immédiat. Ca ne fait que 1 cycle de gain (6+3 vs 5+5).

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 07 Nov 2022, 18:06, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 17:59 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
avec la nouvelle version de TilemapBuffer :

cycles avant cycles après écart
147754 147677 -77
89146 89069 -77
91243 91166 -77
88662 88585 -77
90980 90903 -77
90461 90384 -77
92696 92619 -77
91306 91229 -77
93078 93001 -77
93416 93237 -179 => le scroll débute
93245 93151 -94

C'est toujours bon à prendre !
ps: je ne suis pas allé à un endroit ou l'écran est rempli de tile pour vérifier, il faudrait que je puisse logger le nb de cycles par boucle sur la sortie standard de l'émulateur pour avoir un relevé plus complet


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 18:18 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Mouais, moins de 1%...

D'expérience, quand on commence à gagner si peu, c'est qu'on cherche les optims au mauvais endroit :langue:

Voyons que dit le dernier profile: https://www.cjoint.com/doc/22_11/LKhrk6 ... emmap.html

.. hmmm ... :voyons:

Autour de $83D2, il y a déjà le coup du LDD #0 alors que D est déjà à 0, et il y a aussi un JMP qui serait plus rapide en BRA. L'assembleur a-t-il une optim pour convertir les JMP en BRA quand c'est possible ? (moins gros, plus rapide).

Autour de $75D9, je vois beaucoup d'usage de ABX sur une valeur de X qui n'est utilisé qu'une fois. Si B est positif, il vaut mieux utiliser "INSTR B,X" (1 cycle pour le calcul de l'adresse) que "ABX + INSTR ,X" (3 cycles pour le calcul de l'adresse à cause de l'ABX).

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 18:54 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
De mémoire le $75D9 on en a déjà parlé, il s’agit de l’exécution des objets dont les id vont de 0 à 255.
Ce qui n’est pas optimal c’est de devoir parcourir tous les slots objets a chaque boucle principale pour savoir si l’objet est alloué (premier octet = id) et l’exécuter si c’est le cas.
Mais je n’ai pas trouvé d’algo plus efficace pour le moment


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 19:18 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Cette boucle coûte 3% du temps des "hot spots". Dans B on a un ID (0..255), donc le ABX se justifie (unsigned).

Statistiquement, le profile dit qu'on a fait 13680 tours de boucle cumulés dans cette boucle. Parmi ceux ci, seulement 2154 (16%) affichages ont eu lieu. On voit qu'on tourne souvent pour rien.

Pour aller plus vite, il faudrait mettre les objects actifs dans une liste chainée.

Quand un objet est activé, il est ajouté à la liste, et quand il est désactivé on le retire. Reste à espérer que l'activation/désactivation des objets est centralisée et pas répartie un peu partout.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 19:37 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Ceci dit quand il y aura plus d’objets implémentés les slots seront remplis et le gain risque d’être faible a la cible.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 20:18 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Je ne pige pas un truc dans l'algorithme:
Code:
RunObject                                   *RunObject:
        ldb   id,u                          *    move.b  id(a0),d0   ; get the object's ID
        beq   RunNextObject                 *    beq.s   RunNextObject ; if it's obj00, skip it

        ldx   #Obj_Index_Page
        abx
        lda   ,x                            ; page memoire
        _SetCartPageA                       ; selection de la page en RAM (0000-3FFF)
        aslb                                *    add.w   d0,d0
                                            *    add.w   d0,d0   ; d0 = object ID * 4
        ldx   #Obj_Index_Address            *    movea.l Obj_Index-4(pc,d0.w),a1 ; load the address of the object's code
        abx
        jsr   [,x]                          *    jsr (a1)    ; dynamic call! to one of the the entries in Obj_Index
                                            *    moveq   #0,d0
RunNextObject                               *RunNextObject:
        leau  next_object,u                 *    lea next_object(a0),a0 ; load 0bj address
am_RunNextObject                           
        cmpu  #Object_RAM_End               *    dbf d7,RunObject
        bne   RunObject         
On utilise U comme "indice de boucle". Ok, mais le JSR [,X] modifie U dans mon souvenir. Pourquoi est-ce que ca ne bug pas ?

Une autre idée : si Y n'est pas modifié par le JSR, on peut remplacer U par Y indexé à 0 (bref initiilisé avec End-Object_RAM-Object_RAM) et faire LDB Object_RAM+id,Y. L''intérêt est d'éliminer le CMPU car LEAY positionne le flag Z.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 20:41 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
U est utilisé dans tous les objets comme le pointeur vers les données de l’objet en cours. On accède aux données de l’objet par offset. Ex: lda subtype,u
Il n’est pas du tout modifié dans la routine objet.

Les données des différents objets sont dans un tableau sur lequel on fait donc le leau next_object,u

Là on ne fait pas l’affichage mais l’exécution du code de comportement de l’objet


Dernière édition par Bentoc le 07 Nov 2022, 20:57, édité 2 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 20:47 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Ah oui ok, je comprends ma méprise. J'ai confondu affichage et action. :nanana: :bouffon:

_________________
Good morning, that's a nice Tnetennba


Dernière édition par Samuel Devulder le 07 Nov 2022, 20:53, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 20:51 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
A ce rythme dans qq jours tu va connaître le moteur sur le bout des doigts :D


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 07 Nov 2022, 20:56 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
:jap: Mais j'oublie tout aussi vite. Et d'ailleurs qui êtes-vous, et que fais-je ici, qui suis-je, où cours-je ?
:orni:

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Nov 2022, 14:07 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Question: pourquoi pas STU ,X++ ici au lieu du LEAX à 5 cycles ? (DeleteObject.asm)


Fichiers joints:
image_2022-11-13_140724199.png
image_2022-11-13_140724199.png [ 12.42 Kio | Vu 3204 fois ]

_________________
Good morning, that's a nice Tnetennba
Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Nov 2022, 14:58 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Bien vu, c'est corrigé (ce code date un peu et je ne me suis pas replongé dedans récemment).

J'ai commit de nouveaux objets :
- moniteurs
- plateformes mobiles
- pics
- gestionnaire des spirales (ou rubans)
- ressorts

le code de ces objets n'est pas complet, mais j'affiche déjà les moniteurs, plateformes et pics (je n'ai pas encore paramétré les images des ressorts).
Ils s'instancient et se suppriment automatiquement en fonction des mouvements camera.

Si tu veux t'amuser à implémenter un objet ne te gènes pas, par exemple les mouvements de plateformes ...

Fichier(s) joint(s):
objects.png
objects.png [ 15.14 Kio | Vu 3204 fois ]


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 13 Nov 2022, 16:07 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
oui j'ai vu apparaitre ces curiosités :)

J'ai aussi par accident désactivé le RunObjects, et là.... le jeu speed à mort.

Il faut clairement optimiser cette boucle pour n'itérer que sur les objects actifs car 99% du temps on ne fait rien. J'essaye un truc "simple", mais ca bug pour l'instant et c'est pas une approche assez locale (je touche à trop de fichiers ASM à mon gout).. Je continue à creuser.

Ah aussi une optim qui ne coute rien, pour positionner Z tu fais un ORCC à 3 cycle là ou un CLRA fait quasi pareil en 2.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 598 messages ]  Aller à la page Précédente  1 ... 33, 34, 35, 36, 37, 38, 39, 40  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 45 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Développé par phpBB® Forum Software © phpBB Group
Traduction par phpBB-fr.com