Amstrad Plus Index du Forum

Amstrad Plus
Découverte de la gamme Old et Plus des Cpc d'Amstrad.

 FAQFAQ   RechercherRechercher   MembresMembres   GroupesGroupes   S’enregistrerS’enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

*****Double Buffering
Aller à la page: 1, 2  >
 
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation
Sujet précédent :: Sujet suivant  
Auteur Message
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Jeu 8 Jan - 19:56 (2015)    Sujet du message: *****Double Buffering Répondre en citant

Le Double Buffering :


Certains d'entre vous en ont souvent parlé, même entendu parlé, mais qu'est-ce que ce double buffering en fait ?
Pour faire court, c'est une technique souvent utilisée par les programmeurs de jeux (voire de démos) qui permet
d'utiliser 2 pages écrans, une physique et une deuxième sur laquelle on travaille pendant qu'on affiche la première.


Mais, ça sert à quoi ?


Eh bien, ça permet d"éviter d'afficher un sprite en plein balayage écran et de voir celui-ci clignoter ou même partiellement affiché. Ca permet aussi d'afficher des sprites plus gros puisqu'on a plus à se soucier du balayage écran. Tous nos sprites 
seront affichés puis éffacés tantôt sur une page, tantôt sur une autre. 
En fait, vous pouvez utiliser cette technique pour tout ce qui touche à l'affichage à l'écran (sprites softs, scrollings soft ou hard... etc)


La routine qu'on peut utiliser est fort simple et je m'en vais vous l'expliquer.


Code:

   ...
   ld bc,#bc0c   ; Selection du Reg 12 du Crtc
swap   ld a,#10      ; #10 -> Ecran en #4000
   out (c),c      ; Select R12
   inc b
   out (c),a      ; Valide avec a
   xor #20      ; 
   ld (swap+1),a
   add a,a      ; a=a x 2
   add a,a      ; a=a x 4
   ld h,a      ; H=#40xx ou #C0xx
   ...



Le principe de cette routine est de switcher entre 2 écrans, un situé en #4000, et l'autre en #C000. Une frame sur 2, on affiche tantôt l'ecran A, tantôt l'écran B.


Ecran A : #4000
Ecran B : #C000


Frame 1 : Ecran A 
Frame 2 : Ecran B
Frame 3 : Ecran A
...etc...


Pour passer de l'écran A, à l'écran B, le Xor #20 fait tout le boulot. A la frame 1, A=#10 donc écran en #4000
Le Xor #20 permet d’auto-modifier la valeur située dans le label swap+1 à chaque frame. On ajoute #20, on enlève #20.
A la frame 2, A=#30 donc l'écran affiché sera celui en #C000. 


Vous avez surement remarqué qu'à la fin de la routine, je multiplie A par 4. Pourquoi donc ?
Prenons pas exemple la frame 1, A=#10. En multipliant par 4, je tombe comme par hasard, sur l'adresse écran #40xx.
Pour la frame 2, A=#30. Je tombe donc sur #C0 en multipliant par 4, donc l'adresse #C0xx. 
Cette petite astuce permet de travailler de suite avec la bonne adresse écran, suivant l'adresse physique déclarée.


J'attends vos questions, vos commentaires...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Publicité






MessagePosté le: Jeu 8 Jan - 19:56 (2015)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
snake_plissken


Hors ligne

Inscrit le: 03 Déc 2014
Messages: 281
Localisation: les pont de cé

MessagePosté le: Mar 26 Juil - 08:48 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Un exemple de l'utilisation du double buffer ?

Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 26 Juil - 09:46 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Bin, je n'ose pas dire que tu l'as au dessus... Tu veux savoir quoi au juste ?
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
snake_plissken


Hors ligne

Inscrit le: 03 Déc 2014
Messages: 281
Localisation: les pont de cé

MessagePosté le: Mar 26 Juil - 10:08 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Ast a écrit:

Bin, je n'ose pas dire que tu l'as au dessus... Tu veux savoir quoi au juste ?
Un exemple de démo qui l'utilise.

Revenir en haut
roudoudou


Hors ligne

Inscrit le: 14 Juil 2016
Messages: 275
Localisation: LYON

MessagePosté le: Mar 26 Juil - 10:29 (2016)    Sujet du message: *****Double Buffering Répondre en citant

snake_plissken a écrit:
Ast a écrit:
Bin, je n'ose pas dire que tu l'as au dessus... Tu veux savoir quoi au juste ?




Un exemple de démo qui l'utilise.





Le source de ma démo AINTRO2 est disponible.
http://www.cpcwiki.eu/forum/programming/aintro2-sources-datas-explanations-old-preview!/


Dans l'exemple d'Ast il manque une chose cruciale, savoir où écrire.


Soit on modifie la routine d'écriture en fonction de l'écran affiché -> Merdique, on perd du temps. Le seul intérêt est qu'on peut mettre ses écrans où on veut (pourquoi #4000/#C000? Faire du flipping en basic?)


Soit on utilise le OUT magique qui redirige les écritures en #4000 vers #C000, ainsi, une seule routine à laquelle on ne touche pas pour tout faire


ld bc,#7FC3
out (c),c


Évite d'écrire en #C000, ça écrira en fait dans la bank 7 au lieu de la bank 3


Alors ton code devient


#7FC0 / #BC0C,#30 -> mémoire normale, tu affiches #C000 pendant que tu effaces et écrit dans le vrai #4000
#7FC3 / #BC0C,#10 -> mémoire remappée, tu affiches #4000 pendant que tu effaces et écrit, toujours en #4000 mais en fait en #C000 avec le remap


Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 26 Juil - 10:37 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Face hugger l'utilisait beaucoup dans ces démos, mais je pense également à l'ami Roudoudou avec son starfield mais pas que...
En fait, cette technique devient nécessaire lorsqu'il y a beaucoup de chose à gérer à l'écran...

On peut également, comme le précise Roudoudou, utiliser le "out magique" Smile
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 26 Juil - 10:39 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Concernant Plissken, je pense qu'il voulait connaître le cheminement :

Ecran 1 connecté.
Sauve décor ecran 2
Affiche Spr ecran 2
Connecte ecran 1
...
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
snake_plissken


Hors ligne

Inscrit le: 03 Déc 2014
Messages: 281
Localisation: les pont de cé

MessagePosté le: Mar 26 Juil - 10:49 (2016)    Sujet du message: *****Double Buffering Répondre en citant

En fait à chaque VBL on change la page d'écran affichée et on prépare la VBL suivante sur la page écran que l'on affiche pas ?

Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 26 Juil - 10:51 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Oui c'est cela. C'est la technique du flip/flop.
On affiche sur la page cachée (ecran2) pendant que l'autre est visible (ecran1)
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
snake_plissken


Hors ligne

Inscrit le: 03 Déc 2014
Messages: 281
Localisation: les pont de cé

MessagePosté le: Mar 26 Juil - 10:58 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Flip/Flop Smile .

Je vais peu être m'en servir de ça,pour un effet soft que j'avais commencé,comme ça je suis sur de ne pas me manger le balayage.


Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Mar 26 Juil - 11:16 (2016)    Sujet du message: *****Double Buffering Répondre en citant

Oui, ça pourrait t'être utile.
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
cmp


Hors ligne

Inscrit le: 08 Sep 2014
Messages: 90
Localisation: nord

MessagePosté le: Mer 10 Mai - 22:49 (2017)    Sujet du message: *****Double Buffering Répondre en citant

Pour info, la cheat part de la paradise demo utilise du flipping Wink
_________________
CMP from impact cpc


Revenir en haut
Skype
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Jeu 22 Juin - 17:57 (2017)    Sujet du message: Suite... Double buffering... Répondre en citant

Pour ceux que ça intéresse, je bosse actuellement sur des routines de double buffering. Je vais donc vous faire profiter du résultat de mes travaux et continuer aussi comme il se doit, l'article que j'avais commencé.

Voici pour ma part, comment je m'y suis pris.
Je travaille sur 3 écrans, un écran de restauration (qui contient le fond), et deux écrans vidéos buffers (flip/flop).

Soyons précis !

- J'ai choisi d'utiliser la banque #C7 (et oui, nous avons accès à 128k (voire plus ?), alors pourquoi ne pas en profiter ?) pour y stocker mon fond soit de #4000-#7fff !

- Le flip/flop (affichage double buffer) s'effectue sur les plages s'étalant de #8000-#bfff pour la page 1 et celle située entre #C000 et #ffff pour la page 2.

Pour passer d'une page à l'autre, veuillez vous référer au début de cet article.

Ce que vous devez savoir :
Code:
ld a,#c0 ; res 7,a -> a=#40
ld a,#c0 ; res 6,a -> a=#80 
ld a,#40 ; set 7,a -> a=#C0





C'est clair pour tout le monde ?

Passons maintenant à la méthode retenue (Je fourni uniquement l'algo pour le moment!)

Code:
oldx0 byte 0 ; x spr page 1
oldy0 byte 0 ; y spr page 1
;
_oldx0 byte 0 ; x spr page 2
_oldy0 byte 0 ; y spr page 2






Pourquoi avoir 2 fois les coordonnées x et y pour le sprite ? J'y viens ! Il y a 2 pages écrans à gérer, celle en #8000 puis celle en #c000.

Le principe est fort simple, et je m'en vais vous expliquer cela de façon assez basique.

Page 1 : Le sprite est affiché en #cxxx
-Lis les coordonnées oldx0,oldy0
-Affiche background (ou restauration du fond, c'est comme vous voulez!)
-Lis x et y
-sauve x,y dans oldx0 et oldy0
- Affiche sprite oldx0, oldy0

Page 2: Le sprite est affiché en #8xxx
-Lis les coordonnées _oldx0,_oldy0
-Affiche background (ou restauration du fond, c'est comme vous voulez!)
-Lis prochain x et y
-sauve x,y dans _oldx0 et _oldy0
- Affiche sprite _oldx0,_oldy0


En voilà déjà assez pour commencer non ?

Ah, vous vous demandez comment passer de la Page 1 à la page 2 ?

Voici la réponse :

Code:
switch ld a,0
          xor 1
          ld (switch+1),a
          jr z,page2
page1 ...
         ret
page2 ...
         ret



_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
roudoudou


Hors ligne

Inscrit le: 14 Juil 2016
Messages: 275
Localisation: LYON

MessagePosté le: Ven 23 Juin - 12:21 (2017)    Sujet du message: *****Double Buffering Répondre en citant

pourquoi tu veux faire des RES ou SET alors que tu pourrais faire ça de façon plus transparente en faisant un flip/flop en #4000 et #C000 et toujours copier de la référence écran #C000 vers #4000 (soit flip, soit flop) ???

Revenir en haut
Ast
Administrateur

En ligne

Inscrit le: 05 Sep 2014
Messages: 2 321

MessagePosté le: Ven 23 Juin - 12:57 (2017)    Sujet du message: *****Double Buffering Répondre en citant

Car je ne sauvegarde pas le fond!
L'image de fond est sauvée en Bank #c7.
J'utilise une sorte de triple bifferont en fait ^^
_________________
Ast/iMP4CT

"Par le pouvoir du crâne ancestral...."


Revenir en haut
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 16:01 (2017)    Sujet du message: *****Double Buffering

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Amstrad Plus Index du Forum -> Bienvenue sur ce forum -> Programmation Toutes les heures sont au format GMT + 1 Heure
Aller à la page: 1, 2  >
Page 1 sur 2

 
Sauter vers:  

Index | Panneau d’administration | Creer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com