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.
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 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é
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
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
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.
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
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
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
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...
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
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
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!!!
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
git is great because Linus did it, mercurial is better because he didn't.
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 :
× 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.
https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/
git is great because Linus did it, mercurial is better because he didn't.