AF
Size: a a a
AF
AF
RM
struct ITask {
virtual void Execute() = 0;
virtual void Result() = 0;
};
template <typename... Types>
struct Task : public ITask {
void Execute() override {
if(m_Job) { m_Job(m_UserData); }
}
void Result() overridde {
if(m_Result) { m_Result(m_UserData); }
}
std::function<void (vec& data)> m_Job;
std::function<void (vec& data)> m_Result;
std::tuple<Types...> m_UserData;
};
1) Разраб вызывает JobSystem.Execute([](std::tuple<....> userData) {
// какая то логика, которая будет выполнена асинхронно
}, [](std::tuple<....> userData) {
// какая то логика, которая будет выполнена в основном потоке
// тут мы получаем уже обработанный userData (после асинхронки)
}, myData);
2) Внутри Job System метод Execute получает аргументы данных, создает Task объект и передает его воркерку на выполнение, тот вызывает ITask->Execute() и после выполнения он смотрит есть ли в ITask m_Result и если он есть, то этот Task перемещается в spsc очередь выполненных задач, если нету, то не перемещается, все, задача выполненаRM
RM
O
RM
RM
RM
RM
O
RM
O
O
O
RM
RM
O
O
RM