J'ai toujours pensé qu'un bon gestionnaire d'actifs devrait avoir plusieurs modes de fonctionnement. Ces modes seraient très probablement des modules source distincts adhérant à une interface commune. Les deux modes de fonctionnement de base seraient:
- Mode de production - tous les actifs sont locaux et dépouillés de toutes les métadonnées
- Mode de développement - les tests sont stockés dans une base de données (par exemple MySQL, etc.) avec des métadonnées supplémentaires. La base de données serait un système à deux niveaux avec une base de données locale mettant en cache une base de données partagée. Les créateurs de contenu pourraient éditer et mettre à jour la base de données partagée et les mises à jour automatiquement propagées aux systèmes développeur / AQ. Il devrait également être possible de créer du contenu d'espace réservé. Puisque tout est dans une base de données, des requêtes peuvent être faites sur la base de données et des rapports générés pour analyser l'état de la production.
Vous auriez besoin d'un outil qui peut récupérer toutes les analyses de la base de données partagée et créer l'ensemble de données de production.
Pendant mes années en tant que développeur, je n'ai jamais rien vu de tel, même si je n'ai travaillé que pour une poignée d'entreprises, mon point de vue n'est donc pas vraiment représentatif.
Mise à jour
OK, quelques votes négatifs. Je développerai cette conception.
Tout d'abord, vous n'avez pas vraiment besoin de classes d'usine car si vous avez:
TextureHandle tex = pRm->getResource<Texture>( "test.otx" );
vous connaissez le type, alors faites simplement:
TextureHandle tex = new TextureHandle ("test.otx");
mais ensuite, ce que j'essayais de dire ci-dessus, c'est que vous n'utiliseriez pas de toute façon des noms de fichiers explicites, la texture à charger serait spécifiée par le modèle sur lequel la texture est utilisée, donc vous n'avez pas réellement besoin d'un nom lisible par l'homme, il peut s'agir d'une valeur entière de 32 bits, ce qui est beaucoup plus facile à gérer pour le processeur. Ainsi, dans le constructeur de TextureHandle, vous auriez:
if (texture already loaded)
update texture reference count
else
asset_stream = new AssetStream (resource_id)
asset_stream->ReadBytes
create texture
set texture ref count to 1
AssetStream utilise le paramètre resource_id pour trouver l'emplacement des données. La façon dont cela a été fait dépendrait de l'environnement dans lequel vous exécutez:
En développement: le flux recherche l'ID dans une base de données (en utilisant SQL par exemple) pour obtenir un nom de fichier puis ouvre le fichier, le fichier peut être mis en cache localement, ou extrait d'un serveur si le fichier local n'existe pas ou est périmé.
Dans la version: le flux recherche l'ID dans une table clé / valeur pour obtenir un décalage / taille dans un grand fichier compressé (comme le fichier WAD de Doom).