Projet : gameplay & physics
Dimanche 11 mai 2008 à 12 h 36
Mon projet avance plutôt bien.
J'ai modifié un peu le gameplay: les ressources seront centralisées, ça renforce (je pense) encore plus la partie coopération et gestion. Tout le monde peut acheter et doit placer correctement les batiments pour ne pas gaspiller l'argent (qui sera certainement difficile à avoir). Vous pouvez toujours d'ailleurs me proposer des idées sympas ou me dire s'il y a problème dans les idées actuelles.
Niveau avancement : On peut placer les usines sur des puits, et ces mêmes usines produisent de l'énergie, elles peuvent être détruite. J'ai aussi ajouté la gestion des tourelles, elle attaque les monstres et l'achat des batiments (avec collisions).
Un screen pour montrer ça :

Comme vous pouvez le voir sur ce screen, les collisions sont désactivées car le gros problème pour le moment est l'optimisation de la physic, ça me bouffe énormément de ressources car je dois à chaque fois parcourir 2-3 vector (vector = liste chainée = tableau dynamique = chose pour stocker des éléments qui changent souvent (suppression, ajout) dans un jeu, pour ceux qui savent pas de quoi je parle) assez lourd pour detecter s'il y a collision.
Dans ma fonction pour gérer le jeu:
* je parcours tout d'abord le vector des monstres : je mets à jour la position des balles qu'ils ont tirés (ainsi que la gestion des collisions: 2 nouveaux vectors à parcourir: les usines et les tourelles (et bientot les joueurs)) et je vérifie si des balles sont en dehors de la map si oui je les supprime (il est vrai que je fais beaucoup d'allocations dynamique à l'intérieur quand je suis dans la phase gameplay/physic, est-ce qu'il vaudrait mieux que je fasse une pool (= endroit où stocker des balles déjà allouées) de balles (genre 500 balles pour chaque tourelle/soldat mais regroupée par un nom dans une pool générale qui gère dynamiquement les balles ?). Enfin toujours dans le vector monstre, je vérifie leur vie, s'ils sont morts (vie inférieur ou égale à 0), alors je les supprime sinon je calcule leur position en fonction de la position du joueur dans la map (partie du scrolling).
*je parcours ensuite le vector des usines: si une usine n'a plus de vie, elle est détruire sinon je calcule la position de l'usine pour le scrolling.
* je parcours enfin les tourelles : un peu similaire au premier cas : je gère les balles (avec collisions), je détermine la vie, je mets à jour la position en fonction du joueur et nouvelle chose : je détermine (collision encore) en parcourant le vector des soldats si la tourelle a des soldats dans son champ de tir.
Comme vous pouvez le voir ça fait vraiment très lourd et les FPS partent très très vite. Il y a pas une manière plus simple pour faire la même chose car la je vois pas.
Une fois que je règle ce problème d'optimisation pour de bon, je vais m'attaquer à la suite: gestion de l'IA des ennemis.
Merci d'être passé :)
J'ai modifié un peu le gameplay: les ressources seront centralisées, ça renforce (je pense) encore plus la partie coopération et gestion. Tout le monde peut acheter et doit placer correctement les batiments pour ne pas gaspiller l'argent (qui sera certainement difficile à avoir). Vous pouvez toujours d'ailleurs me proposer des idées sympas ou me dire s'il y a problème dans les idées actuelles.
Niveau avancement : On peut placer les usines sur des puits, et ces mêmes usines produisent de l'énergie, elles peuvent être détruite. J'ai aussi ajouté la gestion des tourelles, elle attaque les monstres et l'achat des batiments (avec collisions).
Un screen pour montrer ça :

Comme vous pouvez le voir sur ce screen, les collisions sont désactivées car le gros problème pour le moment est l'optimisation de la physic, ça me bouffe énormément de ressources car je dois à chaque fois parcourir 2-3 vector (vector = liste chainée = tableau dynamique = chose pour stocker des éléments qui changent souvent (suppression, ajout) dans un jeu, pour ceux qui savent pas de quoi je parle) assez lourd pour detecter s'il y a collision.
Dans ma fonction pour gérer le jeu:
* je parcours tout d'abord le vector des monstres : je mets à jour la position des balles qu'ils ont tirés (ainsi que la gestion des collisions: 2 nouveaux vectors à parcourir: les usines et les tourelles (et bientot les joueurs)) et je vérifie si des balles sont en dehors de la map si oui je les supprime (il est vrai que je fais beaucoup d'allocations dynamique à l'intérieur quand je suis dans la phase gameplay/physic, est-ce qu'il vaudrait mieux que je fasse une pool (= endroit où stocker des balles déjà allouées) de balles (genre 500 balles pour chaque tourelle/soldat mais regroupée par un nom dans une pool générale qui gère dynamiquement les balles ?). Enfin toujours dans le vector monstre, je vérifie leur vie, s'ils sont morts (vie inférieur ou égale à 0), alors je les supprime sinon je calcule leur position en fonction de la position du joueur dans la map (partie du scrolling).
*je parcours ensuite le vector des usines: si une usine n'a plus de vie, elle est détruire sinon je calcule la position de l'usine pour le scrolling.
* je parcours enfin les tourelles : un peu similaire au premier cas : je gère les balles (avec collisions), je détermine la vie, je mets à jour la position en fonction du joueur et nouvelle chose : je détermine (collision encore) en parcourant le vector des soldats si la tourelle a des soldats dans son champ de tir.
Comme vous pouvez le voir ça fait vraiment très lourd et les FPS partent très très vite. Il y a pas une manière plus simple pour faire la même chose car la je vois pas.
Une fois que je règle ce problème d'optimisation pour de bon, je vais m'attaquer à la suite: gestion de l'IA des ennemis.
Merci d'être passé :)
Essaie donc de faire des pools et de limiter les nombreuses petites allocations. Ca fragmente la mémoire et ca pose problème sur certains environnements embarqués(PDA, consoles) qui n'ont pas de virtualisation mémoire. En outre, moins tu as d'allocations, moins tu aura de memory leaks.
Dans mon projet, j'ai un pool de 1024 particules par système de particule (une seule allocation donc), je j'ai 2 listes chainées liées a cette pool: particules libres et particules utilisées.
Pour tes performances, fait 1 systeme de profiler. C'est pas très dur a faire et tu pourra voir ce qui prends trop de ressources pendant le developpement et quand ton jeu sera +/- finalisé, ca t'aidera a optimiser ton code.
Bonne chance pour ton projet!
Ce sont des carrés, qui délimitent le monde en plusieurs zones et dans lequel on regroupe les objets.
Par exemple, pour balle qui est dans une zone tu n'aurais plus qu'à tester si elle entre en collision avec les mêmes objets de cette zone. Comme ça, tu n'effectue pas le test sur les objets des autres zones et tu gagne énormément en performances.
Et si tu as bien concu ton système (tourelle, batiment, qui hériteraient d'une classe batiment, pour que les tests soient faits sur cette classe avec une 'hitbox' et non sur la classe tourelle elle même), tu peux arriver à un système pas très lourd.
Tu peux chercher sur google pour avoir plus d'infos là dessus, c'est une technique courante et ça te sera utile.
J'ai implémenté des pools de balles (256 balles pour chaque tourelle/soldat), c'est déjà plus performant. J'ai encore un petit soucis d'optimisation sur l'affichage des messages dans mon jeu, je vais voir ça de plus près.
Je vais faire le profiler maintenant et je m'attaque aux octrees après.
@skaven: j'utilise ID3DXSprite, donc niveau batch, je pense c'est optimisé (et ça optimisera mieux que moi de toute façon).