mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-05 03:15:07 -04:00
Added routines to synchronize the clock across cluster machines
This commit is contained in:
parent
7d2b8904e0
commit
18d54db4c8
@ -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
|
||||||
|
@ -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),
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user