Esempio n. 1
0
 private bool DequeueChunk(out string error)
 {
     error = null;
     try
     {
         Data.ChunkData chunk = null;
         lock (ChunkInsertQueue)
         {
             try
             {
                 chunk = ChunkInsertQueue.Dequeue();
             }
             //empty queue
             catch (InvalidOperationException) { }
         }
         if (chunk != null)
         {
             lock (chunk)
             {
                 if (!DAO.Terrain.ChunkData.Insert(chunk) && chunk.DataBaseID <= -1)
                 {
                     lock (ChunkInsertQueue)
                     {
                         //try again later
                         ChunkInsertQueue.Enqueue(chunk);
                     }
                 }
                 else
                 {
                     //atualiza index de base de dados adicionando o novo id
                     var dataBaseHashKey = chunk.DataBaseID.GetHashCode();
                     var dataBaseChunks  = this.ChunksByDataBaseID.GetOrAdd(dataBaseHashKey, new List <Data.ChunkData>());
                     lock (dataBaseChunks)
                     {
                         dataBaseChunks.Add(chunk);
                     }
                 }
             }
         }
         return(true);
     }
     catch (Exception ex)
     {
         error = ex.ToString();
         return(false);
     }
 }
Esempio n. 2
0
        /// <summary>
        /// Adiciona novo chunk no cache de memoria
        /// </summary>
        /// <param name="chunk">Chunk a ser adiciona no cache de memoria</param>
        /// <returns>Retorna ID na memoria gerado para o chunk ou -1 caso não consiga adicionar o id de memoria do chunk é atualizado no objeto caso tenha sucesso</returns>
        public long AddChunk(Data.ChunkData chunk)
        {
            if (chunk == null)
            {
                return(-1);
            }

            int maxX = MapLimits.x;
            int maxZ = MapLimits.z;
            int maxY = MapLimits.y;

            if (MapLimits.x < chunk.Position.x)
            {
                maxX = chunk.Position.x;
            }

            if (MapLimits.y < chunk.Position.y)
            {
                maxY = chunk.Position.y;
            }

            if (MapLimits.z < chunk.Position.z)
            {
                maxZ = chunk.Position.z;
            }

            MapLimits = new Vector3i(maxX, maxY, maxZ);

            int positionHashKey = chunk.Position.GetHashCode();
            //busca ou cria index para o hash
            var  positionIndexedChunks = this.PositionIndexedChunks.GetOrAdd(positionHashKey, new List <Data.ChunkData>());
            long MemoryID = -1;

            //incrementa ID
            lock (LockChunkMemoryIDIncrement)
            {
                LastChunkMemoryID++;
                MemoryID = LastChunkMemoryID;
            }

            var hashKey = MemoryID.GetHashCode();
            //Tenta adicionar na memoria e no hashIndex
            var chunks = this.ChunksByMemoryID.GetOrAdd(hashKey, new List <Data.ChunkData>());

            lock (chunks)
            {
                chunks.Add(chunk);
            }

            chunk.MemoryID = MemoryID;
            lock (positionIndexedChunks)
            {
                //adiciona no index
                positionIndexedChunks.Add(chunk);
            }



            if (chunk.DataBaseID <= -1)
            {
                lock (ChunkInsertQueue)
                {
                    ChunkInsertQueue.Enqueue(chunk);
                }
            }
            else
            {
                //adiciona no index de base de dados caso ja exista o ID do banco
                var dataBaseHashKey = chunk.DataBaseID.GetHashCode();
                var dataBaseChunks  = this.ChunksByDataBaseID.GetOrAdd(dataBaseHashKey, new List <Data.ChunkData>());
                lock (dataBaseChunks)
                {
                    dataBaseChunks.Add(chunk);
                }
            }
            return(MemoryID);
        }