Herramientas de usuario

Herramientas del sitio


rf_taskmanager

RF_TaskManager

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.

Estructuras de datos

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:

  • Un mapa desordenado, el cual almacena los punteros a los procesos identificándolos con su id
  • Un multimapa desordenado, para almacenar los punteros a los procesos organizados por su type

Atributos

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

Funciones

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í.

Ejemplos

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);
        }
    }
}

rf_taskmanager.h

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();
};
rf_taskmanager.txt · Última modificación: 2023/08/07 07:50 por yawin