protected override void OnUpdate() { NativeQueue <TileData> nativeQueue = new NativeQueue <TileData>(Allocator.TempJob); CopyTileJob copyTileJob = new CopyTileJob { nativeQueue = nativeQueue.ToConcurrent() }; JobHandle jobHandle = copyTileJob.Schedule(this); jobHandle.Complete(); NativeArray <TileData> nativeArray = new NativeArray <TileData>(nativeQueue.Count, Allocator.TempJob); NativeQueueToArrayJob nativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = nativeQueue, nativeArray = nativeArray, }; jobHandle = nativeQueueToArrayJob.Schedule(); jobHandle.Complete(); nativeQueue.Dispose(); var camera = Camera.main; //if (camera != null && Input.GetMouseButtonDown(0)) { var mousePosition = Input.mousePosition; var cameraRay = camera.ScreenPointToRay(mousePosition); Entities.WithAll <HexTileHightlightComponent>().ForEach((Entity entity) => { PostUpdateCommands.RemoveComponent <HexTileHightlightComponent>(entity); }); var deltaTime = Time.deltaTime; if (UnityEngine.Physics.Raycast(cameraRay, out var closestHit, float.PositiveInfinity)) { Vector3 mapPos = new Vector3(closestHit.point.x, 0, closestHit.point.z); CubeIndex index = HexUtils.FromPosition(mapPos, Bootstrap.Defines.TileRadius); Debug.DrawLine(Vector3.zero, closestHit.point, Color.red, 2.5f); for (int i = 0; i < nativeArray.Length; i++) { if (nativeArray[i].index.Equals(index)) { PostUpdateCommands.AddComponent(nativeArray[i].entity, new HexTileHightlightComponent()); break; } } } } nativeArray.Dispose(); }
protected override void OnUpdate() { NativeQueue <RenderData> terrain0NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); NativeQueue <RenderData> terrain1NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); CopyTileJob copyTileJob = new CopyTileJob { terrain0NativeQueue = terrain0NativeQueue.AsParallelWriter(), terrain1NativeQueue = terrain1NativeQueue.AsParallelWriter() }; JobHandle jobHandle = copyTileJob.Schedule(this); jobHandle.Complete(); NativeArray <RenderData> terrain0NativeArray = new NativeArray <RenderData>(terrain0NativeQueue.Count, Allocator.TempJob); NativeArray <RenderData> terrain1NativeArray = new NativeArray <RenderData>(terrain1NativeQueue.Count, Allocator.TempJob); NativeArray <JobHandle> jobHandleArray = new NativeArray <JobHandle>(2, Allocator.TempJob); NativeQueueToArrayJob terrain0NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = terrain0NativeQueue, nativeArray = terrain0NativeArray, }; jobHandleArray[0] = terrain0NativeQueueToArrayJob.Schedule(); NativeQueueToArrayJob terrain1NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = terrain1NativeQueue, nativeArray = terrain1NativeArray, }; jobHandleArray[1] = terrain1NativeQueueToArrayJob.Schedule(); JobHandle.CompleteAll(jobHandleArray); terrain0NativeQueue.Dispose(); terrain1NativeQueue.Dispose(); int visibleTileTotal = terrain0NativeArray.Length + terrain1NativeArray.Length; NativeArray <Matrix4x4> matrixArray = new NativeArray <Matrix4x4>(visibleTileTotal, Allocator.TempJob); FillArrayForParalleJob fillArrayForParalleJob_0 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = terrain0NativeArray, startingIndex = 0 }; jobHandleArray[0] = fillArrayForParalleJob_0.Schedule(terrain0NativeArray.Length, 10); FillArrayForParalleJob fillArrayForParalleJob_1 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = terrain1NativeArray, startingIndex = terrain0NativeArray.Length }; jobHandleArray[1] = fillArrayForParalleJob_1.Schedule(terrain1NativeArray.Length, 10); JobHandle.CompleteAll(jobHandleArray); int sliceCount = matrixInstanceArray.Length; int off = 0; //for(int i=0;i< nativeArray.Length;i+= sliceCount) while (off < visibleTileTotal) { float tilePick = off < terrain0NativeArray.Length ? 0 : 0.34f; int sliceSize = math.min(visibleTileTotal - off, sliceCount); if (off < terrain0NativeArray.Length && off + sliceSize >= terrain0NativeArray.Length) { sliceSize = terrain0NativeArray.Length - off; } NativeArray <Matrix4x4> .Copy(matrixArray, off, matrixInstanceArray, 0, sliceSize); Graphics.DrawMeshInstanced( Bootstrap.Defines.tileCollections.Pick(tilePick), 0, Bootstrap.Defines.TileMaterial, matrixInstanceArray, sliceSize); off += sliceSize; } matrixArray.Dispose(); terrain0NativeArray.Dispose(); terrain1NativeArray.Dispose(); jobHandleArray.Dispose(); }
protected override void OnUpdate() { NativeQueue <RenderData> node0NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); NativeQueue <RenderData> node1NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); NativeQueue <RenderData> node2NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); NativeQueue <RenderData> node3NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); NativeQueue <RenderData> node4NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); NativeQueue <RenderData> node5NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); NativeQueue <RenderData> node6NativeQueue = new NativeQueue <RenderData>(Allocator.TempJob); CopyTileJob copyTileJob = new CopyTileJob { node0NativeQueue = node0NativeQueue.ToConcurrent(), node1NativeQueue = node1NativeQueue.ToConcurrent(), node2NativeQueue = node2NativeQueue.ToConcurrent(), node3NativeQueue = node3NativeQueue.ToConcurrent(), node4NativeQueue = node4NativeQueue.ToConcurrent(), node5NativeQueue = node5NativeQueue.ToConcurrent(), node6NativeQueue = node6NativeQueue.ToConcurrent() }; JobHandle jobHandle = copyTileJob.Schedule(this); jobHandle.Complete(); NativeArray <RenderData> node0NativeArray = new NativeArray <RenderData>(node0NativeQueue.Count, Allocator.TempJob); NativeArray <RenderData> node1NativeArray = new NativeArray <RenderData>(node1NativeQueue.Count, Allocator.TempJob); NativeArray <RenderData> node2NativeArray = new NativeArray <RenderData>(node1NativeQueue.Count, Allocator.TempJob); NativeArray <RenderData> node3NativeArray = new NativeArray <RenderData>(node1NativeQueue.Count, Allocator.TempJob); NativeArray <RenderData> node4NativeArray = new NativeArray <RenderData>(node1NativeQueue.Count, Allocator.TempJob); NativeArray <RenderData> node5NativeArray = new NativeArray <RenderData>(node1NativeQueue.Count, Allocator.TempJob); NativeArray <RenderData> node6NativeArray = new NativeArray <RenderData>(node1NativeQueue.Count, Allocator.TempJob); NativeArray <JobHandle> jobHandleArray = new NativeArray <JobHandle>(7, Allocator.TempJob); NativeQueueToArrayJob node0NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = node0NativeQueue, nativeArray = node0NativeArray, }; jobHandleArray[0] = node0NativeQueueToArrayJob.Schedule(); NativeQueueToArrayJob node1NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = node1NativeQueue, nativeArray = node1NativeArray, }; jobHandleArray[1] = node1NativeQueueToArrayJob.Schedule(); NativeQueueToArrayJob node2NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = node2NativeQueue, nativeArray = node2NativeArray, }; jobHandleArray[2] = node2NativeQueueToArrayJob.Schedule(); NativeQueueToArrayJob node3NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = node3NativeQueue, nativeArray = node3NativeArray, }; jobHandleArray[3] = node3NativeQueueToArrayJob.Schedule(); NativeQueueToArrayJob node4NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = node4NativeQueue, nativeArray = node4NativeArray, }; jobHandleArray[4] = node4NativeQueueToArrayJob.Schedule(); NativeQueueToArrayJob node5NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = node5NativeQueue, nativeArray = node5NativeArray, }; jobHandleArray[5] = node5NativeQueueToArrayJob.Schedule(); NativeQueueToArrayJob node6NativeQueueToArrayJob = new NativeQueueToArrayJob { nativeQueue = node6NativeQueue, nativeArray = node6NativeArray, }; jobHandleArray[6] = node6NativeQueueToArrayJob.Schedule(); JobHandle.CompleteAll(jobHandleArray); node0NativeQueue.Dispose(); node1NativeQueue.Dispose(); node2NativeQueue.Dispose(); node3NativeQueue.Dispose(); node4NativeQueue.Dispose(); node5NativeQueue.Dispose(); node6NativeQueue.Dispose(); int visibleTileTotal = node0NativeArray.Length + node1NativeArray.Length; NativeArray <Matrix4x4> matrixArray = new NativeArray <Matrix4x4>(visibleTileTotal, Allocator.TempJob); int startingIndex = 0; FillArrayForParalleJob fillArrayForParalleJob_0 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = node0NativeArray, startingIndex = startingIndex }; jobHandleArray[0] = fillArrayForParalleJob_0.Schedule(node0NativeArray.Length, 10); startingIndex += node0NativeArray.Length; FillArrayForParalleJob fillArrayForParalleJob_1 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = node1NativeArray, startingIndex = startingIndex }; jobHandleArray[1] = fillArrayForParalleJob_1.Schedule(node1NativeArray.Length, 10); startingIndex += node1NativeArray.Length; FillArrayForParalleJob fillArrayForParalleJob_2 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = node2NativeArray, startingIndex = startingIndex }; jobHandleArray[2] = fillArrayForParalleJob_2.Schedule(node1NativeArray.Length, 10); startingIndex += node2NativeArray.Length; FillArrayForParalleJob fillArrayForParalleJob_3 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = node1NativeArray, startingIndex = startingIndex }; jobHandleArray[3] = fillArrayForParalleJob_3.Schedule(node3NativeArray.Length, 10); startingIndex += node3NativeArray.Length; FillArrayForParalleJob fillArrayForParalleJob_4 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = node4NativeArray, startingIndex = startingIndex }; jobHandleArray[4] = fillArrayForParalleJob_4.Schedule(node4NativeArray.Length, 10); startingIndex += node4NativeArray.Length; FillArrayForParalleJob fillArrayForParalleJob_5 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = node5NativeArray, startingIndex = startingIndex }; jobHandleArray[5] = fillArrayForParalleJob_5.Schedule(node5NativeArray.Length, 10); startingIndex += node5NativeArray.Length; FillArrayForParalleJob fillArrayForParalleJob_6 = new FillArrayForParalleJob { matrixArray = matrixArray, nativeArray = node6NativeArray, startingIndex = startingIndex }; jobHandleArray[6] = fillArrayForParalleJob_6.Schedule(node6NativeArray.Length, 10); startingIndex += node6NativeArray.Length; JobHandle.CompleteAll(jobHandleArray); int sliceCount = 1023; Matrix4x4[] matrixInstanceArray = new Matrix4x4[1023]; int off = 0; //while (off < visibleTileTotal) //{ // int tilePick = off < node0NativeArray.Length ? 0 : 0.34f; // int sliceSize = math.min(visibleTileTotal - off, sliceCount); // if (off < node0NativeArray.Length && off + sliceSize >= node0NativeArray.Length) // { // sliceSize = node0NativeArray.Length - off; // } // NativeArray<Matrix4x4>.Copy(matrixArray, off, matrixInstanceArray, 0, sliceSize); // Graphics.DrawMeshInstanced( // Bootstrap.Defines.ResourceNodesPrefab[tilePick].mesh, // 0, // Bootstrap.Defines.ResourceNodesPrefab[tilePick].material, // matrixInstanceArray, // sliceSize); // off += sliceSize; //} matrixArray.Dispose(); node0NativeArray.Dispose(); node1NativeArray.Dispose(); node2NativeArray.Dispose(); node3NativeArray.Dispose(); node4NativeArray.Dispose(); node5NativeArray.Dispose(); node6NativeArray.Dispose(); jobHandleArray.Dispose(); }