Précédent   Forum du club des développeurs et IT Pro > Applications > Développement 2D, 3D et Jeux > Moteurs 3D
Moteurs 3D Forum d'entraide sur les moteurs 3D (conception d'un moteur, Ogre, Irrlicht...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/06/2012, 23h09   #1
Kromagg
Membre habitué
 
Avatar de Kromagg
 
Mickaël Leclerc
Ingénieur développement logiciels
Inscription : août 2008
Messages : 251
Détails du profil
Informations personnelles :
Nom : Mickaël Leclerc
Âge : 26
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : août 2008
Messages : 251
Points : 136
Points : 136
Par défaut Gestionnaire de ressources

Bien le bonjour,

Je travaille sur un moteur de rendu en OpenGL et j'arrive maintenant sur la gestion des ressources. J'ai vu deux façon de faire lors de la création d'une ressource. La première, classique, consiste à retourner un pointeur sur la ressource créée
Code :
1
2
3
4
5
6
7
8
9
10
11
 
class Renderer
{
public:
     VertexBuffer* CreateVertexBuffer(...);
     IndexBuffer* CreateIndexBuffer(...);
 
private:
     std::vector<VertexBuffer*> m_vVertexBuffers;
     std::vector<IndexBuffer*> m_vIndexBuffers;
};
La deuxième consiste à retourner un handle sur la ressource créée. L'utilisateur doit ensuite interroger le gestionnaire de ressources avec cet handle pour obtenir un pointeur sur la ressource.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
class Renderer
{
public:
     int CreateVertexBuffer(...);
     int CreateIndexBuffer(...);
 
     VertexBuffer* GetVertexBufferByIndex(int Index);
     IndexBuffer* GetIndexBufferByIndex(int Index);
 
private:
     std::vector<VertexBuffer*> m_vVertexBuffers;
     std::vector<IndexBuffer*> m_vIndexBuffers;
};
Dans le deuxième cas je cite la documentation du moteur dans lequel je vu l'implémentation
"The renderer provides the ability for other classes to create and reference the various Direct3D 11 objects. The primary objects that other non-rendering system classes will be interested in are the memory resource classes, which represent buffers and textures. The renderer allows creation of these objects, but retains ownership of them and returns only an ID to the caller. That ID is then used by the caller any time they want to reference a particular resource.
This pattern is also followed for non-resource classes as well, such as shader objects, samplers, input layouts, and so on. Instead of making the other classes work with direct references to D3D11 objects, they are instead referenced by IDs. This allows the renderer to keep control over how and when the D3D11 objects are used, and minimizes the direct knowledge needed by the application to use the engine."

Quel pattern utilisez-vous le plus et pourquoi ?

Kromagg
__________________
C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)
Kromagg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 10h32   #2
Djakisback
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 914
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 914
Points : 1 840
Points : 1 840
Salut,
personnellement j'utilise une variante du 2e pour garder une trace de toutes les ressources créées et pouvoir les libérer/y accéder plus facilement. J'ai aussi une surcouche car je stocke, par exemple, les identifiants de textures dans des objets de classe Texture. C'est donc ensuite une liste de Texture que je stocke dans le Renderder et non pas une liste d'IDs.
__________________
Vive les roues en pierre
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 19h40   #3
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 476
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2008
Messages : 10 476
Points : 40 554
Points : 40 554
Bonjour,

Comme tu l'énonce, ta première méthode, tu dépend trop de l'API sous jacente. Imagine que tu veuille faire du DirectX, de l'OpenGL et d'un troisième truc ... bah en retournant les objets eux mêmes (ou les pointeurs, peut importe) tu te lie trop au type en question.
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 23h19   #4
Kromagg
Membre habitué
 
Avatar de Kromagg
 
Mickaël Leclerc
Ingénieur développement logiciels
Inscription : août 2008
Messages : 251
Détails du profil
Informations personnelles :
Nom : Mickaël Leclerc
Âge : 26
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : août 2008
Messages : 251
Points : 136
Points : 136
Citation:
Envoyé par LittleWhite Voir le message
Bonjour,

Comme tu l'énonce, ta première méthode, tu dépend trop de l'API sous jacente. Imagine que tu veuille faire du DirectX, de l'OpenGL et d'un troisième truc ... bah en retournant les objets eux mêmes (ou les pointeurs, peut importe) tu te lie trop au type en question.
Prenons l'exemple d'une ressource de type Texture2D.

Avec la première méthode je retourne directement un pointeur sur un objet de type Texture2D.
Avec la seconde méthode je retourne un handle sur l'objet. Mais quand je vais accéder à la ressource en elle-même grâce à son handle je vais également obtenir un pointeur sur un object de type Texture2D.
Dans ce cas, quelle différence y'a t-il entre la première et la deuxième méthode ?

Kromagg
__________________
C'est dans ses rêves que l'homme trouve la liberté cela fut, est et restera la vérité! (John Keating - Le cercle des poètes disparus)
Kromagg est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2012, 23h45   #5
LittleWhite
Responsable 2D/3D/Jeux


 
Avatar de LittleWhite
 
Homme Alexandre Laurent
Ingénieur développement logiciels
Inscription : mai 2008
Messages : 10 476
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Laurent
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mai 2008
Messages : 10 476
Points : 40 554
Points : 40 554
Citation:
Envoyé par Kromagg Voir le message
Avec la seconde méthode je retourne un handle sur l'objet. Mais quand je vais accéder à la ressource en elle-même grâce à son handle je vais également obtenir un pointeur sur un object de type Texture2D.
Non, parce que là, à la OpenGL (qui te retourne que des int), tu vas utiliser ton handle dans des fonctions genre :

bindTex2D()
deleteTex2D()

(Après, ton moteur pourra faire toujours un test si l'ID passé correspond bien à la plage des Texture2D), mais au moins, dans ce cas là, tu n'aura jamais d'objet Texture2D réellement visible.
Mais, je trouve mon approche trop C.

Sinon, la méthode une est mieux, dans le style approche C++, si le pointeur que tu renvoie est une interface. Cela n'empêche pas de garder trace de tout ce qui est fait.
__________________
Vous souhaitez participer à la rubrique 2D / 3D / Jeux ? Contactez-moi
La rubrique a aussi un blog !

Ma page sur DVP
Mon Portfolio

Qui connaît l'erreur, connaît la solution.
LittleWhite est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 19h33.


 
 
 
 
Partenaires

Hébergement Web