Para integrar tanto el pipeline como la clase RF_Process, se vuelve necesario disponer de un gestor tareas que se encargue, tanto de almacenar los procesos y sus relaciones entre ellos, como de ir invocando los miembros del pipeline.
Puesto que los procesos jerarquizan mediante la fórmula padre/hijo, se emplea un árbol n-ario para almacenarlos. De este modo, el contenido del atributo id que contiene la clase RF_Process emerge por sí mismo :id_del_padre:type. Como del mismo padre podrían pender más de un proceso con el mismo type, se añade un número al final del id.
Como se prevé que la mayoría de los accesos al gestor de tareas será buscando el proceso que coincida con el identificador indicado y teniendo en cuenta que este gestor de tareas debe responder eficientemente en un escenario como el de un videojuego, en el que se realizan miles de llamadas al gestor de tareas por fotograma, se han implementado dos estructuras adicionales:
El único atributo que contiene RF_TaskManager es un puntero a su única instancia.
Nombre | Tipo | Descripción |
---|---|---|
instance | static RF_TaskManager* | Puntero a la instancia |
Nombre | Descripción |
---|---|
newTask | Función que instancia el proceso indicado y lo introduce en el gestor de tareas |
existsTask | Función que comprueba si existe el proceso indicado |
getTask | Función que devuelve un puntero al proceso indicado |
getTaskByType | Función que devuelve una lista con todos los procesos cuyo type coincida con el indicado |
getTaskByfather | Función que devuelve una lista con todos los procesos hijo del proceso indicado |
getTaskList | Función que devuelve una lista con todos los procesos |
sendSignal | Función para cambiar el estado del proceso indicado |
Update | Función que invoca el Update de todos los procesos |
FixedUpdate | Función que invoca el FixedUpdate de todos los procesos |
Draw | Función que renderiza los procesos |
Clear | Función que elimina todos los procesos |
No existe función deleteTask
La lógica de este sistema se basa en señales de estado; por ello, para eliminar un proceso, se le debe enviar una señal de muerte (S_KILL) y será el gestor de tareas quien se encargue de eliminar los procesos señalizados así.
void taskList(int argc, const char *argv[]) { for(RF_Process *p : RF_TaskManager::instance->getTaskList()) { if(p->type != "RF_Text") { RF_DebugConsoleListener::writeLine(p->id + " -> " + p->type); } } }
class RF_TaskManager : public RF_Map { public: static RF_TaskManager *instance; RF_TaskManager(); virtual ~RF_TaskManager(); template<typename T> string newTask(string father = "", RF_Window *_window = nullptr); bool existsTask(string id); RF_Process* getTask(string id); vector<RF_Process*> getTaskByType(string type); vector<RF_Process*> getTaskByFather(string father); vector<RF_Process*> getTaskList(); vector<string> getTaskIdList(); void sendSignal(string taskID, int signal); void sendSignal(RF_Process* task, int signal); void Update(); void FixedUpdate(); void Draw(); void Clear(); };