libération de mémoire & organisation hiérarchique de classes - C++ - Programmation
Marsh Posté le 24-09-2006 à 11:59:02
Juste pour l'info, voilà ce que j'avais voulu faire :
Code :
|
et j'avais les désalocations dans le destructeur...
Marsh Posté le 24-09-2006 à 15:53:30
Citation : |
Un poil quand même..
Citation : |
c'est exactement ce qu'il faut faire.
Prends ton deboggeur, et suit le déroulement pas à pas pour trouver où se situe l'erreure.
Marsh Posté le 24-09-2006 à 17:55:55
Ok, Merci Nargy !
J'ai réussit a trouver mon erreur
Bon c'était une erreur de débutant :
au moment du chargement je faisait ça :
Code :
|
mais le truc c'est qu'avec mon destructeur qui me faisait automatiquement la désalocation de mémoire j'avais un problème a la sortie de la méthode Memorise() car il me libérait la mémoire que j'avais mis dans le vector... (en détruisant Array)
J'ai donc surchargé l'opérateur = pour gérer un compteur qui compte le nombre de copie et donc me permettre de désalouer la mémoire que quand toutes les copies sont sencé être détruites. Et ça MARCHE
Par contre j'aurrais une petite question au sujet du déboggeur :
Je n'arrive pas a le faire fonctionner : Je suis bien en mode Debug, je sélectionne les break point comme on peut le voir sur la capture :
mais quand je lance le déboggeur (F5) il me sort ça :
Quelqu'un aurrait une idée ?
Merci
ps : je tiens a dire que ma version de visual studio n'est pas une version piratée. Etant étudiant, Microsoft nous donne la possibilité de télécharger gratuitement quelques logiciels. Visual en faisant partie...
Marsh Posté le 24-09-2006 à 19:16:23
ReplyMarsh Posté le 24-09-2006 à 21:15:39
bjone a écrit : utilise des vector<>, tu te simplifiera la vie !!!! |
Oui, je suis d'accord que c'est beaucoup plus simple. Mais on peut utiliser glVertexPointer() avec des vector ??? c'est par ce que je croyait que non, que je suis passé par des pointeurs...
KangOl a écrit : et des counted_ptr |
Oui, c'est vrai que c'est une idée. Mais j'avais déjà eu un soucis avec les shared_array de boost pour une utilisation de ce type :
car j'arrivais pas a définir la taille de la mémoire allouée après avoir déclaré le pointeur...
Voilà un bout de code pour exprimer ce que je veut dire :
Code :
|
Si vous savez comment on fait, ça m'intéresse.
Bon j'avoue que j'ai pas encore regardé counted_ptr mais ça ne saurrait tarder
En tout cas merci de m'avoir proposé des trucs
Marsh Posté le 24-09-2006 à 21:20:31
Citation : Oui, je suis d'accord que c'est beaucoup plus simple. Mais on peut utiliser glVertexPointer() avec des vector ??? c'est par ce que je croyait que non, que je suis passé par des pointeurs... |
dans un vector<> tout est contigu, donc oui tu peux l'utiliser avec des fonctions nécessitant un pointeur.
tu peux par exemple:
vector<Vecteur3D> Position, Normale;
Position.push_back(...);
ou
Position.resize(num_vertexs);
Position[i].x=...
et faire un:
glMachin( &Position[0] ........
Marsh Posté le 24-09-2006 à 21:29:11
Dans ce cas là on est d'accord. Mais le truc c'est que je voulais envoyer tout le tebleau d'un coup au lieu de l'envoyer vertex par vertex.
c'est pour ça que j'avais fait un glEnable(GL_VERTEX_ARRAY); et que j'envoyais tout le tableau d'un coup via glVertexPointer().
Marsh Posté le 24-09-2006 à 21:37:12
oui
glVertexPointer(3, GL_FLOAT, 0, &Position[0] );
Marsh Posté le 24-09-2006 à 21:40:59
ha d'accord, autant pour moi... Bon bha reste plus qu'a corriger ce que j'ai fait. Merci
Marsh Posté le 24-09-2006 à 21:45:11
d'ailleurs tu ferais mieux d'entrelacer position, normale et uv texture c'est plus amical avec le cache du GPU et régulier pour le fetch des données (quelles soient faites depuis la ram vidéo ou a travers l'agp ou le PCI/PCI-E)
Marsh Posté le 24-09-2006 à 21:55:41
D'ailleurs tu devrais découpler le modèle du gestionnaire de modèles,
genre faire une classe Model, et une classe ModelCollection ou ModelManager.
Et une classe genre ModelInstance ou Entity qui fait référence à la classe Model par pointeur intelligent après l'avoir obtenue de la collection de modèles par string.
Comme ça, dans cette classe, tu stoques les etats style matrice de positionnement dans le monde, etc, etc...
Utiliser des "const std::string &s" comme paramètre a tes fonctions là aussi...
Marsh Posté le 25-09-2006 à 21:10:54
Ok, bon pour ce qui est des "const std::string" je vais corriger.
Par contre quand tu dit : "d'ailleurs tu ferais mieux d'entrelacer position, normale et uv texture" tu me recommande d'utiliser un vertex Buffer et lors de ma déclaration de vertices de tout déclarer dans une même classe c'est ça ?
sinon j'ai un peu de mal a comprendre la shiérarchie que tu me recommande pour mes classe... Tu me recommanderai de faire un truc de ce genre la ?
Code :
|
Mais par contre je vois pas pourquoi tu veut que je passe par une classe ModelInstance qui utilise des smart Pointer.
En tout cas merci de m'aider a améliorer mon code
Marsh Posté le 25-09-2006 à 23:50:52
Citation : Par contre quand tu dit : "d'ailleurs tu ferais mieux d'entrelacer position, normale et uv texture" tu me recommande d'utiliser un vertex Buffer et lors de ma déclaration de vertices de tout déclarer dans une même classe c'est ça ? |
Exactement.
un bête:
struct Vertex
{
float x,y,z,
nx,ny,nz,
u,v;
};
Pour la structuration je verrais plus:
Code :
|
faire le lookup par string en permance même au traçage ça pue: le lookup par string doit se faire qu'a la création de l'objet, au chargement de la scène (niveau/carte) ou lors d'un évenement de script.
il faut placer intelligemment des pointeurs intelligent: la classe qui maintiens la géométrie et autres infos d'un objet 3D est un objet lourd, qu'il vaux mieux considérer comme non-copiable. Une fois que tu aurais fait progressé l'implémentation OpenGl (genre a base VBO), il est hors de question de passer ça vie à copier et supprimmer des ressources OpenGl (ou Direct3D).
perso j'utilises boost::instrusive_ptr, et quand le décompte d'utilisation a arrive à 0 je flag le modèle comme étant purgeable (ou le mets dans un pool de modèles inutilisés), et je purges dans des situations déterministes (changement de niveau par exemple).
Imagine le framerate si tu passes ta vie a charger/détruire un modèle 3D au fur et à mesure des évenements de ton monde 3D.
DynamicActor pouvant être une entitée pouvant être simulée mécaniquement (une trotinette), et StaticActor pouvant un truc statique genre un arbre...
Marsh Posté le 01-10-2006 à 19:51:16
Bonjour !
Bon, me voila de retour... Avec de nouveau une petite question d'organisation de mes classes. Je cherche maintenant a rendre mon code moins dépendant de l'API 3D utilisé. Je veut dire par la que je cherche a spécifier si j'utilise openGL ou DirectX qu'au dernier moment. Aussi j'ai créé ma class Render qui va dériver en OGLRender et DXRender.
voilà a quoi cela ressemble :
Render.h
Code :
|
OGLRender.h
Code :
|
Bon l'implémentation DirectX n'est pas encore faite...
Ma question c'est tout d'abord : Est-ce que vous trouvez que c'est bien comme ça que je dois m'y prendre ?
Et mon problème c'est d'aussi le lier avec ce que bjone m'avait donné. Ce que je pense faire ce serait un truc du type :
Code :
|
Voilà. Est-ce que celà vous parait correct ? (donc en gros je peut continuer dans cette voie ou trouvez vous que non...)
Merci
Marsh Posté le 01-10-2006 à 21:00:46
remarque général de développement: évite le franglais.
dans un contexte de projet "sérieux", il vaux mieux tout mettre en anglais au niveau code, et mettre les commentaires en anglais ou dans ta langue maternelle si tu n'arrives pas exprimer ton commentaire en anglais.
de plus, il vaut mieux stoquer les instances type Actor via des pointeurs intelligents, afin de pas faire exploser le coût de modification des vector<>, et de pouvoir utiliser des référencements par pointeur intelligent dans d'autres traitrements/structures.
Marsh Posté le 01-10-2006 à 21:06:55
dans Render(), il manque un destructeur virtuel, et j'aurai envie de dire que les:
float clipping, distance, angleDeVue;
std::vector<Lights> lumieres;
seraient a mettre dans une class style RenderContext que tu passes au traçage ou un truc du genre, enfin après c'est toi qui choisit.
mais le "thème" des ressources Windows n'est pas le même que celui des états de rendu, et donc ça m'inciterait a faire des classes séparées.
ensuite ce que je t'ai donné n'est pas une bible a prendre à la lettre non plus.
(perso dans un premier temps je me focaliserait plus uniquement sur l'OpenGl ou le D3D, mais pas les deux à la fois - après faut voir)
Marsh Posté le 02-10-2006 à 20:01:07
Ok, pour le franglais je vais faire des effort... Allez soyons fou, je vais passer en anglais
Sinon pour l'histoire des vectors, j'avais l'intention de passer par des pointeurs intelligent que j'aurrais stocké dans des vector pour simplifier l'utilisation... Comme ça il n'y a pas de problème non ?
Le destructeur de Render()... oops grosse erreur, je l'avais oublié.
Sinon tu as sûrement raison je vais me focaliser dans un premier temp sur openGL et je verrais DirectX ensuite. Bien que je pense que je vais continuer à organiser mes classes de manière à ne pas trop avoir de soucis pour ma futur implémentation de DirectX.
En tout cas Merci de m'avoir répondu !
Marsh Posté le 24-09-2006 à 11:49:04
Bonjour !
J'ai actuellement un petit soucis avec un de mes programme : au moment où je veut libérer la mémoire utilisée j'ai mon programme qui ne répond plus... . J'ai trouvé une solution mais j'aimerais bien avoir une explication de pourquoi ça ne marchait pas.
Voilà mon code, j'espère que vous trouverez ça pas trop indigeste...
Bon j'ai laissé la partie affichage, qui a l'air de bien marcher pour que vous puissiez voir pourquoi j'utilise pas un vector a la place de mes pointeurs sur les class CVertex, CTexCoord, CNormal
Bon pour l'info voilà a quoi ressemble ma class Mesh_a_afficher.
Vous pouvez noter que j'avais voulu faire les désallocation dans le destructeur de Mesh_a_afficher... Normalement ça aurrait du marcher non ?
Avec mes mon utilisation d'itérateurs il n'y a pas de soucis, mais j'aurrais plutôt voulu mettre la désalocation dans le destructeur...
Voilà ! Merci a ceux qui se pencheront sur mon problème
Message édité par Amonchakai le 01-10-2006 à 19:15:49