Logicielsmoto.com

Nous sommes le 28 Mar 2024, 23:16

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 598 messages ]  Aller à la page Précédente  1 ... 20, 21, 22, 23, 24, 25, 26 ... 40  Suivante
Auteur Message
MessagePosté: 21 Fév 2022, 16:16 
Hors ligne

Inscription: 12 Fév 2021, 15:54
Messages: 78
Localisation: Rennes
On ne pourra jamais dépasser la qualité du scrolling de Blue Star.
Aucun Tearing, 50 fps. Le top.
Et le son, j'en parle même pas : Jean-Michel Jarre s'en serait inspiré me semble-t-il.





:orni:
Si vous voulez me bannir, il faudra rattraper ce canard ...

PS : oui j'ai pété un câble :D

_________________
Fan de Atari 2600, Thomson MO5, Thomson TO8, Atari STE.
Retro-Codeur à mes heures perdues. https://www.fxjavadevblog.fr


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 21 Fév 2022, 18:45 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
:lol:


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 22 Fév 2022, 23:58 
Hors ligne

Inscription: 06 Avr 2010, 01:59
Messages: 478
haha :lol:

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 13:21 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
phpBB [video]


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 13:33 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Si vous voulez essayer sur votre TO8, voici :

Fichier(s) joint(s):
Sonic2.zip [43.59 Kio]
Téléchargé 117 fois

Bouton : permet de faire varier la vitesse de défilement entre 2 et 14 px par pas de 2
Pour le son il faut les cartes de Dino.

- quasiment en full screen (marge de 4px a gauche et droite et 6px env. en haut et bas)
- map de 16384x32768 pixels max soit ... 536 millions de pixels !
- map constituée de blocs de 64x128 px (taille max de la map 256x256 blocs)
- chaque bloc est divisé en 8x8 tiles de 8x16 px. On peut adresser jusqu'a 256 blocs et 5460 tiles différents
- cette démo occupe la RAM jusqu'a la page 8 incluse (donc pas bcp ...)
- 8fps (ouch :lol: )

Il reste encore la gestion de collision et surtout la notion de tiles d'avant plan ...
On peut libérer de la vitesse en réduisant la taille de l'écran, je voulais vous montrer en full screen avant.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 13:44 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Hey, c'est cool ! J'ai testé sur émul, ca marche bien sauf le son qui n'est pas émulé par DCMoto en standard. Il faudrait demander à Daniel d'intégrer cette extension parmi les possibles.

Bon 8fps ca fait un peu saccadé, mais c'est qu'il y a un max de trucs à afficher je suppose. Il n'y a qu'une ligne sur 2 d'affichée pour le fond de sorte à diviser la luminosité par 2, ou est-ce pour des raisons de vitesse ?

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 14:00 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Bien vu Sam !
Oui je n'affiche qu'une ligne sur deux pour des raisons de vitesse.
Sur CRT on ne voit quasiment pas les lignes noires, le rendu est excellent.

Il y a bcp de tiles à l'écran : 260 (20x13).
Je viens dessiner avant $A000 (à partir de $9Bxx,me souviens plus la valeur exacte) et on dépasse $E000, le rendu d'une image compilée ne s'arrête pas une fois lancé ;-) ça permet d'avoir peu de bordures, mais on bouffe des cycles dans le vide ...

Je pense réduire à 18x11 soit 198 tiles, on va libérer ainsi 20000 cycles environ.
Enfin le résultat actuel est déjà inespéré ...


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

Inscription: 06 Avr 2010, 01:59
Messages: 478
hoow ! scrolling multi directionnelle sur TO à la Sonic, mais on ne t'arrête plus :jap:

_________________
Image


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 19:17 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
J'ai fait un petit profiling et suis étonné du résultat.

Près de 27% du temps est passé dans cette routine qui n'a pas l'air de faire de gros calculs:
Fichier(s) joint(s):
zz.png
zz.png [ 38.17 Kio | Vu 3904 fois ]

En fait 90% du temps est passé dans l'attente de $E7E7, c'est à dire la VBL. Il y a là (172507+863428)*10 = 10359350 cycles machine "perdus" sur 814 appels, soit 1272 cycles en moyenne par appel. Je ne sais pas s'il y a moyen de faire passer une partie des calculs utiles juste avant cette attente pour faire quelque chose et attendre moins longtemps.

Petites optims (taille+vitesse):
* Comme tu accèdes souvent aux adresses $74xx, je me demande s'il ne serait pas possible de faire pointer DP sur $74 et gagner un cycle à chaque accès mémoire.
* Le code utilise pas mal de branchements longs quand c'est pas nécessaire. L'assembleur ne propose pas d'optimiser en des sauts courts ? j'ai une macro C dans ugBasic qui génère un code asm optimal:
https://github.com/Samuel-DEVULDER/ugba ... .c#L44-L59
Fichier(s) joint(s):
Image3.png
Image3.png [ 29.41 Kio | Vu 3904 fois ]
Je pense qu'il doit être possible d'en dériver une macro ASM6809 qui ferait pareil.

Autre chose: je vois dans ce code l'incrément d'un compteur 16bits en $744C. Cela utilise l'accu D. C'est bien, mais il y a un double accès mémoire alors que 255 fois sur 256 l'octet mémoire n'est pas modifié. Aussi un simple
Code:
  INC $746C
  BNE SUITE
  INC $746B
SUITE:
  ...
est paradoxalement plus rapide puisqu'il tourne en moyenne à ((7+3)*255+(7+3+7)*1)/256 = 10.02 cycles en moyenne contre 16 systématiquement avec le LDD/ADDD/STD.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 20:16 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Super ton outil de profiling, faut absolument que je me penche dessus.

Oui le code que tu pointes est l'attente VBL, c'est vrai que dans ce cas particulier (ou le framerate est bas) ça ne doit pas servir a grand chose (le changement de page se fait par l'automate au retour du spot en haut de l'écran c'est ça ?).
ça fait un moment que je pense à ajouter du code pour faire sauter cette attente (d'autant que je trace le nombre d'execution d'IRQ justement pour savoir combien de framedrop j'ai ...
Je pourrait ajouter un contrôle : si j'ai plus de 2 appels d'IRQ lors du dernier passage dans ma boucle principale => je zappe l'attente.

Je vais essayer ça ... a mon avis ça va bien booster le tout !

Pour l'incrément du compteur 16 bits merci pour l'astuce je vais regarder ça.
Il s'agit du compteur de frame (tour de boucle principale) que j'utilise pour faire de la temporisation (ex: intro de Sonic)


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 21:24 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Voici une nouvelle version bien plus véloce, on est maintenant à 12fps en moyenne (en déplacement).
J'ai réduit la taille de la fenêtre et appliqué l'optim sur l'attente VBL

phpBB [video]

https://youtu.be/pc_3VAdx0-E


Fichiers joints:
Sonic2.zip [43.43 Kio]
Téléchargé 115 fois
Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 22:04 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Et le profil correspondant à cette nouvelle version: https://www.cjoint.com/doc/22_04/LDevcs ... emmap.html
(La plus grosse boucle est à moins de 20% du temps.)

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 04 Avr 2022, 22:29 
Hors ligne

Inscription: 21 Avr 2019, 21:48
Messages: 433
Localisation: Var
Merci !

Cette fois ci on est sur la routine qui dessine les tiles à partir des groupes de tiles.
Voici le .lst :
Fichier(s) joint(s):
MainEngine.zip [105.04 Kio]
Téléchargé 109 fois


C'est effectivement l'endroit ou il faut optimiser à mort car on boucle énormément la dedans.

On pourrait imaginer que cette routine qui actuellement lit la map, charge les groupes de tiles et les dessine a l'ecran, soit utilisée pour charger un buffer cyclique qui stockerai les références des routines d'affichage pour chaque tile et la position à l'écran.
Les frames suivantes on déplacerai le pointeur de rendu dans ce buffer cyclique et on viendrait compléter les références uniquement sur les nouveau tiles qui apparaissent dans la direction ou l'on se déplace. ça éviterai de redécoder à chaque frame plusieurs blocs de tiles.
J'espère pouvoir gagner au moins 10% avec ça ... et ce serait un bel hommage au moteur de scroll de Sonic qui fonctionne sur ce principe (chargement en VRAM uniquement des tiles dont on a besoin "devant" soi, dans le sens du déplacement.


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Avr 2022, 08:43 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
J'ai regardé le LST, et j'ai vu le code de certaines macros comme celle-ci (mais il y en a d'autres):
Code:
_RunPgSubRoutine MACRO
                      (./Engine/Macros.a):00100                         ; param 1 : ObjID_
                      (./Engine/Macros.a):00101                         ; param 2 : Object data RAM address
                      (./Engine/Macros.a):00102                         ; manual launch of an object from a different dynamic memory page and not from the resident page 1
                      (./Engine/Macros.a):00103                         
                      (./Engine/Macros.a):00104                         ldx   #Obj_Index_Page
                      (./Engine/Macros.a):00105                         ldb   #\1   
                      (./Engine/Macros.a):00106                         abx
                      (./Engine/Macros.a):00107                         lda   ,x                       ; memory page routine
                      (./Engine/Macros.a):00108                         
                      (./Engine/Macros.a):00109                         ldx   #Obj_Index_Address
                      (./Engine/Macros.a):00110                         aslb
                      (./Engine/Macros.a):00111                         abx       
                      (./Engine/Macros.a):00112                         ldu   ,x                       ; address routine
                      (./Engine/Macros.a):00113                         stu   glb_Address       
                      (./Engine/Macros.a):00114                         
                      (./Engine/Macros.a):00115                         ldu   #\2             
                      (./Engine/Macros.a):00116                         jsr   RunPgSubRoutine
                      (./Engine/Macros.a):00117                  ENDM           
comme ObjID est une constante, pourquoi ne fais tu pas ceci ainsi:
Code:
_RunPgSubRoutine MACRO
                     ; param 1 : ObjID_
                     ; param 2 : Object data RAM address
                     ; manual launch of an object from a different dynamic memory page and not from the resident page 1
                      lda   Obj_Index_Page+\1   
                      ldu   Obj_Index_Address+2*\1
                      stu   glb_Address       
                      ldu   #\2             
                      jsr   RunPgSubRoutine
                     ENDM           
C'est à la fois plus court et plus rapide.

_________________
Good morning, that's a nice Tnetennba


Haut
 Profil  
Répondre en citant le message  
MessagePosté: 05 Avr 2022, 08:44 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
J'ai regardé le LST, et j'ai vu le code de certaines macros comme celle-ci (mais il y en a d'autres):
Code:
_RunPgSubRoutine MACRO
                      (./Engine/Macros.a):00100                         ; param 1 : ObjID_
                      (./Engine/Macros.a):00101                         ; param 2 : Object data RAM address
                      (./Engine/Macros.a):00102                         ; manual launch of an object from a different dynamic memory page and not from the resident page 1
                      (./Engine/Macros.a):00103                         
                      (./Engine/Macros.a):00104                         ldx   #Obj_Index_Page
                      (./Engine/Macros.a):00105                         ldb   #\1   
                      (./Engine/Macros.a):00106                         abx
                      (./Engine/Macros.a):00107                         lda   ,x                       ; memory page routine
                      (./Engine/Macros.a):00108                         
                      (./Engine/Macros.a):00109                         ldx   #Obj_Index_Address
                      (./Engine/Macros.a):00110                         aslb
                      (./Engine/Macros.a):00111                         abx       
                      (./Engine/Macros.a):00112                         ldu   ,x                       ; address routine
                      (./Engine/Macros.a):00113                         stu   glb_Address       
                      (./Engine/Macros.a):00114                         
                      (./Engine/Macros.a):00115                         ldu   #\2             
                      (./Engine/Macros.a):00116                         jsr   RunPgSubRoutine
                      (./Engine/Macros.a):00117                  ENDM           
Or, puisque ObjID est une constante, pourquoi ne fais tu pas ceci ainsi (calcul lors de la compilation):
Code:
_RunPgSubRoutine MACRO
                     ; param 1 : ObjID_
                     ; param 2 : Object data RAM address
                     ; manual launch of an object from a different dynamic memory page and not from the resident page 1
                      lda   Obj_Index_Page+\1   
                      ldu   Obj_Index_Address+2*\1
                      stu   glb_Address       
                      ldu   #\2             
                      jsr   RunPgSubRoutine
                   ENDM           
C'est à la fois plus court et plus rapide.

_________________
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 ... 20, 21, 22, 23, 24, 25, 26 ... 40  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 24 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