void FragmentDataThread(TerrainFragment fragment, Action <FragmentMeshData> callback) { FragmentMeshData data = fragment.BuildMeshData(); lock (fragmentTaskCallbacksQueue) { ThreadTaskCallback <FragmentMeshData> task = new ThreadTaskCallback <FragmentMeshData>(callback, data); fragmentTaskCallbacksQueue.Enqueue(task); } }
void Update() { viewerPosition = viewer.transform.position; if (Vector3.Distance(oldViewerPosition, viewerPosition) > terrainSettings.fragmentSize / 2.0f) { oldViewerPosition = viewerPosition; GenerateFragements(); foreach (KeyValuePair <Vector2, TerrainFragment> entry in visibleLastframeFragments) { fragmentObjPool.Recover(entry.Value.gameObject); } } while (fragmentTaskCallbacksQueue.Count > 0) { ThreadTaskCallback <FragmentMeshData> fragmentMeshDataCallback = fragmentTaskCallbacksQueue.Dequeue(); fragmentMeshDataCallback.callback(fragmentMeshDataCallback.parameter); } }