Quindi ho un motore di rendering, e ho un gestore risorse che aggiunge classi che derivano dal tipo "Risorsa". È un gestore risorse molto flessibile e generico, di cui solo uno può esistere (è una classe statica). Pertanto, una classe ShaderProgram
o Camera
può essere facilmente aggiunta in questo modo:
rm::add("textShader",
new ShaderProgram("assets/shaders/renderText.vert",
"assets/shaders/renderText.frag", true, true));
rm::add("fpsCamera",
new FPSCamera(glm::vec3(0.f, 0.f, 20.f), 45.f, 4.f / 3.f, 1.f, 1000.f));
Ora, questo può sembrare abbastanza semplice; ma una domanda teorica che mi pongo è: quando una risorsa è una risorsa? Come si fa a distinguere tra qualcosa che dovrebbe essere memorizzato (ad es. Una risorsa) o qualcosa che non dovrebbe essere memorizzato (ad esempio non risorsa)?
Ad esempio, so che userò il mio ShaderProgram
e Camera
così come Texture
(tutto il tipo Resource
) molto. Per poter ottenere il tipo esplicito di una risorsa, faccio quanto segue:
convert(Camera*, rm::get("fpsCamera"))->func(); // call Camera's func()
Quindi, so che se ho bisogno di riutilizzare qualcosa più e più volte dovrei memorizzarlo nel gestore delle risorse.
Quando si parla di un'altra classe, tuttavia, diventa un po 'più complicato. Ho due altre classi: Renderable
e Scene
. Il rapporto tra i due è molto intimo in quanto una Renderable
è una classe astratta per oggetti di rendering come Sprite
, Model
etc; e Scene
è semplicemente un contenitore di un numero di Renderable
s. Pertanto, in un'applicazione grafica è probabile che caricherò le scene e le scaricherò per liberare risorse quando richiesto. Ma non sono sicuro che Renderable debba derivare dal tipo Resource
o se Scene
debba derivare dal tipo Resource
(chiamando quindi Scene
una risorsa) o se entrambi dovrebbero essere semplicemente una risorsa. Se Renderable
era una risorsa, significa che è possibile accedervi da chiunque così facile come:
convert(Model*, rm::get("someRandomModel"))->randomFunc();
Ora, prima di urlarmi riguardo la sicurezza del tipo nella funzione sopra, vorrei rassicurare tutti sul fatto che il compilatore verifica il tipo e vede se la funzione chiamata è stata risolta. Dopo tutto è un dynamic_cast
.
Ad ogni modo, il dilemma continua così e in un primo momento posso solo affermare che Renderable
potrebbe essere una risorsa solo se vogliamo riutilizzare i renderable in questione. Pertanto, se dovessi aggiungere un Model
al gestore risorse, significa che è disponibile ovunque nel programma. Ma, non può essere recuperato se non si conosce l'ID di quella risorsa. Pertanto, è completamente possibile riutilizzare un oggetto Model
per sostituire una mesh esistente al suo interno.
Senza essere troppo tecnico, faccio ancora una volta la semplice domanda: quando una risorsa è una risorsa e dove tracciamo la linea?