#0 

14-12-2008 03:37:29

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

Hello !
comme vous savez ( même s'il n'y a que tmyke en se moment <.< )je fait un petit lecteur video depuis qu'elle  que jours

se pendant je voudrai l'optimiser sur le rendue d'irrlicht
voila donc avens pour rafraichir ma texture je fessais :

Code:

        static int i =0;
        while(++i <3)
                driver->removeTexture(driver->findTexture("movie"));
        driver->addTexture(VImage,"movie");

qui est très lent
donc je voudrai passer pour une méthode qui rafraîchie la texture sans en crée un nouvelle a chaque frame

Code:

        irr::u32 *iBits = (irr::u32*)VImage->lock();
        irr::u32 *tBits = (irr::u32*)VTexture->lock();

        for(irr::u32 i = 0; i < VImage->getImageDataSizeInPixels()/sizeof(irr::u32); i++)
                     tBits[i] = iBits[i];

        VTexture->unlock();
        VImage->unlock();

j'est trouver que quand je divisait par la taille de la variable sa plantait pas bizarre non ?
mais 2 problème sont :
pourquoi sa plante si j'enlève mon "/sizeof(irr::u32)" sa crash <.<
et pourquoi si je le laisse la partie des pixel rafraîchis a une majorité de vert alors que sa devrai être noir neutral   -> screen

euh sinon je risque de me réveiller ver 1h donc attendez pas que je réponde avens wink

Dernière modification par Magun (14-12-2008 03:44:06)

Hors ligne


#1 

14-12-2008 10:03:26

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

pour accéder aux textures en ecriture direct, voici plutôt le genre de code à employer:

Code:

   ITexture *txt = driver->addTexture(dimension2d<s32>(32,32), "texture", ECF_A8R8G8B8);
   
   // récupère le pointeur
   u32 *p = (u32*)txt->lock();
   
   // on va mettre tous les pixel en rouge
   SColor color(255,255,0,0);
   
   // parcours de la zone complète de pixel
   for(u32 j=0; j<txt->getSize().Height; j++)
     for(u32 i=0; i<txt->getSize().Width; i++)
     {
        p[j * txt->getSize().Width + i] = color.color;
     }
   
   // on met le pixel 10,5 en vert
   u32 xpos = 10;
   u32 ypos = 5;
   
   color = SColor(255,0,255,0);
   p[ypos * txt->getSize().Width + xpos] = color.color;
   
   // 
   txt->unlock();

dans le principe voilà comment faire. Ce principe s'applique je pense de la même manière
aux images...
wink


Force et sagesse...

Hors ligne


#2 

14-12-2008 15:24:47

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

bon alors j'est utiliser ta technique ... le fps a légèrement augmenter mais
la "conversion" des pixel n'est pas génial : screen

Code:

        irr::u32 *tBits = (irr::u32*)VTexture->lock();

        for(irr::u32 j=0; j<VTexture->getSize().Height; j++)
         for(irr::u32 i=0; i<VTexture->getSize().Width; i++)
         {
            tBits[j * VTexture->getSize().Width + i] = VImage->getPixel(i,j).color;
         }

        VTexture->unlock();

Hors ligne


#3 

14-12-2008 17:02:59

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

En terme de gain, cela peux sembler effectivement pas génial. Ta texture, au fait, est en VRAM ou en mémoire système ?
Sinon pour l'histoire du pixel pas vraiment à la bonne place,  regarde aussi au niveau du format de ton image (16/32 bits)


Force et sagesse...

Hors ligne


#4 

14-12-2008 19:16:45

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

l'image est au format utiliser pas le driver et j'utilise directx9 donc 32bits et elle crée a partir d'une data ( elle se rafreshie automatiquement via l'option 4 de la fonction ^^,
et ma texture est charger en mémoire système

Hors ligne


#5 

14-12-2008 20:02:29

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Demain, j'aurais peut-être le temps de me pencher sur le soucis. Par contre pourrais-tu poster un petit code complet qui reproduit le problème, même si tu ne peut pas y joindre le media... wink


Force et sagesse...

Hors ligne


#6 

14-12-2008 21:06:22

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

ok pour le code wink
j'est tester en utilisant sa :

Code:

        irr::u32 texturePitch = VTexture->getPitch();
        irr::s32 *tBits = (irr::s32*)VTexture->lock();
            VImage->copyToScaling(
                tBits,
                VTexture->getSize().Width,
                VTexture->getSize().Height,
                VTexture->getColorFormat(),
                texturePitch);
        VTexture->unlock();

sa marche impeccable mais je retourne à 12fps
sinon pour le code je te passe une archive wink
http://immortalgalaxy.free.fr/Download/codes.rar

Hors ligne


#7 

14-12-2008 21:16:24

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

OK, je mate cela dès demain wink


Force et sagesse...

Hors ligne


#8 

14-12-2008 23:05:44

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

merci bien wink
ah tien j'est trouver 2 truc
1-l'utilisation du type A1R5G5B5 pour l'image augmente de 1fps ...
2-si je remet mon ancienne vidéo je passe a 28fps oO c'est déjà plus sympa smile .... donc apparemment faut que je retouche la méthode de rafraîchissement ( refresh() )
    néanmoins la vidéo ne marche que si j'utilise refresh() directement et non resfreshByTime() ...

bon j'est retoucher légèrement ma méthode resfesh()
je suis passer a 29/30 fps avec l'ancienne vidéo
je suis toujours a 16 fps avec la nouvelle vidéo

tu devrais reconnaitre ou c'est situer dans le code wink

Code:

                avcodec_decode_video(videoCodecCtx, Frame, &frame,
                                     packet.data, packet.size);
                if(frame)
                {
                    #if defined SDL_SUPPORT
                    #elif defined IRRLICHT_SUPPORT
                        img_convert((AVPicture *)FrameRGB, PIX_FMT_RGB555,
                        (AVPicture*)Frame, videoCodecCtx->pix_fmt,width,height);
                    #else
                        img_convert((AVPicture *)FrameRGB, PIX_FMT_RGB32,
                        (AVPicture*)Frame, videoCodecCtx->pix_fmt,width,height);
                    #endif
                    nFrm++;
                    if(writeConsol)
                        printf("> FRAME %d\n", nFrm);
                    av_free_packet(&packet);
                }
            }
            else if(packet.stream_index==audioStream)
            {
            }
            else
                av_free_packet(&packet);

Dernière modification par Magun (15-12-2008 02:09:40)

Hors ligne


#9 

15-12-2008 18:44:01

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Bon, j'ai donc essayé ton archive. C'est plutôt bien codé. Par contre c'est fait avec CodeBloc, que je ne connais pas. En l'état, c'est par
défaut la version SDL, tout compile bien, et cela tourne. Lorsque je veut par contre compiler avec Irrlicht, c'est la catha, il y a toute une
partie de la conf du compilateur à adapter à mon système... hmm
Donc, même si j'ai regardé, je n'ai pas pu approfondir pour le moment. Je verrais d'ici avant la fin de la semaine ou à défaut ce WE
pour me plonger dans CB pour essayer de faire tourner tout cela..


Force et sagesse...

Hors ligne


#10 

15-12-2008 19:00:37

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

ok merci;)
j'att avec impatience smile
je continue de voir se que je peut faire de mon coter mais je ne voie pas trop a par optimisée la lecture de la vidéo par ffmpeg, faire la synchronisation vidéo ou attaquer la gestion du sons :p

Hors ligne


#11 

19-12-2008 02:35:13

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 907
Corrections: 2
Site web

bon alors jais du nouveau smile
il semblerais qu'il y avais un problème avec mon ancienne carte graphique que je viens de changer .... résultat l'image est très bien mais je reste a 15fps se pendant l'image est bien fluide contrairement a avens ( serais-ce aussi pars que je viens de faire une nouvelle vidéo ? )
mais il reste qu'elle que soucie notamment sous opengl ou je plafonne à 3fps ... pour une 6600gt sad

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
881 membres
1426 sujets
11116 messages
Dernier membre inscrit: Bidule
16 invités en ligne
Aucun membre connecté
RSS Feed