public override JobHandle ScheduleJobs(JobHandle dependency)
{
// 首先,我们将在队列中有内容时Spawn出效果类似于爆炸/毒气的BUFF
while (DebuffSpawnQueue.Count > 0)
{
SpawnDebuff(DebuffSpawnQueue.Dequeue());
}
int enemyCount = EnemyManager.Instance.ActiveEnemies.Count;
// 在此之前需要计算BUFF/持续伤害乘数,放在ScheduleJob中是不必要的..
_tickJobHandle = dependency; // passthrough if skipped
if (enemyCount > 0)
{
var tickJob = new DebuffTickJob
{
EnemyDebuffMask = EnemyManager.Instance.EnemyDebuffMask,
EnemyBurnDoT = EnemyManager.Instance.EnemyBurnDoT,
BurnTickRate = DebuffDataHashMap[(int)DebuffType.Burn].TickRate, // 需要更新处理方式
DeltaTime = Time.deltaTime,
HitQueue = EnemyManager.Instance.EnemyHitQueue.AsParallelWriter(),
};
_tickJobHandle = tickJob.Schedule(enemyCount, 64, dependency);
}
// ... Spawn逻辑可以在Update中实现但该函数未实现,所以此处留坑 TODO
_collisionJobHandle = dependency;
if (_debuffTransfromAccessArray.length > 0)
{
// JobHandle combinedDepedency = JobHandle.CombineDependencies(dependency, _tickJobHandle);
var collisionJob = new DebuffFormCollisionJob
{
// BUFF
DebuffPayload = _debuffFormData,
// // 敌人数据
EnemySpatialMap = EnemyManager.Instance.SpatialMap,
EnemyPositions = EnemyManager.Instance.EnemyPosition,
EnemyHitBox = EnemyManager.Instance.EnemyHitBox,
CellSize = EnemyManager.Instance.CellSize,
HitQueue = EnemyManager.Instance.EnemyHitQueue.AsParallelWriter(),
// //
ElapsedTime = Time.time,
DeltaTime = Time.deltaTime,
IsDebuffDead = _isDebuffDead,
DeadDebuffs = _isDead.AsParallelWriter()
};
_collisionJobHandle = collisionJob.Schedule(_debuffTransfromAccessArray, dependency);
}
JobHandle combinedDep = JobHandle.CombineDependencies(
_tickJobHandle,
_collisionJobHandle
);
return combinedDep;
}
我在上面使用Jobs来实现一些运算以在多线程(Parallel)环境下进行。具体来说,DebuffManager管理与技能相关的部分,而JobManager管理所有管理这些Job的script的Schedule和Job。DebuffTickJob负责计算敌人每次BUFF的伤害并有依赖项(依赖项有之前完成的数据),它写入Hit.Queue以处理伤害,而DebuffFormCollisionJob(主要是爆炸和其他物理效果BUFF的展示)同样写入Hit_QUEUE进行处理。
但是我的CollitionJob需要等待TickJob来执行,以便正常工作,并且出现以下提示:“尝试在HitQueue中新建一个并行队列。”但这并不是一个问题,因为这两个任务之间没有任何关联,应该并行处理HitQueue。
评论 (0)