Improve performance of network worker
This commit is contained in:
parent
ad42586170
commit
ab3b6bd3b3
@ -28,7 +28,8 @@ namespace TrueCraft
|
|||||||
public IEventScheduler Scheduler { get; private set; }
|
public IEventScheduler Scheduler { get; private set; }
|
||||||
public IBlockRepository BlockRepository { get; private set; }
|
public IBlockRepository BlockRepository { get; private set; }
|
||||||
|
|
||||||
private Timer NetworkWorker, EnvironmentWorker;
|
private Timer EnvironmentWorker;
|
||||||
|
private Thread NetworkWorker;
|
||||||
private TcpListener Listener;
|
private TcpListener Listener;
|
||||||
private readonly PacketHandler[] PacketHandlers;
|
private readonly PacketHandler[] PacketHandlers;
|
||||||
private IList<ILogProvider> LogProviders;
|
private IList<ILogProvider> LogProviders;
|
||||||
@ -39,7 +40,7 @@ namespace TrueCraft
|
|||||||
var reader = new PacketReader();
|
var reader = new PacketReader();
|
||||||
PacketReader = reader;
|
PacketReader = reader;
|
||||||
Clients = new List<IRemoteClient>();
|
Clients = new List<IRemoteClient>();
|
||||||
NetworkWorker = new Timer(DoNetwork);
|
NetworkWorker = new Thread(new ThreadStart(DoNetwork));
|
||||||
EnvironmentWorker = new Timer(DoEnvironment);
|
EnvironmentWorker = new Timer(DoEnvironment);
|
||||||
PacketHandlers = new PacketHandler[0x100];
|
PacketHandlers = new PacketHandler[0x100];
|
||||||
Worlds = new List<IWorld>();
|
Worlds = new List<IWorld>();
|
||||||
@ -66,7 +67,7 @@ namespace TrueCraft
|
|||||||
Listener.Start();
|
Listener.Start();
|
||||||
Listener.BeginAcceptTcpClient(AcceptClient, null);
|
Listener.BeginAcceptTcpClient(AcceptClient, null);
|
||||||
Log(LogCategory.Notice, "Running TrueCraft server on {0}", endPoint);
|
Log(LogCategory.Notice, "Running TrueCraft server on {0}", endPoint);
|
||||||
NetworkWorker.Change(100, 1000 / 20);
|
NetworkWorker.Start();
|
||||||
EnvironmentWorker.Change(100, 1000 / 20);
|
EnvironmentWorker.Change(100, 1000 / 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,17 +173,18 @@ namespace TrueCraft
|
|||||||
Scheduler.Update();
|
Scheduler.Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DoNetwork(object discarded)
|
private void DoNetwork()
|
||||||
{
|
{
|
||||||
if (ExecutingTick)
|
while (true)
|
||||||
return; // TODO: Warn about skipped updates?
|
{
|
||||||
ExecutingTick = true;
|
bool idle = true;
|
||||||
for (int i = 0; i < Clients.Count && i >= 0; i++)
|
for (int i = 0; i < Clients.Count && i >= 0; i++)
|
||||||
{
|
{
|
||||||
var client = Clients[i] as RemoteClient;
|
var client = Clients[i] as RemoteClient;
|
||||||
var sendTimeout = DateTime.Now.AddMilliseconds(200);
|
var sendTimeout = DateTime.Now.AddMilliseconds(200);
|
||||||
while (client.PacketQueue.Count != 0 && DateTime.Now < sendTimeout)
|
while (client.PacketQueue.Count != 0 && DateTime.Now < sendTimeout)
|
||||||
{
|
{
|
||||||
|
idle = false;
|
||||||
IPacket packet;
|
IPacket packet;
|
||||||
while (!client.PacketQueue.TryDequeue(out packet)) ;
|
while (!client.PacketQueue.TryDequeue(out packet)) ;
|
||||||
LogPacket(packet, false);
|
LogPacket(packet, false);
|
||||||
@ -197,6 +199,7 @@ namespace TrueCraft
|
|||||||
var receiveTimeout = DateTime.Now.AddMilliseconds(200);
|
var receiveTimeout = DateTime.Now.AddMilliseconds(200);
|
||||||
while (client.DataAvailable && DateTime.Now < receiveTimeout)
|
while (client.DataAvailable && DateTime.Now < receiveTimeout)
|
||||||
{
|
{
|
||||||
|
idle = false;
|
||||||
var packet = PacketReader.ReadPacket(client.MinecraftStream);
|
var packet = PacketReader.ReadPacket(client.MinecraftStream);
|
||||||
LogPacket(packet, true);
|
LogPacket(packet, true);
|
||||||
if (PacketHandlers[packet.ID] != null)
|
if (PacketHandlers[packet.ID] != null)
|
||||||
@ -225,8 +228,10 @@ namespace TrueCraft
|
|||||||
// TODO: Something productive
|
// TODO: Something productive
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
if (idle)
|
||||||
ExecutingTick = false;
|
Thread.Sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user