Add Delay node to Visual Scripting
This commit is contained in:
@@ -1,25 +1,68 @@
|
||||
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
|
||||
|
||||
#include "MainThreadTask.h"
|
||||
#include "ConcurrentTaskQueue.h"
|
||||
#include "Engine/Platform/CriticalSection.h"
|
||||
#include "Engine/Profiler/ProfilerCPU.h"
|
||||
|
||||
ConcurrentTaskQueue<MainThreadTask> MainThreadTasks;
|
||||
|
||||
void MainThreadTask::RunAll()
|
||||
namespace
|
||||
{
|
||||
// TODO: use bulk dequeue
|
||||
CriticalSection Locker;
|
||||
Array<MainThreadTask*> Waiting;
|
||||
Array<MainThreadTask*> Queue;
|
||||
}
|
||||
|
||||
void MainThreadTask::RunAll(float dt)
|
||||
{
|
||||
PROFILE_CPU();
|
||||
|
||||
MainThreadTask* task;
|
||||
while (MainThreadTasks.try_dequeue(task))
|
||||
Locker.Lock();
|
||||
for (int32 i = Waiting.Count() - 1; i >= 0; i--)
|
||||
{
|
||||
task->Execute();
|
||||
auto task = Waiting[i];
|
||||
task->InitialDelay -= dt;
|
||||
if (task->InitialDelay < ZeroTolerance)
|
||||
{
|
||||
Waiting.RemoveAt(i);
|
||||
Queue.Add(task);
|
||||
}
|
||||
}
|
||||
for (int32 i = 0; i < Queue.Count(); i++)
|
||||
{
|
||||
Queue[i]->Execute();
|
||||
}
|
||||
Queue.Clear();
|
||||
Locker.Unlock();
|
||||
}
|
||||
|
||||
String MainThreadTask::ToString() const
|
||||
{
|
||||
return String::Format(TEXT("Main Thread Task ({0})"), ::ToString(GetState()));
|
||||
}
|
||||
|
||||
void MainThreadTask::Enqueue()
|
||||
{
|
||||
MainThreadTasks.Add(this);
|
||||
Locker.Lock();
|
||||
if (InitialDelay <= ZeroTolerance)
|
||||
Queue.Add(this);
|
||||
else
|
||||
Waiting.Add(this);
|
||||
Locker.Unlock();
|
||||
}
|
||||
|
||||
bool MainThreadActionTask::Run()
|
||||
{
|
||||
if (_action1.IsBinded())
|
||||
{
|
||||
_action1();
|
||||
return false;
|
||||
}
|
||||
if (_action2.IsBinded())
|
||||
{
|
||||
return _action2();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool MainThreadActionTask::HasReference(Object* obj) const
|
||||
{
|
||||
return obj == _target;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user