Rendering continues while waiting for network; added "network" and "port" settings.

This commit is contained in:
Bob
2009-11-16 19:22:08 +13:00
parent a966b31b32
commit 4c2171997f
3 changed files with 77 additions and 22 deletions

View File

@@ -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();

View File

@@ -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));

View File

@@ -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 );
}
} }
} }