我们在使用 csharp 接口的 JobSystem 时,其实使用的就是其引擎底层的 c++ JobSystem。此处我们的游戏线程和引擎是没有上下文切换的开销的,但是 c++ 与 csharp 内存管理与值的类型定义不同,因此我们需要区Blittable Type 和 Non-Blittable Type。其实 Blittable Type 就是在托管代码和非托管代码内存中表示形式相同的类型。其实大部分类型都符合我们的默认习惯,此处需注意:
privatestaticreadonly ProfilerMarker<int> profilerMarker = new ProfilerMarker<int>("WaveCubes UpdateTransform", "Objects Count");
privatevoidStart() { _cubesList = new List<Transform>(); for (var x = -xHalfCount; x <= xHalfCount; x++) { for (var z = -zHalfCount; z <= zHalfCount; z++) { var cube = Instantiate(cubeArchetype); cube.transform.position = new Vector3(x * 1.1f, 0, z * 1.1f); _cubesList.Add(cube.transform); } } }
privatevoidUpdate() { using (profilerMarker.Auto(_cubesList.Count)) { for (var i = 0; i < _cubesList.Count; i++) { var distance = Vector3.Distance(_cubesList[i].position, Vector3.zero); _cubesList[i].localPosition += Vector3.up * Mathf.Sin(Time.time * 3f + distance * 0.2f); } } } } }
privatevoidStart() { _transformAccessArray = new TransformAccessArray(4 * xHalfCount * zHalfCount); for (var x = -xHalfCount; x <= xHalfCount; x++) { for (var z = -zHalfCount; z <= zHalfCount; z++) { var cube = Instantiate(cubeArchetype); cube.transform.position = new Vector3(x * 1.1f, 0, z * 1.1f); _transformAccessArray.Add(cube.transform); } } }
privatevoidUpdate() { using (profilerMarker.Auto(_transformAccessArray.length)) { var job = new WaveJobs { elapsedTime = Time.time }; var waveCubesJobHandle = job.Schedule(_transformAccessArray); // 等待工作线程,同步到主线程当中 waveCubesJobHandle.Complete(); } }