mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -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.filmOffset)
|
||||
self.serverList.append(server)
|
||||
self.notify.debug('pre startTimeTask')
|
||||
self.startSynchronizeTimeTask()
|
||||
self.notify.debug('pre startMoveCam')
|
||||
self.startMoveCamTask()
|
||||
self.notify.debug('post startMoveCam')
|
||||
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):
|
||||
self.notify.debug('adding move cam')
|
||||
taskMgr.add(self.moveCameraTask, "moveCamTask", 49)
|
||||
@ -280,6 +293,11 @@ class DisplayConnection:
|
||||
datagram = self.msgHandler.makeExitDatagram()
|
||||
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:
|
||||
def __init__(self, serverConfigName, serverName, serverPort):
|
||||
self.serverConfigName = serverConfigName
|
||||
|
@ -28,10 +28,13 @@ ClientConfigs = {
|
||||
'two-server' : [{'display name' : 'master',
|
||||
'display mode' : 'client',
|
||||
'pos' : Vec3(0),
|
||||
'hpr' : Vec3(30,0,0)},
|
||||
#'hpr' : Vec3(30,0,0)},
|
||||
'hpr' : Vec3(0,0,0)},
|
||||
{'display name' : 'la',
|
||||
'pos' : Vec3(0),
|
||||
'hpr' : Vec3(-30,0,0)}
|
||||
#'hpr' : Vec3(-30,0,0)
|
||||
'hpr' : Vec3(0,0,0)
|
||||
}
|
||||
],
|
||||
'mono-cave' : [{'display name' : 'la',
|
||||
'pos' : Vec3(-0.105, -0.020, 5.000),
|
||||
|
@ -17,6 +17,7 @@ CLUSTER_SWAP_READY = 4
|
||||
CLUSTER_SWAP_NOW = 5
|
||||
CLUSTER_COMMAND_STRING = 6
|
||||
CLUSTER_SELECTED_MOVEMENT = 7
|
||||
CLUSTER_TIME_DATA = 8
|
||||
CLUSTER_EXIT = 100
|
||||
|
||||
#Port number for cluster rendering
|
||||
@ -225,6 +226,21 @@ class ClusterMsgHandler:
|
||||
datagram.addUint8(CLUSTER_EXIT)
|
||||
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:
|
||||
self.startSwapCoordinator()
|
||||
base.graphicsEngine.setAutoFlip(0)
|
||||
# Set global clock mode to non-real time
|
||||
globalClock.setMode(ClockObject.MNonRealTime)
|
||||
# Send verification of startup to client
|
||||
self.daemon = DirectD()
|
||||
# These must be passed in as bootstrap arguments and stored in
|
||||
@ -166,6 +168,9 @@ class ClusterServer(DirectObject.DirectObject):
|
||||
elif (type == CLUSTER_SWAP_NOW):
|
||||
self.notify.debug('swapping')
|
||||
base.graphicsEngine.flipFrame()
|
||||
elif (type == CLUSTER_TIME_DATA):
|
||||
self.notify.debug('time data')
|
||||
self.handleTimeData(dgi)
|
||||
else:
|
||||
self.notify.warning("Received unknown packet type:" % type)
|
||||
return type
|
||||
@ -197,6 +202,14 @@ class ClusterServer(DirectObject.DirectObject):
|
||||
if last:
|
||||
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):
|
||||
""" Handle arbitrary command string from client """
|
||||
command = self.msgHandler.parseCommandStringDatagram(dgi)
|
||||
@ -205,3 +218,4 @@ class ClusterServer(DirectObject.DirectObject):
|
||||
except:
|
||||
pass
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user