tag:blogger.com,1999:blog-34057821.post7869389702763309501..comments2024-03-18T15:48:40.459+01:00Comments on Bilou HomeBrew's Blog: Tout vient d'la cachePypeBroshttp://www.blogger.com/profile/10564522267743689261noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-34057821.post-44330682672758353002016-08-23T15:20:32.693+02:002016-08-23T15:20:32.693+02:00Oui, j'ai fait tourner ça sur DS "phat&qu...Oui, j'ai fait tourner ça sur DS "phat", DS lite et DSi.PypeBroshttps://www.blogger.com/profile/10564522267743689261noreply@blogger.comtag:blogger.com,1999:blog-34057821.post-87317761925266962072016-08-23T15:16:58.160+02:002016-08-23T15:16:58.160+02:00Donc la vram des sprites est mappé dans l'espa...Donc la vram des sprites est mappé dans l'espace CPU en permanance ? possible apres tout. Tu as testé sur un vrai hardware ?Ericnoreply@blogger.comtag:blogger.com,1999:blog-34057821.post-1010472471922192342016-08-23T15:09:10.652+02:002016-08-23T15:09:10.652+02:00" De mémoire, dès qu'on écrit dans la mém..." De mémoire, dès qu'on écrit dans la mémoire vidéo, on doit déconnecter cette mémoire du GPU pour la connecter au CPU et donc TOUJOURS le faire pendant que le GPU n'écrit pas... je me trompe ?"<br /><br />voyons, voyons ... je vais regarder la partie qui anime l'encre, c'est le mieux...<br /><br /><a href="https://sourceforge.net/p/dsgametools/hg/ci/default/tree/libgeds/source/GameObject.cpp#l1579" rel="nofollow">capturer l'emplacement de l'animation en mémoire vidéo</a> (qui est bien <a href="https://sourceforge.net/p/dsgametools/hg/ci/default/tree/libgeds/source/GameScript.cpp#l1295" rel="nofollow">un morceau de SPRITE_GFX</a>),<br /><a href="https://sourceforge.net/p/dsgametools/hg/ci/default/tree/libgeds/source/GameObject.cpp#l1615" rel="nofollow">effectuer la copie</a>, <a href="https://sourceforge.net/p/dsgametools/hg/ci/default/tree/libgeds/source/GuiEngine.cpp#l855" rel="nofollow">fonction principale qui invoque les "Animator::play()"</a>.<br /><br />Non, aucun changement de mapping de la mémoire vidéo en vue. Le seul moment où ce genre de chose est nécessaire sur DS dans le mode vidéo que j'utilise, c'est pour les palettes étendues. <br /><br />"l'ennuie avec le Hash, c'est que la désallocation est un processus complexe (qu'il ma fallu inventer, la littérature n'en parle pas!)"<br /><br />Il y a plusieurs approches "classiques", mais aucune qui soit véritablement satisfaisantes. PypeBroshttps://www.blogger.com/profile/10564522267743689261noreply@blogger.comtag:blogger.com,1999:blog-34057821.post-26016466660457427032016-08-23T14:50:20.593+02:002016-08-23T14:50:20.593+02:00"alloue sur des blocs qui ne sont pas actuell..."alloue sur des blocs qui ne sont pas actuellement présents à l'écran (marqués comme libres), on peut faire la mise à jour de la mémoire vidéo pendant la phase longue où le GPU retrace les pixels à l'écran. Seules les substitutions où on est obligé d'éjecter un bloc utilisé lors de l'image actuellement dessinée devront se faire pendant la phase courte émulant un "retour de balayage".<br /><br />Là, je comprends pas. De mémoire, dès qu'on écrit dans la mémoire vidéo, on doit déconnecter cette mémoire du GPU pour la connecter au CPU et donc TOUJOURS le faire pendant que le GPU n'écrit pas... je me trompe ?<br />Ericnoreply@blogger.comtag:blogger.com,1999:blog-34057821.post-85079232425203155062016-08-23T14:47:44.517+02:002016-08-23T14:47:44.517+02:00Déjà, nous ne sommes pas dans une conversion 16bit...Déjà, nous ne sommes pas dans une conversion 16bits -> 10bits parce que c'est le BLOC (sprite physique) qui est concerné et pas le sprite logique. Des bloc, il peut en avoir des millions (je n'ai pas le format sous les yeux, mais j'ai bien 20 bits minimum), et là, le bitmap devient absolument exclu. Autrement, pour retrouver le bloc, on avait aussi l'arbre équilibré, ou le "move to front" qui sont intéressants.<br /><br />Sur iOS, c'est un 32 bits qui indique l'emplacement du bloc (les sprites peuvent être compressés, ce qui rien la position très aléatoire).<br /><br />l'ennuie avec le Hash, c'est que la désallocation est un processus complexe (qu'il ma fallu inventer, la littérature n'en parle pas!) <br /><br />La table de hash est laissée vide a 20%, ce qui revient généralement a 2 ou 3 "picks" pour retrouver l'adresse.<br /><br />Ericnoreply@blogger.comtag:blogger.com,1999:blog-34057821.post-13091707052891893372016-08-23T14:22:43.157+02:002016-08-23T14:22:43.157+02:00je suis un peu surpris par le choix de l'utili...je suis un peu surpris par le choix de l'utilisation de la fonction hash pour un mapping 16->10 bits, mais j'imagine que ça devient plus compréhensible avec de très gros tilesets (~64K sprites dans Harry Potter) au regard de la taille de la RAM du GBA (256KB).<br />Et effectivement, si on s'autorise une double-liste pour la fréquence d'utilisation, il n'y a plus qu'à aller chercher par un bout les emplacement inutilisés depuis le plus longtemps qu'on a pas ré-inséré à l'autre bout.<br /><br />L'un dans l'autre, l'économie de mémoire réalisée grâce au hash surpasse ce qu'un bitmap aurait fait gagner sur la structure LRU. <br /><br />^_^ Merci pour ces précisionsPypeBroshttps://www.blogger.com/profile/10564522267743689261noreply@blogger.comtag:blogger.com,1999:blog-34057821.post-12954184385150200532016-08-23T12:24:50.489+02:002016-08-23T12:24:50.489+02:00Une fois qu'on a réalisé une gestion "nor...Une fois qu'on a réalisé une gestion "normale" de l'affichage de sprites, il ne restera plus qu'au programmeur "gameplay" d'appeler la fonction :<br />"DisplaySprite(nomdusprite, x, y, prio, angle, zoom);".<br /><br />Pas de fonction de chargement de bloc ni de palette, ni rien d'autre. Ensuite on a aussi une fonction "getRectangle()" et "getPoint()" pour obtenir des infos qu'on a délibérément voulu enregistrer sur le sprite, et qui sont totalement optionnelles.<br /><br />A l'intérieur du moteur nous avons 3 mécanismes:<br /><br />1) le hashage (qui permet de savoir, bloc a bloc avec une vitesse inégalable, si le sprite est déjà chargé et où il se trouve).<br /><br />2) le LRU (LeastRecentUsed) qui chaine tous les blocs et permet de conserver l'ordre d'utilisation, afin de virer les moins récemments utilisés quand la mémoire est pleine.<br /><br />3) un allocateur, qui cherche une place dans la VRAM pour placer le nouveau sprite a charger (si le HASH le donne absent)<br /><br />Donc quand un sprite est appelé, il est décomposé en bloc(s).Pour chaque bloc, le hash retourne son numéro 10bits dans TOUS les cas. Si il n'est pas en mémoire, il appelle lui-même l'allocateur qui trouve une place en mémoire dans TOUS les cas. Si pas de place en mémoire, il désaloue le Moins recement utilisé jusqu'au succès.<br /><br />simple, n'est-ce pas ?<br /><br />Ericnoreply@blogger.comtag:blogger.com,1999:blog-34057821.post-3749072886724474632016-08-18T13:51:02.938+02:002016-08-18T13:51:02.938+02:00Oui, une fois encore, je décris la façon dont je p...Oui, une fois encore, je décris la façon dont je pense pouvoir construire une solution sur base des éléments discutés avec Eric (toi?). L'expérience de faire du code sur des plate-formes moins puissantes qu'une DS a sûrement conduit à faire quelque-chose de plus 'KISS' que ce que j'ai en tête.PypeBroshttps://www.blogger.com/profile/10564522267743689261noreply@blogger.comtag:blogger.com,1999:blog-34057821.post-84481287846933927302016-08-15T00:53:33.158+02:002016-08-15T00:53:33.158+02:00Dans les faits, on n'a jamais eu de moment où ...Dans les faits, on n'a jamais eu de moment où on on avait trop de sprite. Pourtant sur Harry Potter et la coupe de feu, on dépassait les 65000 sprites différents. Par contre le modèle est plus simple que ce qui est écrit...Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-34057821.post-21396780979704598172016-08-06T17:54:43.839+02:002016-08-06T17:54:43.839+02:00Et une extension de desmume capable d'afficher...Et une extension de desmume capable d'afficher en temps réel le contenu de la VRAM, ça serait bien précieux aussi pour la mise au point.PypeBroshttps://www.blogger.com/profile/10564522267743689261noreply@blogger.comtag:blogger.com,1999:blog-34057821.post-10649996695295547242016-08-06T17:47:53.865+02:002016-08-06T17:47:53.865+02:00Bon, par contre, un système pareil demande obligat...Bon, par contre, un système pareil demande obligatoirement un élément de monitoring qui indique combien de "cache miss" il y a pendant qu'on joue si on veut éviter de construire des niveaux avec tellement d'objets différents qu'il commence à y avoir des ralentissement parce qu'on fait plus de mises à jour du cache que prévu.PypeBroshttps://www.blogger.com/profile/10564522267743689261noreply@blogger.com