internal void ApplyPrediction(FrameSyncInput input, InputFrame i1, InputFrame i2) { //copy i1 to i2 SWBytes.CopyFull(i1.bytes, i2.bytes); //let input reset //important to reset triggers input.InputJustCopied(i2.bytes); byte inputSize = input.Size; if (bytes.DataLength > 0) { byte playerCount = bytes.PopByte(); for (int i = 0; i < playerCount; i++) { byte playerID = bytes.PopByte(); FrameSyncPlayer player = input.GetPlayer(playerID); byte offset = player.InputOffset; SWBytes.Copy(bytes, i2.bytes, bytes.ReadIndex, offset, inputSize); bytes.SkipRead(inputSize); } } //reset read index bytes.SetReadIndex(0); //prepare bitarray input.InputDeltaJustApplied(i2.bytes); }
internal void Apply(FrameSyncInput input, InputFrame i1, InputFrame i2) { //copy i1 to i2 SWBytes.CopyFull(i1.bytes, i2.bytes); //let input reset //important to reset triggers input.InputJustCopied(i2.bytes); //apply delta for each player byte inputSize = input.Size; SWConsole.Crit($"ApplyDelta delta frameNumber={frameNumber} {bytes.FullString()}"); while (bytes.DataLength > 0) { byte playerID = bytes.PopByte(); FrameSyncPlayer player = input.GetPlayer(playerID); if (player == null) { SWConsole.Error($"InputFrameDelta Apply: player not found {playerID}"); } byte offset = player.InputOffset; SWBytes.Copy(bytes, i2.bytes, bytes.ReadIndex, offset, inputSize); bytes.SkipRead(inputSize); } //reset read index bytes.SetReadIndex(0); //prepare bitarray input.InputDeltaJustApplied(i2.bytes); }
public void HandleInputFrameInBackground(SWBytes inputFrame, int playerFrameCountOnServer, int roomStep, int playerFrameNumber) { lock (FRAME_SYNC_LOCK) { SWConsole.Crit($"<<<======Engine: HandleInputFrameInBackground roomStep={roomStep} playerFrameCountOnServer={playerFrameCountOnServer} playerFrameNumber={playerFrameNumber}"); if (_game.gameState == FrameSyncGameState.Stopped) { SWConsole.Crit($"Engine: HandleInputFrameInBackground game stopped"); return; } _playerFrameCountOnServer = playerFrameCountOnServer; if (_lastReceivedInputFrameDeltaNumber == 0) { int startIndex = roomStep - 10; if (startIndex < 0) { startIndex = 0; } InitializeFrames(startIndex); _lastReceivedInputFrameDeltaNumber = roomStep; InputFrameDelta firstDelta = new InputFrameDelta(roomStep); firstDelta.playerFrameNumber = playerFrameNumber; byte length = inputFrame.PopByte(); SWBytes.Copy(inputFrame, firstDelta.bytes, length); inputFrameDeltas[roomStep] = firstDelta; _currentInputFrameNumber = 0; //will be updated in the waiting for room frame state _currentLocalInputFrameDeltaNumber = 0; SWConsole.Crit($"Engine: HandleInputFrameInBackground startIndex={startIndex}"); return; } InputFrameDelta delta = inputFrameDeltas[roomStep]; if (delta == null) { delta = new InputFrameDelta(); inputFrameDeltas[roomStep] = delta; } if (delta.frameNumber == roomStep) { SWConsole.Crit($"HandleInputFrameInBackground already has {roomStep}"); } else { delta.frameNumber = roomStep; delta.playerFrameNumber = playerFrameNumber; SWConsole.Crit($"HandleInputFrameInBackground copy roomStep={roomStep}");// bytes={inputFrame.FullString()}"); byte length = inputFrame.PopByte(); SWBytes.Copy(inputFrame, delta.bytes, length); } //SWConsole.Crit($"Engine: HandleInputFrameInBackground roomStep={roomStep} _lastReceivedInputFrameDeltaNumber={_lastReceivedInputFrameDeltaNumber}"); if (roomStep == _lastReceivedInputFrameDeltaNumber + 1) { if (_firstFrameReceived == 0) { //set firstFrameReceived when we have subsequence room steps _firstFrameReceived = _lastReceivedInputFrameDeltaNumber; } _lastReceivedInputFrameDeltaNumber = roomStep; //check if there is any more received frames bool shouldContinue = true; int nextFrameNumber = roomStep + 1; while (shouldContinue) { InputFrameDelta nextDelta = inputFrameDeltas[nextFrameNumber]; if (nextDelta == null) { break; } if (nextDelta.frameNumber != nextFrameNumber) { break; } _lastReceivedInputFrameDeltaNumber = nextFrameNumber; nextFrameNumber++; } } } }
internal void ReadServerInputFrameDelta(SWBytes data) { SWBytes.Copy(data, bytes); }
private void _tcpConnection_OnConnectionNewPacket(byte[] data, int length) { SWBytes.Copy(data, 0, length, _tcpTempBytes); Util.PrintSWBytes(_tcpTempBytes, "FrameSyncDebugger: New TCP Packet ="); }