Added routines to synchronize the clock across cluster machines

This commit is contained in:
Mark Mine 2005-02-26 00:23:40 +00:00
parent 7d2b8904e0
commit 18d54db4c8
4 changed files with 53 additions and 2 deletions

View File

@ -70,11 +70,24 @@ class ClusterClient(DirectObject.DirectObject):
serverConfig.filmSize, serverConfig.filmSize,
serverConfig.filmOffset) serverConfig.filmOffset)
self.serverList.append(server) self.serverList.append(server)
self.notify.debug('pre startTimeTask')
self.startSynchronizeTimeTask()
self.notify.debug('pre startMoveCam') self.notify.debug('pre startMoveCam')
self.startMoveCamTask() self.startMoveCamTask()
self.notify.debug('post startMoveCam') self.notify.debug('post startMoveCam')
self.startMoveSelectedTask() self.startMoveSelectedTask()
def startSynchronizeTimeTask(self):
self.notify.debug('broadcasting frame time')
taskMgr.add(self.synchronizeTimeTask, "synchronizeTimeTask", -40)
def synchronizeTimeTask(self,task):
frameTime = globalClock.getFrameTime()
dt = globalClock.getDt()
for server in self.serverList:
server.sendTimeData(frameTime, dt)
return Task.cont
def startMoveCamTask(self): def startMoveCamTask(self):
self.notify.debug('adding move cam') self.notify.debug('adding move cam')
taskMgr.add(self.moveCameraTask, "moveCamTask", 49) taskMgr.add(self.moveCameraTask, "moveCamTask", 49)
@ -280,6 +293,11 @@ class DisplayConnection:
datagram = self.msgHandler.makeExitDatagram() datagram = self.msgHandler.makeExitDatagram()
self.cw.send(datagram, self.tcpConn) self.cw.send(datagram, self.tcpConn)
def sendTimeData(self,frameTime, dt):
ClusterClient.notify.debug("send time data...")
datagram = self.msgHandler.makeTimeDataDatagram(frameTime, dt)
self.cw.send(datagram, self.tcpConn)
class ClusterConfigItem: class ClusterConfigItem:
def __init__(self, serverConfigName, serverName, serverPort): def __init__(self, serverConfigName, serverName, serverPort):
self.serverConfigName = serverConfigName self.serverConfigName = serverConfigName

View File

@ -28,10 +28,13 @@ ClientConfigs = {
'two-server' : [{'display name' : 'master', 'two-server' : [{'display name' : 'master',
'display mode' : 'client', 'display mode' : 'client',
'pos' : Vec3(0), 'pos' : Vec3(0),
'hpr' : Vec3(30,0,0)}, #'hpr' : Vec3(30,0,0)},
'hpr' : Vec3(0,0,0)},
{'display name' : 'la', {'display name' : 'la',
'pos' : Vec3(0), 'pos' : Vec3(0),
'hpr' : Vec3(-30,0,0)} #'hpr' : Vec3(-30,0,0)
'hpr' : Vec3(0,0,0)
}
], ],
'mono-cave' : [{'display name' : 'la', 'mono-cave' : [{'display name' : 'la',
'pos' : Vec3(-0.105, -0.020, 5.000), 'pos' : Vec3(-0.105, -0.020, 5.000),

View File

@ -17,6 +17,7 @@ CLUSTER_SWAP_READY = 4
CLUSTER_SWAP_NOW = 5 CLUSTER_SWAP_NOW = 5
CLUSTER_COMMAND_STRING = 6 CLUSTER_COMMAND_STRING = 6
CLUSTER_SELECTED_MOVEMENT = 7 CLUSTER_SELECTED_MOVEMENT = 7
CLUSTER_TIME_DATA = 8
CLUSTER_EXIT = 100 CLUSTER_EXIT = 100
#Port number for cluster rendering #Port number for cluster rendering
@ -225,6 +226,21 @@ class ClusterMsgHandler:
datagram.addUint8(CLUSTER_EXIT) datagram.addUint8(CLUSTER_EXIT)
return datagram return datagram
def makeTimeDataDatagram(self,frameTime, dt):
datagram = PyDatagram()
datagram.addUint32(self.packetNumber)
self.packetNumber = self.packetNumber + 1
datagram.addUint8(CLUSTER_TIME_DATA)
datagram.addFloat32(frameTime)
datagram.addFloat32(dt)
return datagram
def parseTimeDataDatagram(self, dgi):
frameTime=dgi.getFloat32()
dt=dgi.getFloat32()
self.notify.debug('time data=%f %f' % (frameTime, dt))
return (frameTime, dt)

View File

@ -50,6 +50,8 @@ class ClusterServer(DirectObject.DirectObject):
if clusterSyncFlag: if clusterSyncFlag:
self.startSwapCoordinator() self.startSwapCoordinator()
base.graphicsEngine.setAutoFlip(0) base.graphicsEngine.setAutoFlip(0)
# Set global clock mode to non-real time
globalClock.setMode(ClockObject.MNonRealTime)
# Send verification of startup to client # Send verification of startup to client
self.daemon = DirectD() self.daemon = DirectD()
# These must be passed in as bootstrap arguments and stored in # These must be passed in as bootstrap arguments and stored in
@ -166,6 +168,9 @@ class ClusterServer(DirectObject.DirectObject):
elif (type == CLUSTER_SWAP_NOW): elif (type == CLUSTER_SWAP_NOW):
self.notify.debug('swapping') self.notify.debug('swapping')
base.graphicsEngine.flipFrame() base.graphicsEngine.flipFrame()
elif (type == CLUSTER_TIME_DATA):
self.notify.debug('time data')
self.handleTimeData(dgi)
else: else:
self.notify.warning("Received unknown packet type:" % type) self.notify.warning("Received unknown packet type:" % type)
return type return type
@ -197,6 +202,14 @@ class ClusterServer(DirectObject.DirectObject):
if last: if last:
last.setPosHprScale(x,y,z,h,p,r,sx,sy,sz) last.setPosHprScale(x,y,z,h,p,r,sx,sy,sz)
def handleTimeData(self,dgi):
""" Update cameraJig position to reflect latest position """
(frameTime, dt) = self.msgHandler.parseTimeDataDatagram(dgi)
# Use frame time from client for both real and frame time
globalClock.setRealTime(frameTime)
globalClock.setFrameTime(frameTime)
globalClock.setDt(dt)
def handleCommandString(self, dgi): def handleCommandString(self, dgi):
""" Handle arbitrary command string from client """ """ Handle arbitrary command string from client """
command = self.msgHandler.parseCommandStringDatagram(dgi) command = self.msgHandler.parseCommandStringDatagram(dgi)
@ -205,3 +218,4 @@ class ClusterServer(DirectObject.DirectObject):
except: except:
pass pass