Пример #1
0
    public void UnloadChunk(Chunk chunk)
    {
        var point = chunk.Position;

        Debug.Log("Unloading chunk " + point);

        if (_goCache.ContainsKey(point))
        {
            var go = _goCache[point];

            Destroy(go);

            _goCache.Remove(point);
        }

        if (_chunks.ContainsKey(point))
        {
            if (loader != null)
            {
                loader.SaveChunk(chunk);
            }

            chunk.Dispose();

            _chunks.Remove(point);
        }
    }
Пример #2
0
    public override Chunk LoadChunkAt(Vector3 worldOrigin)
    {
        int   size  = world.chunkSize;
        float scale = world.voxelSize;

        int buffer = size + 1;

        if (!_jobs.ContainsKey(worldOrigin))
        {
            var job = CreateJob(worldOrigin);

            var handle = job.Schedule();

            //Check to see if we completed it
            if (handle.IsCompleted)
            {
                handle.Complete();

                var sample = ChunkFromJob(job);

                var c = new Chunk(world.OriginToPoint(worldOrigin), sample, size, world.Height);

                c.Recalculate(size, scale, worldOrigin, true);

                if (fileLoader != null)
                {
                    fileLoader.SaveChunk(c);
                }

                _jobs.Remove(worldOrigin);

                return(c);
            }

            var holder = new JobHolder()
            {
                job       = job,
                handle    = handle,
                startTime = Time.time
            };

            _jobs.Add(worldOrigin, holder);
        }
        else
        {
            var holder = _jobs[worldOrigin];

            if (holder.handle.IsCompleted)
            {
                holder.handle.Complete();

                var sample = ChunkFromJob(holder.job);

                var c = new Chunk(world.OriginToPoint(worldOrigin), sample, size, world.Height);

                c.Recalculate(size, scale, worldOrigin, true);

                if (fileLoader != null)
                {
                    fileLoader.SaveChunk(c);
                }

                _jobs.Remove(worldOrigin);

                float duration = Time.time - holder.startTime;

                runningSum += duration;

                JobsCompleted++;

                TimeSpentAverage = runningSum / JobsCompleted;

                return(c);
            }
        }

        return(null);
    }