Logicielsmoto.com

Nous sommes le 29 Mar 2024, 00:47

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 52 messages ]  Aller à la page Précédente  1, 2, 3, 4
Auteur Message
 Sujet du message:
MessagePosté: 08 Fév 2013, 21:37 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Ah j'ai découvert un truc marrant à essayer. Dans atruecol.c, remplacer:
Code:
 if (teo.setting.interlaced_video)
{
    odd ^= 1;
    for(j=odd; j<tcol->screen_h; j+=2)
        blit(screen_buffer, screen, 0, j, 0, j, tcol->screen_w, 1);
}
par
Code:
 if (teo.setting.interlaced_video)
{
    set_trans_blender(0, 0, 0, 255/8);
    draw_trans_sprite(screen, screen_buffer, 0, 0);
}

Ca simule un moniteur CRT qui a une rémanence de folie. La durée de la rémanence est liée au 255/8. Plus la valeur est petite, plus la rémanence est longue (128 n'est ni trop longue ni trop courte; 255/8 est vraiment très long).

Il faut vraiment voir ce que ca donne sur TruC80i. C'est vraiment super. Ca rend mieux que l'entrelacement pair/impair actuel.

Bon par contre ca mange un max de cycles CPU (allegro40 est lent, ca doit pouvoir s'optimiser).. Mais ca serait une meilleure solution que l'entrelacement actuel je trouve.

Edit: en fait en utilisant les dirty_cell il y a moyen de travailler par blocks et donc eviter le blending sur les zones qui n'ont pas changées.
Code:
// dans InitGraphic
    blc_buffer = create_bitmap(TO8_GPL_SIZE*2, TO8_CHAR_SIZE*2);
    set_trans_blender(0, 0, 0, 128); // ou 64 pour un effet encore plus prononcé


// dans RefreshScreen
    for (j=0; j<tcol->screen_ch; j++)
    {
        for (i=0; i<tcol->screen_cw; i++)
            if (dirty_cell_row[i])
            {
                int k;
                dirty_cell_row[i]<<=1; // astuce pour passer de 1 à 0 en plusieurs étapes
                for(k=TO8_CHAR_SIZE*2; k--;)         
                    memcpy(blc_buffer->line[k], screen_buffer->line[j*TO8_CHAR_SIZE*2+k]+i*pixel_size*TO8_GPL_SIZE*2, TO8_GPL_SIZE*2*pixel_size);
                draw_trans_sprite(screen, blc_buffer, i*TO8_GPL_SIZE*2, j*TO8_CHAR_SIZE*2);
            }

        /* ligne suivante */
        dirty_cell_row += tcol->screen_cw;
    }


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 09 Fév 2013, 15:02 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
En fait on peut faire super efficace sans même passer par les dirty_cell:
Code:
// dans InitGraphic
    blc_buffer = create_bitmap(tcol->screen_w, tcol->screen_h);
    clear_bitmap(blc_buffer);
    set_trans_blender(0, 0, 0, 128); // ou 64 pour un effet encore plus prononcé


// dans RefreshScreen
   draw_trans_sprite(blc_buffer, screen_buffer, 0, 0);
   blit(blc_buffer, screen, 0, 0, 0, 0, tcol->screen_w, tcol->screen_h);
et voilà. En fait le truc pour gagner des cycles est de minimiser le nombre d'appels en lecture/écriture dans la ram-video. Ici on fait donc draw_trans_sprite() sur un buffer mémoire qui est envoyé en une fois en ram video avec blit(). C'est donc infiniment plus rapide que le blit() ligne paires/impaires d'origine (environ 100x moins d'appels à blit()) et beaucoup plus joli visuellement.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 09 Fév 2013, 19:12 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Ben tu vois, tu devrais te joindre aux développement de Teo. Ce que tu viens de faire, bien sûr, mais d'une façon plus officielle.

... parce que là, je vois bien ce que tu veux dire, mais seulement à peu près ;)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 09 Fév 2013, 19:54 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
bah.. j'ai bricolé à partir des sources que j'avais sous le coude (1.7.7, etc) et de ce que je voyais via le browser de source de sourceforge. Sur le le vieux winXP ca marche super bien ce nouveau mode entrelacé/blendé.

En fin de journée je me suis dit que ca serait bien de tester ca sur la 1.8.1 et sur le windows8. Du coup je m'installe sur le cygwin, mercurial et tout le toutim pour récupérer les sources sur le nouveau PC. ok ca marche j'ai bien le source.

Je tente la compile... (ca passe pas. De toute façon c'est rare qu'un code C compile directement sur une machine ayant un setup autre que celui sur lequel il a été développé. Ici cygwin et pas mingw32; machine 64bits; etc.)

Je comprends que gcc-3 utilise mingw32. Cool. Ca a l'air de marcher impec sauf pour "png.c" qui ne se compile pas bien (png.h non trouvé; ajout de -I/usr/include/ sur la ligne de cmd ==> confusion entre le error.h de teo et le error.h du système; retrait du -I, modif des includes de png.c
Code:
#include </usr/include/png.h>
   #include <zlib.h>
   #include <setjmp.h>
install des lib manquantes: zlib, libpng, ...).. enfin bref, j'en passe et des meilleures.. Tout un tas de problèmes semblent exister autour de png.c; mais au final j'arrive enfin à compiler un exe..
Code:
...
gcc-3 -mno-cygwin -I./include -I../../teo-1.7.6-src/allegro/include -L../../teo-1.7.6-src/allegro  -c -Wall  -O2 -funroll-loops -ffast-math -DFRENCH_LANG -fsigned-char -DUNIX_TOOL -I./include -o obj/mingw32/wprinter.o src/win/wgui/wprinter.c
gcc-3 -mno-cygwin -I./include -I../../teo-1.7.6-src/allegro/include -L../../teo-1.7.6-src/allegro  -c -Wall  -O2 -funroll-loops -ffast-math -DFRENCH_LANG -fsigned-char -DUNIX_TOOL -I./include -o obj/mingw32/wmemo.o src/win/wgui/wmemo.c
windres --include-dir ./include -o obj/mingw32/wdialog.o -i src/win/wdialog.rc
gcc-3 -mno-cygwin -I./include -I../../teo-1.7.6-src/allegro/include -L../../teo-1.7.6-src/allegro  -s -Wl,--subsystem,windows -o teow.exe obj/mingw32/disk.o obj/mingw32/joystick.o obj/mingw32/cass.o obj/mingw32/memo.o obj/mingw32/keyboard.o obj/mingw32/mouse.o obj/mingw32/libsap.o obj/mingw32/pr906xx.o obj/mingw32/pr90582.o obj/mingw32/pr90042.o obj/mingw32/pr90055.o obj/mingw32/printer.o obj/mingw32/error.o obj/mingw32/hardware.o obj/mingw32/image.o obj/mingw32/ini.o obj/mingw32/std.o obj/mingw32/option.o obj/mingw32/to8.o obj/mingw32/dasm6809.o obj/mingw32/mc6809.o obj/mingw32/mc6821.o obj/mingw32/mc6846.o obj/mingw32/acolor8.o obj/mingw32/agfxdrv.o obj/mingw32/amouse.o obj/mingw32/asound.o obj/mingw32/atruecol.o obj/mingw32/ajoyint.o obj/mingw32/amode40.o obj/mingw32/amode80.o obj/mingw32/agui.o obj/mingw32/asetting.o obj/mingw32/adisk.o obj/mingw32/acass.o obj/mingw32/amemo.o obj/mingw32/aprinter.o obj/mingw32/aabout.o obj/mingw32/png.o obj/mingw32/wgui.o obj/mingw32/wkeybint.o obj/mingw32/wmain.o obj/mingw32/wabout.o obj/mingw32/wsetting.o obj/mingw32/wcass.o obj/mingw32/wdisk.o obj/mingw32/wprinter.o obj/mingw32/wmemo.o obj/mingw32/wdialog.o -lalleg  -lshell32 -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lcomctl32 -lole32 -ldinput -lddraw -ldxguid -lwinmm -ldsound -lpng
The optimized mingw32 version has been compiled.

real    0m18.236s
user    0m9.737s
sys     0m8.947s
Youpie! Sauf qu'à l'execution rien ne se passe. Grrrrrrr.... Windows8 n'aime pas TEO1.8.1. Je ne suis même pas capable de compiler un exe qui marche.
Code:
$ gdb ./teow.exe
GNU gdb (GDB) 7.5.50.20120815-cvs (cygwin-special)
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-cygwin".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /cygdrive/c/Users/Samuel DEVULDER/Desktop/Thomson/TEO-1.8.1/teoemulator-code/teow.exe...done.
(gdb) r
Starting program: /cygdrive/c/Users/Samuel DEVULDER/Desktop/Thomson/TEO-1.8.1/teoemulator-code/teow.exe
[New Thread 1184.0x1580]
warning: SHIMVIEW: ShimInfo(Complete)
During startup program exited with code 0xc0000022.
(gdb)


L'erreur 0xC0000022 fait beaucoup parler de gens sur le web, mais personne n'explique ce que ca signifie et je ne vois absolument pas à quoi ca correspond. Ca se produit dès la création d'un nouveau thread. Grrr.. Maudi windows8. C'était mieux avant, na!


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 09 Fév 2013, 20:21 
Hors ligne

Inscription: 27 Juin 2006, 19:44
Messages: 1061
Localisation: France (24)
Samuel Devulder a écrit:
Ca a l'air de marcher impec sauf pour "png.c" qui ne se compile pas bien (png.h non trouvé; ajout de -I/usr/include/ sur la ligne de cmd ==> confusion entre le error.h de teo et le error.h du système; retrait du -I, modif des includes de png.c
Code:
#include </usr/include/png.h>
   #include <zlib.h>
   #include <setjmp.h>
install des lib manquantes: zlib, libpng, ...)..

Pfiou! Je suis nul!

Samuel Devulder a écrit:
L'erreur 0xC0000022 fait beaucoup parler de gens sur le web, mais personne n'explique ce que ca signifie et je ne vois absolument pas à quoi ca correspond. Ca se produit dès la création d'un nouveau thread. Grrr.. Maudi windows8. C'était mieux avant, na!

Base de registres corrompue, peut-être ? : http://answers.yahoo.com/question/index?qid=20090916082355AAvLoTd


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 09 Fév 2013, 21:19 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Citation:
Ben tu vois, tu devrais te joindre aux développement de Teo. Ce que tu viens de faire, bien sûr, mais d'une façon plus officielle.

Comment on fait?
Prehisto a écrit:
Base de registres corrompue, peut-être ? : http://answers.yahoo.com/question/index?qid=20090916082355AAvLoTd

Je ne vois pas trop le rapport. Teo n'utilise pas la base de registre (je crois). Ca me semble être l'explication sortie du chapeau qu'on fait gober aux gens et qui évite de décrire précisément la nature du problème, mais qui leur permet de vendre je ne sais quel soft de nettoyage du PC.

Bon par contre ce qui me rassure c'est que si je copie le teow.exe de la distrib officielle et que je la colle dans le dossier de compile, on a droit à la même erreur.

Si je remplace le teow.exe dans le répertoire d'install officiel par celui que je viens de recompiler (en passant administrateur vive win8 :( ), l'exe se lance presque bien sauf qu'il se plaint ne ne pas trouver cygpng15-15.dll. Encore ce PNG.. mais je pense que je suis sur la bonne voie.

Allez recopie de cygpng15-15.dll dans le dossier d'install... et... test... ah oui il en faut d'autres (cygz1, et plein de cygtruc)... ah ... ca a l'air de faire des trucs.... l'écran change de résolution..

Ah zut: "fichier introuvable system/rom/basic512.rom". D'où sort ce dossier système. Il n'existe pas dans la version installée. Ah oui ok c'est une modif recente (juin) dans hardware.c. Ah je sens que le calvaire touche à sa fin. Recopie de "system" du dossier de compil dans l'installe.. ok ca a l'air de marcher. Dernier test, recopie du dossier d'install sur le bureau... ca marche encore. Recopie du dossier dans le répertoire de compilation: ca ne marche plus.

Bon bref... il semblerait que pour un raison mystérieuse de windows8, le teow.exe compilé ne peut être lancé dans son répertoire de compilation. Si je le copie sur le bureau avec tous les fichiers qui vont bien, l'appli a l'air de vouloir ce lancer. Bon on avance, mais que c'est fastidieux tout cela.

Edit: ah tiens je viens de désinstaller TEO.. et là l'exe se lance dans le dossier de compile depuis l'explorateur windows. Hum... ya un truc.. demain je remets tout ca à neuf et je vais voir si c'est vraiment l'installation qui bloque l’exécution. Bon par contre depuis la console cygwin.. ca ne marche toujours pas. Si j'ouvre un cmd.exe dedans ca marche... bon ben ya un truc incompréhensible lié à cygwin.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message:
MessagePosté: 10 Fév 2013, 14:07 
Hors ligne

Inscription: 21 Aoû 2006, 09:06
Messages: 1802
Localisation: Brest
Citation:
bon ben ya un truc incompréhensible lié à cygwin.

Euréka. J'ai compris. En fait le truc à savoir c'est que windows refuse de voir le fichier alleg40.dll récupéré par "hg" comme une vraie DLL. Il bloque son ouverture. D'où l'erreur 0xC0000022 au lancement. Par contre si on la copie depuis l'explorateur, windows peut enfin l'ouvrir. Ca sent une histoire de protection anti-virus ce truc: on ne charge pas une DLL dont on ne sait pas d'où elle sort.

Quoi qu'il en soit, une fois une copie d'alleg40 sur lui même effectuée, TEOW.exe se lance depuis la console cygwin ou l'explorateur sans aucun problème.

Edit 16h: bon ca y est. J'ai une version 1.8.2 qui tourne sur le windows8 et qui mange moins de temps CPU tout en ayant un mode entrelacé bien plus joli. Voici le diff
Code:
$ hg diff
diff -r f33dcfed49dd src/alleg/atruecol.c
--- a/src/alleg/atruecol.c      Fri Dec 28 16:39:31 2012 +0100
+++ b/src/alleg/atruecol.c      Sun Feb 10 16:05:06 2013 +0100
@@ -92,7 +92,7 @@
 static const struct SCREEN_PARAMS *tcol;
 static int *dirty_cell;
 static int border_color;
-static BITMAP *gpl_buffer, *screen_buffer;
+static BITMAP *gpl_buffer, *screen_buffer, *interlace_buffer;
 static int palette[TO8_NCOLORS+1];
 static int pixel_size;

@@ -390,7 +390,6 @@
 {
     register int i,j;
              int cell_start, *dirty_cell_row = dirty_cell;
-    static int odd = 1;

     if (!graphic_mode)
         return;
@@ -399,9 +398,32 @@

     if (teo.setting.interlaced_video)
     {
-        odd ^= 1;
-        for(j=odd; j<tcol->screen_h; j+=2)
-           blit(screen_buffer, screen, 0, j, 0, j, tcol->screen_w, 1);
+      int blend_done = 0;
+      /* on groupe les dirty rectangles ligne par ligne */
+      for (j=0; j<tcol->screen_ch; j++)
+        {
+         for (i=0; i<tcol->screen_cw; i++)
+           if (dirty_cell_row[i])
+             {
+               cell_start=i;
+               if(!blend_done) {
+                 blend_done = 1;
+                 draw_trans_sprite(interlace_buffer, screen_buffer, 0, 0);
+                 vsync(); // plus fluide ainsi?
+               }
+
+               while ((i<tcol->screen_cw) && dirty_cell_row[i])
+                 dirty_cell_row[i++]<<=2;
+
+               blit(interlace_buffer, screen,
+                    cell_start*TO8_CHAR_SIZE*2, j*TO8_CHAR_SIZE*2,
+                    cell_start*TO8_CHAR_SIZE*2, j*TO8_CHAR_SIZE*2,
+                    (i-cell_start)*TO8_CHAR_SIZE*2, TO8_CHAR_SIZE*2);
+             }
+
+         /* ligne suivante */
+         dirty_cell_row += tcol->screen_cw;
+        }
     }
     else
     {
@@ -515,6 +537,10 @@

     pixel_size = (depth+1)/8;

+    interlace_buffer = create_bitmap(tcol->screen_w, tcol->screen_h);
+    clear_bitmap(interlace_buffer);
+    set_trans_blender(0,0,0,depth>=24?256/3:128); // entrelacement: utiliser 32 au lieu de 256/3 pour un effet encore plus marqu▒
+
     /* objets touch▒s par l'interruption souris (djgpp) */
     LOCK_VARIABLE(screen_buffer);
     LOCK_DATA(screen_buffer, sizeof(BITMAP));
diff -r f33dcfed49dd src/file/png.c
--- a/src/file/png.c    Fri Dec 28 16:39:31 2012 +0100
+++ b/src/file/png.c    Sun Feb 10 16:05:06 2013 +0100
@@ -46,6 +46,7 @@
     #include <stdlib.h>
 #ifndef DJGPP
    #include <png.h>
+   #include <zlib.h>
 #endif
 #endif


Pour voir ce que ca donne sans passer par les problèmes de compilation, ca se passe ici.


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 52 messages ]  Aller à la page Précédente  1, 2, 3, 4

Heures au format UTC + 1 heure


Qui est en ligne

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