Unity JobSystem 原理初探(2) - JobQueue初始化

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值