fix: Fixes serialization threading, moves world save to end of loop, and eliminates Parallel.ForEach. (#1530)

This commit is contained in:
Kamron Batman 2023-10-03 00:42:49 -07:00 committed by GitHub
parent e18115dd94
commit 1f0acddc46
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 228 additions and 58 deletions

View file

@ -14,25 +14,33 @@
*************************************************************************/
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
namespace Server;
public abstract class GenericPersistence : Persistence
public abstract class GenericPersistence : Persistence, IGenericSerializable
{
private BufferWriter _saveBuffer;
public string Name { get; }
public GenericPersistence(string name, int priority) : base(priority) => Name = name;
public override void Serialize()
{
_saveBuffer ??= new BufferWriter(true, World.SerializedTypes);
_saveBuffer.Seek(0, SeekOrigin.Begin);
World.PushToCache(this);
}
Serialize(_saveBuffer);
public long SavePosition { get; set; }
public BufferWriter SaveBuffer { get; set; }
public void Serialize(ConcurrentQueue<Type> types)
{
SaveBuffer ??= new BufferWriter(true, types);
SaveBuffer.Seek(0, SeekOrigin.Begin);
Serialize(SaveBuffer);
}
public abstract void Serialize(IGenericWriter writer);
@ -40,7 +48,7 @@ public abstract class GenericPersistence : Persistence
public override void WriteSnapshot(string basePath)
{
string binPath = Path.Combine(basePath, Name, $"{Name}.bin");
var buffer = _saveBuffer!.Buffer.AsSpan(0, (int)_saveBuffer.Position);
var buffer = SaveBuffer!.Buffer.AsSpan(0, (int)SaveBuffer.Position);
AdhocPersistence.WriteSnapshot(new FileInfo(binPath), buffer);
}