Rendering continues while waiting for network; added "network" and "port" settings.
This commit is contained in:
@@ -40,6 +40,9 @@ namespace OpenRa.Game
|
|||||||
|
|
||||||
public static string Replay;
|
public static string Replay;
|
||||||
|
|
||||||
|
public static string NetworkHost;
|
||||||
|
public static int NetworkPort;
|
||||||
|
|
||||||
public static bool skipMakeAnims = true;
|
public static bool skipMakeAnims = true;
|
||||||
|
|
||||||
public static void Initialize(string mapName, Renderer renderer, int2 clientSize, int localPlayer)
|
public static void Initialize(string mapName, Renderer renderer, int2 clientSize, int localPlayer)
|
||||||
@@ -79,9 +82,15 @@ namespace OpenRa.Game
|
|||||||
soundEngine = new ISoundEngine();
|
soundEngine = new ISoundEngine();
|
||||||
sounds = new Cache<string, ISoundSource>(LoadSound);
|
sounds = new Cache<string, ISoundSource>(LoadSound);
|
||||||
|
|
||||||
orderManager = (Replay == "")
|
if( Replay != "" )
|
||||||
? new OrderManager(new OrderSource[] { new LocalOrderSource(), new NetworkOrderSource( new TcpClient( "127.0.0.1", 1234 ) ) }, "replay.rep")
|
orderManager = new OrderManager( new OrderSource[] { new ReplayOrderSource( Replay ) } );
|
||||||
: new OrderManager(new OrderSource[] { new ReplayOrderSource( Replay ) });
|
else
|
||||||
|
{
|
||||||
|
var orderSources = ( string.IsNullOrEmpty( NetworkHost ) )
|
||||||
|
? new OrderSource[] { new LocalOrderSource() }
|
||||||
|
: new OrderSource[] { new LocalOrderSource(), new NetworkOrderSource( new TcpClient( NetworkHost, NetworkPort ) ) };
|
||||||
|
orderManager = new OrderManager(orderSources, "replay.rep" );
|
||||||
|
}
|
||||||
|
|
||||||
PlaySound("intro.aud", false);
|
PlaySound("intro.aud", false);
|
||||||
|
|
||||||
@@ -155,8 +164,9 @@ namespace OpenRa.Game
|
|||||||
{
|
{
|
||||||
lastTime += timestep;
|
lastTime += timestep;
|
||||||
|
|
||||||
if (orderManager.Tick())
|
if( orderManager.IsReadyForNextFrame )
|
||||||
{
|
{
|
||||||
|
orderManager.Tick();
|
||||||
if (controller.orderGenerator != null)
|
if (controller.orderGenerator != null)
|
||||||
controller.orderGenerator.Tick();
|
controller.orderGenerator.Tick();
|
||||||
|
|
||||||
@@ -172,6 +182,8 @@ namespace OpenRa.Game
|
|||||||
foreach (var player in players.Values)
|
foreach (var player in players.Values)
|
||||||
player.Tick();
|
player.Tick();
|
||||||
}
|
}
|
||||||
|
else if( orderManager.FrameNumber == 0 )
|
||||||
|
lastTime = Environment.TickCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
PerfHistory.Tick();
|
PerfHistory.Tick();
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ namespace OpenRa.Game
|
|||||||
WorldRenderer.ShowUnitPaths = settings.GetValue("pathdebug", false);
|
WorldRenderer.ShowUnitPaths = settings.GetValue("pathdebug", false);
|
||||||
Game.timestep = settings.GetValue("rate", 40);
|
Game.timestep = settings.GetValue("rate", 40);
|
||||||
Game.Replay = settings.GetValue("replay", "");
|
Game.Replay = settings.GetValue("replay", "");
|
||||||
|
Game.NetworkHost = settings.GetValue( "host", "" );
|
||||||
|
Game.NetworkPort = int.Parse( settings.GetValue( "port", "0" ) );
|
||||||
|
|
||||||
Game.Initialize(settings.GetValue("map", "scm12ea.ini"), renderer, new int2(ClientSize),
|
Game.Initialize(settings.GetValue("map", "scm12ea.ini"), renderer, new int2(ClientSize),
|
||||||
settings.GetValue("player", 1));
|
settings.GetValue("player", 1));
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using System.IO;
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
using IjwFramework.Types;
|
using IjwFramework.Types;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
namespace OpenRa.Game
|
namespace OpenRa.Game
|
||||||
{
|
{
|
||||||
@@ -34,11 +35,20 @@ namespace OpenRa.Game
|
|||||||
savingReplay = new BinaryWriter( new FileStream( replayFilename, FileMode.Create ) );
|
savingReplay = new BinaryWriter( new FileStream( replayFilename, FileMode.Create ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Tick()
|
public bool IsReadyForNextFrame
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
foreach( var p in players )
|
||||||
|
if( !p.IsReadyForFrame( frameNumber ) )
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Tick()
|
||||||
{
|
{
|
||||||
var localOrders = Game.controller.GetRecentOrders();
|
var localOrders = Game.controller.GetRecentOrders();
|
||||||
if( localOrders == null )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
foreach( var p in players )
|
foreach( var p in players )
|
||||||
p.SendLocalOrders( frameNumber + FramesAhead, localOrders );
|
p.SendLocalOrders( frameNumber + FramesAhead, localOrders );
|
||||||
@@ -59,7 +69,7 @@ namespace OpenRa.Game
|
|||||||
if( ( frameNumber & 0x80000000 ) != 0 )
|
if( ( frameNumber & 0x80000000 ) != 0 )
|
||||||
throw new InvalidOperationException( "(OrderManager) Frame number too large" );
|
throw new InvalidOperationException( "(OrderManager) Frame number too large" );
|
||||||
|
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,6 +77,7 @@ namespace OpenRa.Game
|
|||||||
{
|
{
|
||||||
void SendLocalOrders( int localFrame, List<Order> localOrders );
|
void SendLocalOrders( int localFrame, List<Order> localOrders );
|
||||||
List<Order> OrdersForFrame( int currentFrame );
|
List<Order> OrdersForFrame( int currentFrame );
|
||||||
|
bool IsReadyForFrame( int frameNumber );
|
||||||
}
|
}
|
||||||
|
|
||||||
class LocalOrderSource : OrderSource
|
class LocalOrderSource : OrderSource
|
||||||
@@ -83,6 +94,11 @@ namespace OpenRa.Game
|
|||||||
{
|
{
|
||||||
orders[ localFrame ] = localOrders;
|
orders[ localFrame ] = localOrders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsReadyForFrame( int frameNumber )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ReplayOrderSource : OrderSource
|
class ReplayOrderSource : OrderSource
|
||||||
@@ -120,40 +136,59 @@ namespace OpenRa.Game
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsReadyForFrame( int frameNumber )
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NetworkOrderSource : OrderSource
|
class NetworkOrderSource : OrderSource
|
||||||
{
|
{
|
||||||
int nextLocalOrderFrame = 0;
|
int nextLocalOrderFrame = 0;
|
||||||
TcpClient socket;
|
TcpClient socket;
|
||||||
BinaryReader reader;
|
|
||||||
|
Dictionary<int, List<Order>> orders = new Dictionary<int,List<Order>>();
|
||||||
|
|
||||||
public NetworkOrderSource( TcpClient socket )
|
public NetworkOrderSource( TcpClient socket )
|
||||||
{
|
{
|
||||||
this.socket = socket;
|
this.socket = socket;
|
||||||
reader = new BinaryReader( socket.GetStream() );
|
var reader = new BinaryReader( socket.GetStream() );
|
||||||
|
|
||||||
var nextFrameId = System.BitConverter.GetBytes( nextLocalOrderFrame );
|
var nextFrameId = System.BitConverter.GetBytes( nextLocalOrderFrame );
|
||||||
socket.GetStream().Write( nextFrameId, 0, nextFrameId.Length );
|
socket.GetStream().Write( nextFrameId, 0, nextFrameId.Length );
|
||||||
}
|
|
||||||
|
|
||||||
public List<Order> OrdersForFrame( int currentFrame )
|
new Thread( () =>
|
||||||
{
|
|
||||||
if( currentFrame == 0 )
|
|
||||||
{
|
{
|
||||||
var firstFrameNum = reader.ReadInt32();
|
var firstFrameNum = reader.ReadInt32();
|
||||||
if( firstFrameNum != 0 )
|
if( firstFrameNum != 0 )
|
||||||
throw new InvalidOperationException( "Wrong frame number at start of stream" );
|
throw new InvalidOperationException( "Wrong frame number at start of stream" );
|
||||||
}
|
|
||||||
|
|
||||||
var ret = new List<Order>();
|
var currentFrame = 0;
|
||||||
while( true )
|
|
||||||
{
|
|
||||||
var first = reader.ReadUInt32();
|
var first = reader.ReadUInt32();
|
||||||
if( first == currentFrame + 1 )
|
while( true )
|
||||||
return ret;
|
{
|
||||||
ret.Add( Order.Deserialize( reader, first ) );
|
var ret = new List<Order>();
|
||||||
}
|
while( true )
|
||||||
|
{
|
||||||
|
if( first == currentFrame + 1 )
|
||||||
|
{
|
||||||
|
lock( orders )
|
||||||
|
orders[ currentFrame ] = ret;
|
||||||
|
ret = new List<Order>();
|
||||||
|
++currentFrame;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ret.Add( Order.Deserialize( reader, first ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ).Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Order> OrdersForFrame( int currentFrame )
|
||||||
|
{
|
||||||
|
// TODO: prune `orders` based on currentFrame.
|
||||||
|
lock( orders )
|
||||||
|
return orders[ currentFrame ];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendLocalOrders( int localFrame, List<Order> localOrders )
|
public void SendLocalOrders( int localFrame, List<Order> localOrders )
|
||||||
@@ -171,5 +206,11 @@ namespace OpenRa.Game
|
|||||||
var nextFrameId = System.BitConverter.GetBytes( nextLocalOrderFrame );
|
var nextFrameId = System.BitConverter.GetBytes( nextLocalOrderFrame );
|
||||||
socket.GetStream().Write( nextFrameId, 0, nextFrameId.Length );
|
socket.GetStream().Write( nextFrameId, 0, nextFrameId.Length );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool IsReadyForFrame( int frameNumber )
|
||||||
|
{
|
||||||
|
lock( orders )
|
||||||
|
return orders.ContainsKey( frameNumber );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user