#0 

20-07-2010 18:16:16

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Bonjours a tous !

Il y a peut, j'utilisai windows 7 et visual c++, tout allais bien, irrlicht marchait comme je le voulait mais il y a peut je suis passé a linux (ubuntu), mais le résultat est completement différent, afin de vérifier que ça ne venait pas du compilateur (g++), j'ai essayé de porter touts sous le code::block  de windows mais la encore un résultat différent, voici la liste des variantes que j'ai vu .
Visual C++ : tout marche comme je le veut
Code::Block Windows : moins rapide, certaines positions sont décalés, les évents sont un peut détraqués comme si les boutons était appuyé alors qu'il est relaché (il faut appuyer sur le bouton pour que le system comprenne qu'il est relâché), certains problèmes au niveau de l'animation de certains de mes nodes personnalisés
G++ Linux : catastrophique, lenteur incroyable, la lib standarts ne marche pas ou marche différemment en particulier la gestion des fichiers ...

Quelle est la solution a ces problèmes ?

Dernière modification par Ilovechocolat (20-07-2010 18:18:56)

Hors ligne


#1 

20-07-2010 19:53:14

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

pour se qui est de la let=nteur sous linux il y a deux possibiliter: 1 pas les driver graphique ( opengl marche quand même cela dit mais pas d'acceleration ), la second beacoup moin probable est que tu soit en x86_64 et que tu utilise la lib irrlicht précompiler qui est elle en 32 cela dit gcc mais une erreur de linkage en générale, personnelement je boss sur la svn ... aucun soucis

pour se qui est de code::blocks et que se soit moin rapid je présume que tu a compiller irrlicht via vc++ mais que utilise cette lib avec code::blocks, j'ai vue souvent des topics qui parlais de ça, apperement vc++ a ces propre "adressage" quand il compile ... donc a tu recompiller irrlicht avec code::blocks avans de l'utiliser ? enfin cela dit j'ai aussi un probleme sous win7 avec la cameras fps et n'est pas vraiment trouver dous cela viens ... mais la gui semble bien marcher

au pire pour la lib standar tu mais a jours et gcc aussi ... bien que se ne doit être ça

Hors ligne


#2 

21-07-2010 19:23:20

Ilovechocolat
Abonné
Date d'inscription: 07-10-2009
Messages: 125

Merci ça venait bien des drivers de la cartes graphiques, quand a l'autre problème ben voici le code de la fonction qui analyse les fichiers  (a savoir que sous windows, tout marche) :

Code c++ :

void GameEngine::chargerGWD(char* dir)
{
    FILE* fichier = fopen(dir, "r");
    char *p;
    if (fichier != NULL)
    {
        char chaine[200];
        char chaineMapMesh[200];
        char chaineMapTexture[200];
        char chaineMusique[200];
        char chaineCiel[200];
        int nbrPosX, nbrPosY, nbrPosZ, nbrEchelle;
        fgets(chaine, 200, fichier);
        sscanf(chaine, "%s %s %s %s %d %d %d %d\n", &chaineMapMesh, &chaineMapTexture, &chaineMusique, &chaineCiel, &nbrPosX, &nbrPosY, &nbrPosZ, &nbrEchelle);
       
        //scene
        m_sceneEngine->chargerMap(chaineMapMesh, chaineMapTexture, irr::core::vector3df(nbrPosX,nbrPosY,nbrPosZ), nbrEchelle, this);
        m_sceneEngine->changerCiel(chaineCiel, "ressources/images/meteo/soleil.png");
        //son
        m_mediaEngine->deleteAllSound();
        m_mediaEngine->jouerSonBackground(chaineMusique);

        while(fgets(chaine, 200, fichier) != NULL)
        {
            p = strchr(chaine, '\n');
            if (p)
            {
                *p = 0;
            }

            if(strcmp(chaine, "lumm") == 0)
            {
                fgets(chaine, 200, fichier);
                int nbrLummPosX, nbrLummPosY, nbrLummPosZ;
                float nbrLummColor1, nbrLummColor2, nbrLummColor3, nbrLummColor4;
                double nbrLummEchelle;
                sscanf(chaine, "%d %d %d %f %f %f %f %f\n", &nbrLummPosX, &nbrLummPosY, &nbrLummPosZ, &nbrLummColor1, &nbrLummColor2, &nbrLummColor3, &nbrLummColor4, &nbrLummEchelle);
                m_sceneEngine->ajouterLumiereMultidirectionel(irr::core::vector3df(nbrLummPosX,nbrLummPosY,nbrLummPosZ), irr::video::SColorf((irr::f32)nbrLummColor1, (irr::f32)nbrLummColor2, (irr::f32)nbrLummColor3, (irr::f32)nbrLummColor4), nbrLummEchelle);
            }
            else if(strcmp(chaine, "lumd") == 0)
            {
                fgets(chaine, 200, fichier);
                int nbrLumdPosX, nbrLumdPosY, nbrLumdPosZ, nbrLumdRotX, nbrLumdRotY, nbrLumdRotZ;
                float nbrLumdColor1, nbrLumdColor2, nbrLumdColor3, nbrLumdColor4;
                double nbrLumdEchelle;
                sscanf(chaine, "%d %d %d %d %d %d %f %f %f %f %f\n", &nbrLumdPosX, &nbrLumdPosY, &nbrLumdPosZ, &nbrLumdRotX, &nbrLumdRotY, &nbrLumdRotZ, &nbrLumdColor1, &nbrLumdColor2, &nbrLumdColor3, &nbrLumdColor4, &nbrLumdEchelle);
                m_sceneEngine->ajouterLumiereDirectionel(irr::core::vector3df(nbrLumdPosX,nbrLumdPosY,nbrLumdPosZ), irr::core::vector3df(nbrLumdRotX,nbrLumdRotY,nbrLumdRotZ), irr::video::SColorf((irr::f32)nbrLumdColor1, (irr::f32)nbrLumdColor2, (irr::f32)nbrLumdColor3, (irr::f32)nbrLumdColor4), nbrLumdEchelle);
            }
            else if(strcmp(chaine, "obj") == 0)
            {
                fgets(chaine, 200, fichier);
                char chaineObjModeleMesh[200];
                char chaineObjModeleTexture[200];
                int nbrObjPosX, nbrObjPosY, nbrObjPosZ, nbrObjRotX, nbrObjRotY, nbrObjRotZ, nbrObjCollision, nbrObjAnimStart, nbrObjAnimEnd;
                float nbrObjEchelle;
                sscanf(chaine, "%s %s %d %d %d %d %d %d %f %d %d %d\n", &chaineObjModeleMesh, &chaineObjModeleTexture, &nbrObjPosX, &nbrObjPosY, &nbrObjPosZ, &nbrObjRotX, &nbrObjRotY, &nbrObjRotZ, &nbrObjEchelle, &nbrObjCollision, &nbrObjAnimStart, &nbrObjAnimEnd);
                m_sceneEngine->ajouterObjet(chaineObjModeleMesh, chaineObjModeleTexture, irr::core::vector3df(nbrObjPosX,nbrObjPosY,nbrObjPosZ), irr::core::vector3df(nbrObjRotX,nbrObjRotY,nbrObjRotZ), nbrObjEchelle, (map::Collision)nbrObjCollision, nbrObjAnimStart, nbrObjAnimEnd);
            std::cout<<"obj\nobj\nobj\nobj\nobj\nobj\nobj\nobj\nobj\nobj\nobj\n"<<std::endl;
            }
            else if(strcmp(chaine, "event") == 0)
            {
                fgets(chaine, 200, fichier);
                char chaineEventModeleMesh[200];
                char chaineEventModeleTexture[200];
                int nbrEventPosX, nbrEventPosY, nbrEventPosZ, nbrEventRotX, nbrEventRotY, nbrEventRotZ, nbrEventAction;
                sscanf(chaine, "%s %s %d %d %d %d %d %d %d\n", &chaineEventModeleMesh, &chaineEventModeleTexture, &nbrEventPosX, &nbrEventPosY, &nbrEventPosZ, &nbrEventRotX, &nbrEventRotY, &nbrEventRotZ, &nbrEventAction);
                m_sceneEngine->ajouterEvent(chaineEventModeleMesh,chaineEventModeleTexture,irr::core::vector3df(nbrEventPosX,nbrEventPosY,nbrEventPosZ),irr::core::vector3df(nbrEventRotX,nbrEventRotY,nbrEventRotZ), m_pointEventActionTable[nbrEventAction]);
            std::cout<<"event\nevent\nevent\nevent\nevent\nevent\nevent\nevent\nevent\nevent\nevent\n"<<std::endl;
            }
            else if(strcmp(chaine, "liquide") == 0)
            {
                fgets(chaine, 200, fichier);
                int nbrLqdPosX, nbrLqdPosY, nbrLqdPosZ, nbrLqdRotX, nbrLqdRotY, nbrLqdRotZ, nbrLqdWaterHeight, nbrLqdColorBlend;
                float nbrLumdColor1, nbrLumdColor2, nbrLumdColor3, nbrLumdColor4, nbrLqdEchelle;
                sscanf(chaine, "%d %d %d %d %d %d %f %d %f %f %f %f %d\n", &nbrLqdPosX, &nbrLqdPosY, &nbrLqdPosZ, &nbrLqdRotX, &nbrLqdRotY, &nbrLqdRotZ, &nbrLqdEchelle, &nbrLqdWaterHeight, &nbrLumdColor1, &nbrLumdColor2, &nbrLumdColor3, &nbrLumdColor4, &nbrLqdColorBlend);
                m_sceneEngine->ajouterLiquide(irr::core::vector3df(nbrLqdPosX, nbrLqdPosY, nbrLqdPosZ), irr::core::vector3df(nbrLqdRotX, nbrLqdRotY, nbrLqdRotZ), nbrLqdEchelle, nbrLqdWaterHeight, irr::video::SColorf(nbrLumdColor1, nbrLumdColor2, nbrLumdColor3, nbrLumdColor4), nbrLqdColorBlend);
            std::cout<<"liquide\nliquide\nliquide\nliquide\nliquide\nliquide\nliquide\nliquide\n"<<std::endl;
            }
        }
        fclose(fichier);
        //event
        m_receiver->maj();
        m_device->setEventReceiver(m_receiver);
        std::cout<<"le .gwd a été corectement chargé"<<std::endl;
    }
    else
    {
        std::cout<<"le .gwd n'a pas pu être ouvert"<<std::endl;
    }
}


la première partie (avant la boucle) est prise en compte, après ça ne marche plus .

Hors ligne


#3 

21-07-2010 23:15:09

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

oui bon pour commencer il serait bon de laisser de côter la lib C surtout pour les chargement de fichier ( passe par iostream ou par les class irrlicht dans irr::io )
évite également strcmp passe plutôt par une class string pour comparer les chaine ( celle d'irrlicht est très bien irr::stringc je croix )
le mieux reste de passer par une sérialisation qui a fait c'est preuvent, je ne remais pas en question ton code ( quoi que wink ) mais je peut comprendre les problème de lecture des fichiers

exemple: ton buffer = char[200], tu veut lire fgets(chaine,  200, fichier); mais quand tu crée un buffer il faut prendre en compte que la grandeur = size-1 ( il compte le 0 )
autre example: sscanf(chaine,  "%d ... que fait tu s'il y a des erreurs dans le fichier ? il est probable que le fichier ne soit pas entier ou autre et dans certain cas scanf/sscanf fait planter l'app.

donc personelement je te conseil de soit passer par tinyXML ( intégré a irrlicht ) ou faire ton "truc" de sérialisation/désérialisation se que j'ai fait smile
une class string + une class sérialise + une class qui décortique le fichier et une autre pour récupérer les donner dans se qui est décortiquer

dernier truc si cela plante entre win et linux ses due a la différence sur les retoure a la ligne qui ne sont pas écris pareil par l'os, windows prend 2caractère et linux un seul il me semble donc si tu a fait ton fichier sous windows sscanf auras un soucis, bien que tu ne voye pas la différence avec un éditeur enfin j'ai pas trop chercher le pourquoi du comment mais ses quelque chose dans le genre ... dou l'utilité de la sérialisation qui ignore se genre de désagrément wink

Hors ligne


#4 

26-07-2010 20:47:07

Darktib
Membre
Date d'inscription: 20-11-2009
Messages: 11

TinyXML n'est pas intégré à Irrlicht, c'est IrrXML qui est intégré^^

Pour ce qui est des petits déconnages, c'est dû au compilo apparement - chez-moi aussi mes applications fonctionnent mieux lorsqu'elles sont compilées avec Visual C++.

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
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
75 invités en ligne
Aucun membre connecté
RSS Feed