Exemple #1
0
        protected void SaveData(SaveMetrics metrics)
        {
            Dictionary <CustomSerial, SaveData> data = World.Data;

            GenericWriter indexWriter;
            GenericWriter typeWriter;
            GenericWriter dataWriter;

            if (UseSequentialWriters)
            {
                indexWriter = new BinaryFileWriter(World.DataIndexPath, false);
                typeWriter  = new BinaryFileWriter(World.DataTypesPath, false);
                dataWriter  = new BinaryFileWriter(World.DataBinaryPath, true);
            }
            else
            {
                indexWriter = new AsyncWriter(World.DataIndexPath, false);
                typeWriter  = new AsyncWriter(World.DataTypesPath, false);
                dataWriter  = new AsyncWriter(World.DataBinaryPath, true);
            }

            indexWriter.Write(data.Count);

            foreach (SaveData saveData in data.Values)
            {
                long start = dataWriter.Position;

                indexWriter.Write(saveData._TypeID);
                indexWriter.Write(saveData.Serial);
                indexWriter.Write(start);

                saveData.Serialize(dataWriter);

                if (metrics != null)
                {
                    metrics.OnDataSaved((int)(dataWriter.Position - start));
                }

                indexWriter.Write((int)(dataWriter.Position - start));
            }

            typeWriter.Write(World._DataTypes.Count);

            foreach (Type t in World._DataTypes)
            {
                typeWriter.Write(t.FullName);
            }

            indexWriter.Close();
            typeWriter.Close();
            dataWriter.Close();
        }
Exemple #2
0
        private Task SaveData()
        {
            Task commitTask = StartCommitTask(_dataThreadWriters, _customData, _customIndex);

            IEnumerable <SaveData> data = World.Data.Values;

            Parallel.ForEach(
                data,
                () => new QueuedMemoryWriter(),
                (saveData, state, writer) =>
            {
                long startPosition = writer.Position;

                saveData.Serialize(writer);

                var size = (int)(writer.Position - startPosition);

                writer.QueueForIndex(saveData, size);

                if (_metrics != null)
                {
                    _metrics.OnDataSaved(size);
                }

                return(writer);
            },
                writer =>
            {
                writer.Flush();

                _dataThreadWriters.Add(writer);
            });

            _dataThreadWriters.CompleteAdding();

            return(commitTask);
        }
        protected void SaveData(SaveMetrics metrics)
        {
            Dictionary<CustomSerial, SaveData> data = World.Data;

            GenericWriter indexWriter;
            GenericWriter typeWriter;
            GenericWriter dataWriter;

            if (this.UseSequentialWriters)
            {
                indexWriter = new BinaryFileWriter(World.DataIndexPath, false);
                typeWriter = new BinaryFileWriter(World.DataTypesPath, false);
                dataWriter = new BinaryFileWriter(World.DataBinaryPath, true);
            }
            else
            {
                indexWriter = new AsyncWriter(World.DataIndexPath, false);
                typeWriter = new AsyncWriter(World.DataTypesPath, false);
                dataWriter = new AsyncWriter(World.DataBinaryPath, true);
            }

            indexWriter.Write(data.Count);

            foreach (SaveData saveData in data.Values)
            {
                long start = dataWriter.Position;

                indexWriter.Write(saveData._TypeID);
                indexWriter.Write((int)saveData.Serial);
                indexWriter.Write(start);

                saveData.Serialize(dataWriter);

                if (metrics != null)
                    metrics.OnDataSaved((int)(dataWriter.Position - start));

                indexWriter.Write((int)(dataWriter.Position - start));
            }

            typeWriter.Write(World._DataTypes.Count);

            for (int i = 0; i < World._DataTypes.Count; ++i)
                typeWriter.Write(World._DataTypes[i].FullName);

            indexWriter.Close();
            typeWriter.Close();
            dataWriter.Close();
        }