Mon blog sur le Game Developement (le blog de REALIZE)
Retour au blog <<

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é :)
par skaven
Dimanche 11 mai 2008 à 13 h 21
En général, il n'y a plus d'allocations mémoire quand on est en séance de gameplay.
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.
Dimanche 11 mai 2008 à 13 h 34
Le "new"/"delete" est à bannir autant que possible dans un jeu vidéo. C'est assez déroutant pour un programmeur lambda qui a jamais fait de jeux :p
Bonne chance pour ton projet!
par pthc
Dimanche 11 mai 2008 à 14 h 04
Pour parcourir une liste d'objets dans un monde virtuel on se sert souvent d'octrees.
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.
par REALIZE
Dimanche 11 mai 2008 à 14 h 18
Merci pour vos conseils !

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.
par Conspy
Dimanche 11 mai 2008 à 14 h 56
C'est un flic du swat de gta2 sur le screen ?
par skaven
Dimanche 11 mai 2008 à 14 h 58
Et si tu utilises une api graphique (opengl/DX), batch au maximum ton rendu. C'est à dire tri et regroupe les triangles qui utilisent les memes rendering states/shaders/textures pour les dessiner en 1 seul draw call. Fait du delta rendering. Fait la liste de ce qu'il y a a rendre (cf phrase d'avant), si pour la frame suivante il n'y a presque pas de changements, réutilise la liste d'affichage précédente et update la plutôt que de la reconstruire de 0.
par REALIZE
Dimanche 11 mai 2008 à 15 h 02
@Conspy: ouais, c'est le sprite du perso de GTA2 mais je vais refaire les sprites après.

@skaven: j'utilise ID3DXSprite, donc niveau batch, je pense c'est optimisé (et ça optimisera mieux que moi de toute façon).
Lundi 12 mai 2008 à 08 h 59
J'avais eu le même problème que toi au niveau de la gestion des collision sur un projet pour les cours (il fallait faire un jeu en 3d de préférence ... on a opté pour un jeu de courses de caddie). On était nuls (débutant en progs) on a jamais réglé ce problème par faute de temps. Merci pour les réponses, ça m'intéresse également même si je risque de ne plus toucher à ce projet :)
Toutes les personnes enregistrées peuvent poster un commentaire dans ce blog.

Commenter

Tags autorisés : [b] [/b], [i] [/i], [u] [/u], [code] [/code], [img]Adresse d'une image[/img], [url=Adresse d'un site web] [/url]
Vous pouvez aligner vos images à droite ou à gauche en modifiant le tag [img] comme ceci : [img right] ou [img left].

Pour vos vidéos/animations flash : [video]Adresse d'une animation[/video], pour préciser la largeur et hauteur : [video width=100 height=200]...[/video]