Par contre je ne sais pas ce que c'est les cache friendly faut que je regarde.
En gros:
-Grouper les données de même types ensembles -Évité les petites allocations (new/malloc) -Préférer la stack au lieu de la heap -Évité les accès à des zone random dans la mémoire (pointeurs vers différentes zone) -Préférer une copy de petits élément plutôt des des objets avec compteur (shared_ptr) -Enlever tout code bloat -Utilisé au maximum les constantes et les fonction inline pour déduire le type au compile time et réduire grandement les calculs -Unroll des loops critique (#pragma unroll [(n)])
CWC utilise GDB par défaut, c'est normal que ce soit un petit peu plus lent (normalement on peu le désactiver, mais je crois avoir cassé quelque chose dernièrement XD )
- Edité par Maeiky 23 novembre 2020 à 19:32:59
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
J'ai réfléchi sur les fonctionnalités de odfaegcreator et je pense que ça serait bien de faire comme unity et qtcreator. Grosse release donc à venir! L'utilisateur pourra créer :
Toutes entités ou interface graphique.
Il pourra passer une entité parent à une autre.
Il pourra attacher un script à une entité odfaeg.
Il pourra paramétrer les entités ou interface graphique et si c'est par exemple un monstre il pourra définir une zone dans laquelle le monstre peu se balader ou attaquer comme dans unity.
Il pourra aussi créer des quêtes et des compétences qui seront stockées dans une base de données.
Par contre je ne sais pas si on peut appeler cwc en mode commande comme je le faisait avec gcc sur Linux.
Parce que j'aimerais faire un bouton compiler et puis exécuter.
Bref il y a du boulot je ne sais pas si j'arriverai jusqu'au bout.
Bon j'ai corrigé un bug dans la classe RectangleShape. (la outline se "scalait" lorsque je changeais la taille du rectangle)
La motivation est revenue!!! Surtout depuis que j'ai corrigé certains bugs, je me disais que je faisais de la merde et c'est vrai que ce moteur n'est pas encore au point, brouillon (du code que je n'utilise plus à certains endroit, du code non séparé à certains endroit dans des fichiers .h, pour le compiler ça n'a pas été facile non plus à cause de toutes les dépendances, etc...) et la performance pas top surtout lorsque l'on affiche la réfraction je pense que ça cale aussi au niveau du CPU.
Bref toutes ces raisons m'avaient démotivé à continuer mais je suis remotivé pour améliorer le moteur.
EDIT : par contre il y a un truc que je n'avais pas avant c'est du noir entre les textures du sol, je n'avais pas ça avant c'est depuis que j'ai update le driver.
EDIT 2 : non c'est depuis que j'avais mit la taille de la per pixel linked list a 5, je l'ai remise à 20 parce que plus besoin de renderdocs pour le moment.
EDIT 3 : j'ai trouvé la fonction qui ralentissait tout c'était celle-ci :
Oui, j'ai rajouté la dll manquante à la main dans les dossiers des exécutables, mais je ne l'ai pas rajouté dans le dossier ou cwc copie les .dll.
Finalement je ne pense pas faire de classe pour sauvegarder des compétences, objets ou monstres car ceux-ci peuvent avoir des attributs très différents en fonction du type de jeux par exemple pour le personnage il peut être stun pendant un certains temps ou un certain nombre de tours si c'est un jeux par tour, pour les items ils peuvent très bien booster les stats, ou donner tout type d'effets différents comme les cartes sur ragnarok par exemple et pour les compétences elles peuvent soigner ou faire des dégâts instantanés ou pendant un certains temps ou nombre de tours, bloquer un certains nombre de coup ou de dégâts, créer des objets, créer une zone sur la carte ou on est protégé des sorts de zone, etc..., etc..., bref, ça me semble difficile de créer une classe surtout que chacun de ses objets applique un comportement différent. Ce que je vais plutôt faire c'est définir un foncteur et lorsque le joueur utilisera tel objet ou compétence ça modifiera le comportement de la zone, du joueur ou autre.
L'IA peut varier suivant le type de jeux donc je préfère laisser l'utilisateur la coder lui même dans les scripts.
J'ai vu dans un tutoriel que sur unity tu as des objets prédéfinis pour les items avec des attributs mais je ne pense pas que ça soit une bonne chose car les attributs changent en fonction du type de jeux. A moins que l'on peut créer ses propres classes pour les items et définir un comportement différent ? Bref je ne connais pas très bien Unity.
EDIT : lorsque j'aurai terminé ODFAEG Creator j'essayerai de continuer le jeux et faire quelque chose de minimal comme le projet Naïca mais bon eux ils sont une équipe, moi je suis seul, donc, ça me prendra du temps.
- Edité par OmbreNoire 27 novembre 2020 à 18:31:12
Bon j'ai compilé ODFAEG-SERVER, j'ai dû rajouté une lib pour la connection à mysql (mysqlcppconn) mais le programme crash lorsque j'appelle driver->connect et la version et le nom du driver me renvoient des trucs étranges. (0 pour la version major, 22 pour la version minor et le nom du driver est vide)
Ca, ça va être embêtant si je ne peux plus utiliser mysql.
Pourtant, avant, ça marchait, mais c'était il y a bien longtemps, je ne sais pas ce qu'ils ont modifié depuis mais...
Pas de std::mutex et companie on dirait avec cwc :
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:366:13
error: 'mutex' in namespace 'std' does not name a type
static std::mutex* m_openssl_mutex = nullptr;
^~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:366:8:
note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:57:1:
+#include <mutex>
#endif
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:366:8:
static std::mutex* m_openssl_mutex = nullptr;
^~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc: In function 'void cdk::foundation::connection::detail::thread_setup()':
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:370:3:
error: 'm_openssl_mutex' was not declared in this scope
m_openssl_mutex = new std::mutex[CRYPTO_num_locks()];
^~~~~~~~~~~~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:370:30
error: 'mutex' in namespace 'std' does not name a type
m_openssl_mutex = new std::mutex[CRYPTO_num_locks()];
^~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:370:25
note: 'std::mutex' is defined in header '<mutex>'; did you forget to '#include <mutex>'?
m_openssl_mutex = new std::mutex[CRYPTO_num_locks()];
^~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc: In function 'void cdk::foundation::connection::detail::thread_cleanup()':
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:375:12
error: 'm_openssl_mutex' was not declared in this scope
delete[] m_openssl_mutex;
^~~~~~~~~~~~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc: In function 'void cdk::foundation::connection::detail::locking_function(int, int, const char*, int)':
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:384:5:
error: 'm_openssl_mutex' was not declared in this scope
m_openssl_mutex[n].lock();
^~~~~~~~~~~~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:388:5:
error: 'm_openssl_mutex' was not declared in this scope
m_openssl_mutex[n].unlock();
^~~~~~~~~~~~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc: In function 'void cdk::foundation::connection::detail::id_function(CRYPTO_THREADID*)':
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:397:26
error: 'thread' is not a member of 'std'
std::hash<std::thread::id>()(std::this_thread::get_id())
^~~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:397:26
note: 'std::thread' is defined in header '<thread>'; did you forget to '#include <thread>'?
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:57:1:
+#include <thread>
#endif
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:397:26
std::hash<std::thread::id>()(std::this_thread::get_id())
^~~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:397:26
error: 'thread' is not a member of 'std'
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:397:26
note: 'std::thread' is defined in header '<thread>'; did you forget to '#include <thread>'?
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:397:36
error: template argument 1 is invalid
std::hash<std::thread::id>()(std::this_thread::get_id())
^
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:397:45
error: 'std::this_thread' has not been declared
std::hash<std::thread::id>()(std::this_thread::get_id())
^~~~~~~~~~~
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc: In function 'int cdk::foundation::connection::detail::poll_one(cdk::foundation::connection::detail::Socket, cdk::foundation::connection::detail::Poll_mode, bool, uint64_t)':
C:\Users\Laurent\Downloads\mysql-connector-cpp-master\mysql-connector-cpp-master\cdk\foundation\socket_detail.cc:851:27
warning: unknown option after '#pragma GCC diagnostic' kind [-Wpragmas]
DISABLE_WARNING_CDK(4548)
^
cdk\foundation\CMakeFiles\cdk_foundation.dir\build.make:132: recipe for target 'cdk/foundation/CMakeFiles/cdk_foundation.dir/socket_detail.cc.obj' failed
mingw32-make[2]: *** [cdk/foundation/CMakeFiles/cdk_foundation.dir/socket_detail.cc.obj] Error 1
CMakeFiles\Makefile2:1063: recipe for target 'cdk/foundation/CMakeFiles/cdk_foundation.dir/all' failed
mingw32-make[1]: *** [cdk/foundation/CMakeFiles/cdk_foundation.dir/all] Error 2
Makefile:128: recipe for target 'all' failed
mingw32-make: *** [all] Error 2
Pourtant ils sont dedans mutex thread et companie.
Encore cmake qui ne trouve pas les fichiers #include. J'essayais de compiler le connecteur c++ de mysql avec cmake en debug pour voir ou ça crash mais ça ne marche pas...
Bref, ça commence à me chauffer 2 jours que j'essaye de me connecter à la base de donnée avec du code c++ mais ça ne fonctionne pas. Au pire je peux utiliser des fichiers mais ça va être galère pour faire des ids pointant vers d'autres objets, j'aurai voulu insérer tout les objets du jeux dans une BDD et les lire, ou alors je fais ça avec l'éditeur de niveau et j'utilise la sérialisation de ODFAEG, je pense que je vais faire comme ça parce que ça n'ira jamais sinon.
- Edité par OmbreNoire 28 novembre 2020 à 16:51:15
Pour passer des données du c++ vers une base de donnée et les récupérer en php ok mais c'est l'inverse que je veux faire, créer les données en php (ou bien avec le client mysql) et les récupérer dans le code c++ on sait faire ça avec CURL ?
Au pire je ferai avec des fichiers.
- Edité par OmbreNoire 28 novembre 2020 à 18:47:32
Bon, étant donné que j'ai des crashs en exécutant ODFAEG-SERVER et ODFAEG-CLIENT en mode release avec cwc et que je n'avais pas tout ces crashs avant, en plus le déboguer de cwc ne m'indique rien, j'ai décidé d'essayé avec un autre compilateur (tdm-gcc) et de ne plus passer par cwc mais par cmake, j'ai réussi à compiler ODFAEG avec cmake. (j'ai trouvé pourquoi il ne trouvais pas les include)
Maintenant je dois encore lier toutes les dépendances de ODFAEG avec code::blocks pour chacun des projets pour tester, j'espère que ça ne crashera plus et si ça crash encore que le débuguer me donnera plus d'infos.
EDIT : bah ça ne crash plus donc je pense que le problème venait du compilateur utilisé par cwc.
- Edité par OmbreNoire 29 novembre 2020 à 21:32:30
J'ai réfléchi un petit peu sur comment je pourrais faire pour réfracté une grande étendue d'eau, pour le bien, il faudrait placé la caméra à chaque tile d'eau et dessiné tout les objets autant de fois qu'il y a de tile d'eau mais ça ne serait pas optimal du tout, alors ce que j'ai fais, j'ai placé la caméra au centre de la grande étendue d'eau, j'ai fait un zoom si la taille de l'étendue de l'eau est plus grande que la fenêtre, le résultat est assez bizarre mais pas facile de faire ça correctement en 2.5D :
J'ai laissé tombé les threads, j'ai trop d'accès concurrents à gérer et pas mal d'objets, j'étais entrain de réfléchir sur un éditeur de quêtes, monstres et autres objets, le problème c'est que les variables de ses objets peuvent varier suivant le type de jeux, alors j'ai pensé à faire en sorte que l'utilisateur puisse créer ses propres interface graphiques pour ensuite sauvegarder les valeurs des différents champs, d'un fichier qu'il pourra lire dans le jeux. Je ne pense pas qu'il y ai moyen de faire ça dans unity.
J'ai également laissé tombé les bases de données, je pense pas que j'en ai vraiment besoin (tout comme les threads), de plus, j'ai des crashs avec mysql connector c++ et sql api.
Alors il faut faire attention avec cette fonction car elle n'est pas très précise en effet lorsque j'envoie un message du serveur avec le temps client et lorsque le client reçoit la requête et que je calcule le temps écoulé entre l'envoi et la réception de la requête :
sf::Int64 time = Application::getTimeClk().getElapsedTime().asMicroseconds() - conversionStringLong(infos[nb+1]);
J'ai parfois des temps négatifs. (Comme si le serveur à envoyé la requête après que le client la reçoit ce qui est impossible bien sûr)
J'avance dans ODFAEG Creator (création de systèmes de particule) mais j'ai passé le répo en privé car moi seul l'utilise, et je pense que je vais le vendre si jamais quelqu'un veut l'utiliser et du coup ça m'a retiré le site et le système de dons qui ne sert à rien pour le moment.
EDIT : j'ai réglé un bug, le texte ne s'affichait pas bien car j'avais pas unbind le PIXEL_UNPACK_BUFFER
EDIT 2 : j'ai rajouté la possibilité de désactiver le "scissor test" sur les Panel parce que il y a un bug lorsque je fais deux scissor test les onglets qui sont après l'onglet sélectionné sur le tabpane ne sont pas caché lorsque l'onglet sort du panneau. (Bref le scissor test ne marche plus lorsque je fais deux scissor test)
- Edité par OmbreNoire 10 décembre 2020 à 21:59:45
J'ai commencé à implémenter les collisions dans ODFAEG Creator, j'ai eu énormément de mal à récupérer la cellule pointée par la souris parce que la vue bouge tandis que la grille non il fallait donc calculer la position de la cellule pointée en fonction de la position de la vue et de la taille de la cellule pour x et pour y.
J'ai modifié la classe Text pour ajouté une couleur de fond et la classe TextArea pour sélectionner du texte et déplacer le texte si le text est plus grand que la TextArea j'ai également appliqué un test pour ne pas afficher le texte lorsqu'il sort de la TextArea.
- Edité par OmbreNoire 12 décembre 2020 à 15:15:39
Nouveauté! Runtime serialisation! (Créer et sauvegarder dynamiquement vos propres game objects avec ODFAEG Creator!)
Ca y est ça marche!
J'ai fais une interface graphique qui récupère toutes les classes et tout les constructeurs (après je ferai les fonctions membres) des scripts créés par l'utilisateur, l'utilisateur peut choisir la classe et le constructeur du gameobject qu'il veut créer, la gui affiche automatiquement tout les types des arguments du constructeur, l'utilisateur peut entrer les valeurs des paramètres et ensuite, lorsqu'il clique sur le bouton, l'objet est crée et sauvegardé dans un fichier!
Petite vidéo prochainement qui illustre le principe.
Et ça y est le système de sauvegarde de particules fonctionne!!! Ainsi que le système pour copié une entité sélectionnée.
J'ai corrigé un bug lors de la sérialisation d'objets, j'ai fait sauvegarde de copie et de pointeur et plus les références parce que j'avais deux std::string différente qui avaient la même adresse (le compilateur c++ donnait la même adresse lors de la réalocation) du coup ça plantait.
Je ne sais pas du tout comment utiliser std::reference_wrapper dans les classes ITextArchive et OTextArchive pour sauvegarder des références.
Je viens d'ajouté une fonction pou récupérer toutes les super classes d'une classe, mais, c'est la merde à faire en c++ pour récupérer des informations sur les classes avec la manipulation de std::string, il y a les classes internes, l'héritage multiple, les namespaces et pleins de trucs à gérer.
Il y a un truc bien par contre, je peux passer un pointeur sur l'application dans un .dll et appeler des fonctions donc l'utilisateur pourra créer une entité externe personnalisée et modifier les paramètres communs à toutes les entité dans ODFAEG Creator pour par exemple créer des animations et les ajoutés au personnage comme entités enfants.
Par contre pour modifier des paramètres personnalisé et créer des entités personnalisé il devra passé par une interface graphique, heureusement celle-ci va récupérer toutes les classes, et les fonctions automatiquement donc l'utilisateur n'aura plus qu'à rentré les valeurs.
Salut! Je suis entraine de créer un nouveau composant de rendu, RaytracingRenderComponent! (Avec des compute shader)
C'est un peu lourd à faire car comme un compute shader ne dépend pas du pipeline, il faut envoyer tout les triangles et les sphères de lumière dans un buffer et utiliser les textures bindless pour faire un test sur tout les triangles d'un coup, il faut aussi calculer l'interpolation des couleurs et des coordonnées de textures soit même.
- Edité par OmbreNoire 19 décembre 2020 à 17:32:17
J'ai dû laissé tombé le raytracing trop compliqué de déboguer ça avec un GPU ou tu ne peux pas afficher de texture en console, de plus, je n'arrive pas à faire ça de manière optimisée je pensais qu'avec les compute shader j'aurai un bon FPS mais non.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.