Unity JobSystem 原理初探(2) - JobQueue初始化
- 本文分析了JobSystem中JobQueue与其初始化过程
- 代码来源:C#部分 C++部分来自于IDA pro解析UnityPlayer.dll
JobBatchDispatcher::ScheduleJobForEachInternal
书接上文,要引出JobQueue,就要看JobBatchDispatcher::ScheduleJobForEachInternal这个重要函数,下面就来分析一下它的调用过程:
void __fastcall JobBatchDispatcher::ScheduleJobForEachInternal(
JobBatchDispatcher *this,
struct JobFence *a2,
void (__stdcall *a3)(void *, unsigned int),
void *a4,
int a5,
void (__stdcall *a6)(void *),
const struct JobFence *a7)
{
...
struct JobQueue *JobQueue; // [rsp+40h] [rbp-68h]
struct JobGroup *v11; // [rsp+48h] [rbp-60h]
...
JobQueue = GetJobQueue();
...
v11 = (struct JobGroup *)JobQueue::CreateForEachJobBatch(JobQueue, a3, a4, (unsigned int)a5, a6, v14, v16);
JobBatchDispatcher::HandleJobKickInternal(this, JobQueue, a2, v11, a5);
}
整个调用过程如下,可以看出JobSystem主要是依赖于JobQueue才能运行的.
JobBatchDispatcher::HandleJobKickInternal
JobBatchDispatcher::KickJobs
JobQueue::ScheduleGroups
JobQueue::ScheduleGroupInternal
JobQueue::TryExecJobGroup
JobQueue::ExecJobGroup
JobQueue::ExecAll
JobQueue::Exec
我们下面再来看JobSystem初始化的过程.
JobSystem初始化
char InitializeEngineNoGraphics(void)
{
...
JobSystem::CreateJobSystem(v3);
...
return 1;
}
JobSystem::CreateJobSystem
获得处理器数量systeminfo::GetProcessorCount(v3)准备创建线程,
void __fastcall JobSystem::CreateJobSystem(JobSystem *this)
{
...
systeminfo *v3; // rcx
...
JobSystem *v6; // rcx
...
struct profiling::Marker *v9; // [rsp+48h] [rbp-F0h]
...
v1 = &v7;
for ( i = 76i64; i; --i )
{
*(_DWORD *)v1 = -858993460;
v1 = (__int64 *)((char *)v1 + 4);
}
v18 = -2i64;
v9 = (struct profiling::Marker *)&unk_18BE65FF0;
profiler_begin((struct profiling::Marker *)&unk_18BE65FF0);
v10 = -1;
if ( (unsigned int)BootConfig::ParameterData<int>::operator[](&unk_18BE66020, 0i64) != -1 )
{
v11 = 0;
v12 = systeminfo::GetProcessorCount(v3) - 1;
if ( (int)BootConfig::ParameterData<int>::operator[](&unk_18BE66020, 0i64) < 0
|| (v4 = BootConfig::ParameterData&l