Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le problème du langage c++.

Impossibilité de redéfinir un type.

    24 juillet 2021 à 11:53:08

    Si tu veux juste de la performance et un code lisible, oublie le C++ moderne et utilise seulement la partie C du langage et génère le code en metaprogrammation. Par contre si l’objectif c’est de se compliquer la vie et d’essayer de faire rentrer au chausse-pied ton idée dans les limites théoriques de la conception foireuse du C++, alors continue tu es sur la bonne voie. Il a fallu attendre C++17 pour avoir if constexpr et on attend toujours les paramètres constexpr pour les fonctions (C++23 avec un peu de chance), à comparer à la toute première version expérimentale de Jai (https://youtu.be/UTqZNujQOlA) qui permet de faire un static_assert que le mec a battu au moins 10 ennemis (oui il fait tourner un jeu complet à la compilation). Aux dernières nouvelles le compilateur de Jai fait 57000 lignes de code et compile entièrement un jeu de 150000 lignes en 1.5 secondes sur un laptop.
    • Partager sur Facebook
    • Partager sur Twitter
      24 juillet 2021 à 13:31:17

      koala01 a écrit:

      HelbaSama a écrit:

      Je trouve pas ça terrible en terme de FPS (90 et 30 c'est pas énorme).

      C'est bien la preuve que tout est relatif, car, jusqu'à il n'y a pas si longtemps, mon écran principal était un 21.4'' qui ne tournait qu'à 60Hz ...

      Et quand je l'ai acheté, le 30Hz était encore largement "dans la norme".

      Après, il n'est pas exclu qu'il soit plus âgé que certains membre du forum, mais quand même :p

      Je ne parlais pas de la fréquence de l'écran , mais auquel le jeu tourne et entre 90/30 FPS, c'est que t'es sur un jeu AAA , pas un jeu indé en 2D ;)

      • Partager sur Facebook
      • Partager sur Twitter
        24 juillet 2021 à 14:33:08

        JadeSalina a écrit:

        Si tu veux juste de la performance et un code lisible, oublie le C++ moderne et utilise seulement la partie C du langage et génère le code en metaprogrammation. Par contre si l’objectif c’est de se compliquer la vie et d’essayer de faire rentrer au chausse-pied ton idée dans les limites théoriques de la conception foireuse du C++, alors continue tu es sur la bonne voie. Il a fallu attendre C++17 pour avoir if constexpr et on attend toujours les paramètres constexpr pour les fonctions (C++23 avec un peu de chance), à comparer à la toute première version expérimentale de Jai (https://youtu.be/UTqZNujQOlA) qui permet de faire un static_assert que le mec a battu au moins 10 ennemis (oui il fait tourner un jeu complet à la compilation). Aux dernières nouvelles le compilateur de Jai fait 57000 lignes de code et compile entièrement un jeu de 150000 lignes en 1.5 secondes sur un laptop.

        Ça à l'air balaise.

        Je vais essayer de faire comme ça un truc à la C plutôt, ça me semble mieux surtout pour une implémentation VULKAN, je crée des composants avec toutes les informations nécessaire pour le rendu (les structures de VULKAN), et des systèmes pour effectuer les rendus.

        EDIT : Au sinon l'autre dev du projet m'a conseillé d'utiliser CRTP, je passe le ou les types à une fonction et je fais un static_cast de manière récursive par exemple si je dois appeler draw, sur plusieurs types de render. (Ou alors changer le render courant et rappeler la fonction pour tout les renderer comme je le fais également pour les scenes)

        Je pense que ça sera moins lourd.

        .

        -
        Edité par OmbreNoire 24 juillet 2021 à 14:49:06

        • Partager sur Facebook
        • Partager sur Twitter
          24 juillet 2021 à 16:31:54

          HelbaSama a écrit:

          Je ne parlais pas de la fréquence de l'écran , mais auquel le jeu tourne et entre 90/30 FPS, c'est que t'es sur un jeu AAA , pas un jeu indé en 2D ;)

          Ben, tu sais, dans le sens où la limite d'une chaine est toujours celle de son maillon le plus faible, si la fréquence de ton écran correspond à la partie la plus faible du tout que compose ton ordinateur, tu pourra danser sur ta tête: tu n'aura jamais qu'un affichage en accord avec la fréquence de ton écran ;)

          Et donc, si nous sommes d'accord sur le fait qu'il faut -- pour les écrans à fréquence fixe -- s'assurer de pouvoir fournir un FPS équivalent à la fréquence de l'écran, se "bloquer" sur un FPS trop en désaccord avec la fréquence de l'écran (par exemple : 90 FPS pour un écran 60Hz) fera perdre  des images calculées qui ne pourront jamais être affichées (un image sur trois, selon mon exemple), ce qui donnera au final un résultat ressenti beaucoup moins fluide que si on s'était "bloqué" sur la fréquence de l'écran

          Au final, il est très bien de pouvoir se dire que "tous les calculs peuvent être exécuter de manière à assurer un FPS minimum de 90, 100 ou 120", mais on en revient toujours au même point: si l'écran ne permet pas d'obtenir de telles fréquences, il faudra "ralentir le processus" (et prendre ce ralentissement en compte) de manière à ce que le nombre d'image affichées par seconde corresponde à la fréquence de l'écran.

          C'est la raison pour laquelle l'information la plus importante à avoir lors des calculs, si l'on veut avoir un affichage "fluide" est sans aucun doute le temps écoulé depuis que le dernier calcul a été exécuté, car il reste malgré tout possible de "retarder" le moment où le calcul "suivant" sera exécuté ;)

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            24 juillet 2021 à 19:31:53

            koala01 a écrit:

            HelbaSama a écrit:

            Je ne parlais pas de la fréquence de l'écran , mais auquel le jeu tourne et entre 90/30 FPS, c'est que t'es sur un jeu AAA , pas un jeu indé en 2D ;)

            Ben, tu sais, dans le sens où la limite d'une chaine est toujours celle de son maillon le plus faible, si la fréquence de ton écran correspond à la partie la plus faible du tout que compose ton ordinateur, tu pourra danser sur ta tête: tu n'aura jamais qu'un affichage en accord avec la fréquence de ton écran ;)

            Oui c'est ce qu'on appelle un goulot d'étranglement , mais cela n'était pas là encore le sens de ma réflexion.
            Je ne répond pas aux reste vu que tu es HS de ce que je voulais dire.

            Je pense pas que tu sois joueurs,  mais pas mal de "benchmark" laisse tourner les FPS au max , donc NVIDIA par exemple peut dire "tel jeux tourne à 200 FPS , même si tu as un écran à 60 ou 144 Hz.

            Bref je parle de ce genre de benchmark :
            https://www.youtube.com/watch?v=gSl1GfXJ_BI

            De plus il était souvent courant que certain qu'on mettait des FPS au max pour avoir des input lag au minimun , même si on a un écran à 60 Hz.

            Et donc oui , je maintient que si tu as 90 max pour un PC haut de gamme et 30 pour un PC modeste ,c'est qu'il y'a un plem quelque part ;)

            -
            Edité par HelbaSama 24 juillet 2021 à 19:34:01

            • Partager sur Facebook
            • Partager sur Twitter
              24 juillet 2021 à 20:12:03

              Je suis entrain de réfléchir à comment mettre ça en place, mais ce n'est facile lorsque par exemple un système a besoin d'informations sur des composants d'autres entités, par exemple, pour l'interpolation de frame, j'ai besoin de passer au système, les informations sur la frame courante et les informations sur la frame suivante. (Avec l'héritage c'est facile, je possède un pointeur sur la frame interpolée, et un sur la frame courante et sur la frame suivante que je n'ai qu'à changer)

              Je pense à passer un std::vector sur les composants concernés.

              -
              Edité par OmbreNoire 24 juillet 2021 à 20:13:21

              • Partager sur Facebook
              • Partager sur Twitter
                24 juillet 2021 à 23:27:51

                HelbaSama a écrit:

                Je pense pas que tu sois joueurs,  mais pas mal de "benchmark" laisse tourner les FPS au max , donc NVIDIA par exemple peut dire "tel jeux tourne à 200 FPS , même si tu as un écran à 60 ou 144 Hz.

                Je suis loin d'être un joueur pro, je l'admet, mais je reste malgré tout un joueur assidu, et ne t'en fais pas, je vois très bien ce que tu veux dire ;)

                HelbaSama a écrit:

                Bref je parle de ce genre de benchmark :
                https://www.youtube.com/watch?v=gSl1GfXJ_BI

                De plus il était souvent courant que certain qu'on mettait des FPS au max pour avoir des input lag au minimun , même si on a un écran à 60 Hz.

                Ben, vois tu, je suis très loin d'être persuadé que ces benchmarks aient été obtenus sur des dalles limitées à 60 hz, même si je ne prétend pas pour la cause que cela aie la moindre incidence sur le résultat des bench :p

                HelbaSama a écrit:

                Et donc oui , je maintient que si tu as 90 max pour un PC haut de gamme et 30 pour un PC modeste ,c'est qu'il y'a un plem quelque part ;)

                Et je n'ai jamais dit le contraire... J'ai juste dit qu'il n'y a "pas si longtemps", un jeu tournant à 60 FPS était déjà considéré comme "vachement rapide et bien optimisé", c'est tout...

                Par contre, il faut remettre les choses à leur place : si passer de 90 FPS max sur un pc haut de gamme à 30 max sur un pc modeste indique clairement qu'il y a un cheveu dans la soupe, je peux t'assurer que -- dans le contexte de cette discussion bien précise -- ce n'est pas qu'un cheveux qu'il faut retirer, mais toute une perruque et que, avant de s'inquiéter d'un FPS relativement faible / instable,  il y a des problèmes bien plus importants à résoudre :p

                • Partager sur Facebook
                • Partager sur Twitter
                Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                  24 juillet 2021 à 23:40:13

                  Finalement ça va, j'ai trouvé comment je vais implémenter tout ça, c'est juste que je n'ai pas l'habitude de séparer données et comportements, mais je trouve ça cool finalement, ça va me simplifier la tâche pour les renderer, la réutilisation de buffers, etc...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 juillet 2021 à 7:33:08

                    koala01 a écrit:

                    HelbaSama a écrit:

                    Et donc oui , je maintient que si tu as 90 max pour un PC haut de gamme et 30 pour un PC modeste ,c'est qu'il y'a un plem quelque part ;)

                    Et je n'ai jamais dit le contraire... J'ai juste dit qu'il n'y a "pas si longtemps", un jeu tournant à 60 FPS était déjà considéré comme "vachement rapide et bien optimisé", c'est tout...


                    Cela dépend ,si tu me fait un Mario et que ton jeu tourne à 60 FPS et 90 max , je suis pas sur qu'on peu considérer ça comme "optimisé" ;)

                    ", je peux t'assurer que -- dans le contexte de cette discussion bien précise -- ce n'est pas qu'un cheveux qu'il faut retirer, mais toute une perruque et que, avant de s'inquiéter d'un FPS relativement faible / instable,  il y a des problèmes bien plus importants à résoudre"
                    Justement ,c'est ce que je voulais souligner sur cette discussion , si les FPS ici semble instable/non correct , je voulais lui signaler que cette "mesure" explique clairement qu'il ne prend pas la bonne solution :)

                    Et je serais plus clair , sur un proc et GPU actuel , il faut vraiment mal programmé son truc pour avoir de tel résultats.

                    Après peut être que je me fais vieux/élitiste , mais quand je vois un Zelda Twilight Princess tourné parfaitement sur un PowerPC à 485 MHz et un GPU qui a une puissance de 10 GFlops (nos CPU sont plus "puissant" pour dire xD ) , ouais faut vraiment mal programmé pour faire moins avec plus de puissance, mais c'est mon avis personnel :p

                    -
                    Edité par HelbaSama 25 juillet 2021 à 7:41:57

                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 juillet 2021 à 8:52:14

                      C'est quand même plus évolué qu'un mario et même si c'est de la 2D iso, j'utilise quand même beaucoup de shaders au niveau du rendu.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 juillet 2021 à 10:02:38

                        Oui , si tu as le goulot d'étranglement coté GPU , s'il est coté CPU , c'est plus problématique :)
                        Le mario est un exemple grossier , mais je pourrais prendre un Zelda BoTW ou un The last of US sur PS3 , ça tourne sur 30 FPS sur des machines ridiculement "faible" comparait à ce qu'on a maintenant et je doute que ton jeux/rendu fasse mieux ;)

                        Mais là encore , il y'a des gros jeux AAA qui tourne à plus de 100 FPS , alors bon je doute que tes shaders et des quelques milliers de triangles doit être plus gourmand que ça :)

                        -
                        Edité par HelbaSama 25 juillet 2021 à 20:53:44

                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 juillet 2021 à 22:11:33

                          Par contre pouvoir utiliser un type dynamique comme en langage python ça aurait été bien, ça m'aurait éviter de devoir rappeler la fonction exec à chaque fois que je modifie mon tuple dynamique avec std::tuple_cat car j'ai besoin d'y accéder partout dans l'application. La boucle infinie ne s'arrêtera pas parce que elle n'aura pas finie de s'exécuter avant le nouvel appel à la fonction exec du coup ça ne va rien faire d'autre que de simplement surcharger la pile d'appels!!!

                          On ne peut pas tout faire en c++. 

                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 juillet 2021 à 2:12:06

                            On dirait un gourou qui utilise des termes sombres comme un ramassi de conneries, c'est impressionnant cette capacité à se convaincre soi-même.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 juillet 2021 à 8:45:52

                              Cette discussion, comme la plupart de celles générées par OmbreNoire s'éternise et ça devient lassant de la voir revenir tous les 2 jours en haut du forum alors que d'autres personnes ont plus besoin d'aide que lui.

                              OmbreNoire fait du C++ depuis 10 ans, il n'a pas besoin d'aide et se corrige tout seul, je pense qu'il n'y a pas besoin de lui répondre.

                              -
                              Edité par markand 30 juillet 2021 à 8:46:04

                              • Partager sur Facebook
                              • Partager sur Twitter

                              git is great because Linus did it, mercurial is better because he didn't.

                                30 juillet 2021 à 9:05:15

                                markand a écrit:

                                Cette discussion, comme la plupart de celles générées par OmbreNoire s'éternise et ça devient lassant de la voir revenir tous les 2 jours en haut du forum alors que d'autres personnes ont plus besoin d'aide que lui.

                                OmbreNoire fait du C++ depuis 10 ans, il n'a pas besoin d'aide et se corrige tout seul, je pense qu'il n'y a pas besoin de lui répondre.

                                -
                                Edité par markand il y a 16 minutes

                                Encore une fois, j'ai trouvé la solution seul, en utilisant un thread :

                                struct TestAppl : Application<TestAppl> {
                                    template <typename SystemArray, typename SceneArray, typename RendererArray, typename EntityComponentArray>
                                    TestAppl(SystemArray systems, SceneArray scenes, RendererArray renderers, EntityComponentArray componentArray) : Application(systems, scenes, renderers, componentArray) {
                                    }
                                    template <typename SystemArray, typename SceneArray, typename RendererArray, typename EntityComponentArray>
                                    void onInit(SystemArray& systems, SceneArray& sceneArray, RendererArray& rendererArray, EntityComponentArray& componentArray) {
                                        ::EntityFactory factory;
                                        auto newComponentArray = world.addEntityComponentFlag<transform_component>(componentArray);
                                
                                        std::vector<EntityId> entities;
                                        for (unsigned int i = 0; i < 1000; i++) {
                                            EntityId sphere = factory.createEntity();
                                            transform_component sphereTransform(vec3((i+1)*3, (i+1)*3, (i+1)*3));
                                            world.addEntityComponentAgregate(newComponentArray, sphere, sphereTransform, factory);
                                
                                            transform_component rectTransform (vec3((i+1)*3+1, (i+1)*3+1, (i+1)*3+1));
                                
                                            EntityId rectangle = factory.createEntity();
                                            world.addEntityComponentAgregate(newComponentArray, rectangle, rectTransform, factory);
                                            transform_component convexShapeTransform(vec3((i+1)*3+2, (i+1)*3+2, (i+1)*3+2));
                                            EntityId convexShape = factory.createEntity();
                                            world.addEntityComponentAgregate(newComponentArray, convexShape, convexShapeTransform, factory);
                                            world.addChild(sphere, sphere, rectangle, 0);
                                            world.addChild(sphere, sphere, convexShape, 0);
                                            entities.push_back(sphere);
                                
                                        }
                                        MoveSystem mv;
                                        auto systemsArray1 = world.addSystem(systems, mv, World<std::string>::MainSystemQueueIndex);
                                        ::EntityFactory rendererFactory;
                                        RenderType1 render1;
                                        RenderType2 render2;
                                        auto renderArray1 = world.addRendererFlag<RenderType1>(rendererArray);
                                        auto renderArray2 = world.addRendererFlag<RenderType2>(renderArray1);
                                        EntityId render1Id = rendererFactory.createEntity();
                                        EntityId render2Id = rendererFactory.createEntity();
                                        world.addRendererAgregate(renderArray2, render1Id, render1, rendererFactory);
                                        world.addRendererAgregate(renderArray2, render2Id, render2, rendererFactory);
                                        EntityId subRender = rendererFactory.createEntity();
                                        world.addSubRenderAgregate(renderArray2, render1Id, render1Id, subRender, 0, render2, rendererFactory);
                                
                                        auto sceneArray1 = world.addSceneFlag<SceneType1>(sceneArray);
                                        auto sceneArray2 = world.addSceneFlag<SceneType2>(sceneArray1);
                                        SceneType1 scene1;
                                        SceneType2 scene2;
                                        ::EntityFactory sceneFactory;
                                        EntityId sceneId1 = sceneFactory.createEntity();
                                        EntityId sceneId2 = sceneFactory.createEntity();
                                        world.addSceneAgregate(sceneArray2, sceneId1, scene1, sceneFactory);
                                        world.addSceneAgregate(sceneArray2, sceneId2, scene2, sceneFactory);
                                        world.setCurrentScene(sceneId1);
                                        running = false;
                                        launch(systemsArray1, sceneArray2, renderArray2, componentArray);
                                    }
                                    template <typename SystemArray, typename SceneArray, typename RendererArray, typename EntityComponentArray>
                                    void onExec(SystemArray& systems, SceneArray& scenes, RendererArray& renderers, EntityComponentArray& components) {
                                
                                    }
                                };

                                Par contre j'ai une exception qui est levée à l'exécution :

                                Active debugger config: GDB/CDB debugger:Default
                                Building to ensure sources are up-to-date
                                Selecting target: 
                                Release
                                Adding source dir: /home/laurent/Projets/ODFAEGDemo/
                                Adding source dir: /home/laurent/
                                Adding file: /home/laurent/Projets/ODFAEGDemo/bin/Release/ODFAEGDemo
                                Changing directory to: /home/laurent/Projets/ODFAEGDemo/.
                                Set variable: LD_LIBRARY_PATH=.:
                                Starting debugger: /usr/bin/gdb -nx -fullname -quiet  -args /home/laurent/Projets/ODFAEGDemo/bin/Release/ODFAEGDemo
                                Setting SHELL to '/bin/sh'
                                done
                                Setting breakpoints
                                Debugger name and version: GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
                                Child process PID: 10329
                                Cannot open file: ../sysdeps/unix/sysv/linux/raise.c
                                At ../sysdeps/unix/sysv/linux/raise.c:50
                                

                                En ce qui cocnerne la programmation mulit-thread, longtemps que je n'en ai plus fais, donc, besoin d'aide.



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  30 juillet 2021 à 9:34:37

                                  Quand on n'a qu'un marteau, tous les problèmes ressemblent à des clous.

                                  L'informatique, et même un moteur de jeu, ce n'est pas qu'un langage.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                    30 juillet 2021 à 9:59:22

                                    Mwai il y a quelque chose de pas normal, ce code plante chez moi :

                                    void f() {
                                        std::cout<<"f"<<std::endl;
                                    }
                                    int main() {    
                                        std::thread t(f);
                                    }

                                    EDIT : bon apparemment il faut appeler join :

                                    t.join();

                                    Et là ça fonctionne, je ne sais pas trop ce que fait cette fonction, elle attend que l'exécution du thread se termine sans doute.


                                    -
                                    Edité par OmbreNoire 30 juillet 2021 à 10:02:46

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      30 juillet 2021 à 11:15:59

                                      RTFM !!!!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                                      Le problème du langage c++.

                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                      • Editeur
                                      • Markdown