internal int ExportData(SWBytes buffer) { _byteBuffer.Reset(); foreach (IFrameSyncData frameSyncData in _frameSyncDatas) { frameSyncData.Export(_byteBuffer); } int dataSize = 0; if (largeDataContainer) { UInt16 size = (UInt16)_byteBuffer.DataLength; buffer.Push(size); dataSize = 2 + size; } else { byte size = (byte)_byteBuffer.DataLength; buffer.Push(size); dataSize += 1 + size; } buffer.PushAll(_byteBuffer); return(dataSize); }
void SendLocalInputs() { if (_localInputFrameDeltaNumberToSend == 0) { _localInputFrameDeltaNumberToSend = _currentLocalInputFrameDeltaNumber; } _sendLocalInputDeltaBuffer.Reset(); int end = _localInputFrameDeltaNumberToSend + FrameSyncConstant.LOCAL_INPUT_FRAME_RESEND_COUNT; if (end > _currentLocalInputFrameDeltaNumber) { end = _currentLocalInputFrameDeltaNumber; } int count = 0; for (int i = _localInputFrameDeltaNumberToSend; i <= end; i++) { InputFrameDelta inputFrameDelta = localInputFrameDeltas[i]; _sendLocalInputDeltaBuffer.Push(inputFrameDelta.frameNumber); byte length = (byte)inputFrameDelta.bytes.DataLength; _sendLocalInputDeltaBuffer.Push(length); _sendLocalInputDeltaBuffer.PushAll(inputFrameDelta.bytes); count++; inputFrameDelta.resend = inputFrameDelta.resend - 1; if (inputFrameDelta.resend == 0) { _localInputFrameDeltaNumberToSend++; } } if (count > 0) { _io.SendInputFrameDeltas(_sendLocalInputDeltaBuffer, count, _input.Size); } }
void CombineSavedInputFiles() { return; string fileName = _game.replayFileName; string[] savedFiles = SWLocalStorage.GetFilesWithPartialName(FrameSyncConstant.DEFAULT_DIRECTORY, fileName); if (savedFiles.Length == 0) { return; } SortedList <int, string> orderedFiles = new SortedList <int, string>(); List <int> sortedIndexes = new List <int>(); foreach (string saveFile in savedFiles) { Debug.Log($"saveFile={saveFile}"); string frameNumber = saveFile.Substring(saveFile.LastIndexOf(fileName) + fileName.Length); Debug.Log($"frameNumber={frameNumber}"); long frameNumberLong = 0; bool good = long.TryParse(frameNumber, out frameNumberLong); if (!good) { continue; } int low = (int)(frameNumberLong / 1000000); int high = (int)(frameNumberLong % 100000); int size = high - low; Debug.Log($"low={low} high={high} size={size}"); orderedFiles[low] = saveFile; sortedIndexes.Add(low); sortedIndexes.Add(high); } sortedIndexes.Sort(); int count = sortedIndexes.Count; bool verified = true; for (int i = 0; i < count; i++) { if (i == count - 1) { break; } if (i % 2 == 1) { bool match = sortedIndexes[i] == sortedIndexes[i + 1]; if (!match) { verified = false; break; } } } if (!verified) { Debug.Log("Corrupted files"); } int startFrameNumber = sortedIndexes[0]; int endFrameNumber = sortedIndexes[sortedIndexes.Count - 1]; Debug.Log($"start={startFrameNumber} end={endFrameNumber}"); int estimatedSize = (endFrameNumber - startFrameNumber) * InputFrameDelta.DataSize + 100; byte[] dataToSave = new byte[estimatedSize]; SWBytes combinedBuffer = new SWBytes(dataToSave); PersistentArrayMetaData metaData = new PersistentArrayMetaData(); metaData.itemCount = endFrameNumber - startFrameNumber; combinedBuffer.SetWriteIndex(PersistentArrayMetaData.DataSize); foreach (var orderedFile in orderedFiles) { byte[] data; int length = SWLocalStorage.LoadFromFile(orderedFile.Value, out data); SWBytes dataBuffer = new SWBytes(data); //Debug.Log($"Combined add={dataBuffer.FullString()}"); combinedBuffer.PushAll(dataBuffer); Debug.Log($"Remove {orderedFile.Value}"); SWLocalStorage.RemoveFile(orderedFile.Value); } combinedBuffer.SetReadIndex(PersistentArrayMetaData.DataSize); metaData.checksum = combinedBuffer.Crc32(); int end = combinedBuffer.GetWriteIndex(); combinedBuffer.SetWriteIndex(0); //Debug.Log($"Combined before meta={combinedBuffer.FullString()}"); metaData.Export(combinedBuffer); //Debug.Log($"Combined after meta={combinedBuffer.FullString()}"); combinedBuffer.SetWriteIndex(end); combinedBuffer.SetReadIndex(0); //Debug.Log($"Combined combinedBuffer={combinedBuffer.FullString()}"); SaveReplayoperation operation = new SaveReplayoperation(combinedBuffer.Data(), fileName + ".play"); operationQueue.AddOperation(operation); }
public void Export(SWBytes buffer) { buffer.PushFront((UInt16)bytes.DataLength); buffer.PushAll(bytes); }
void DoTick() { _frameNumber++; _sealedFrameNumber = _frameNumber - 10; if (_sealedFrameNumber < 1) { _sealedFrameNumber = 1; } if (_receivedInputFrameDeltas.Count > 0) { SWConsole.Crit($"MockIO: DoTick playerFrameCount={_receivedInputFrameDeltas.Count}"); InputFrameDelta delta = _receivedInputFrameDeltas.Peek(); if (true) { delta = _receivedInputFrameDeltas.Dequeue(); //SWConsole.Crit($"MockIO: DoTick playerFrameCount 1 ={_receivedInputFrameDeltas.Count}"); _inputFrameDeltas[_frameNumber] = delta; _data.Reset(); byte length = (byte)delta.bytes.DataLength; _data.Push(length); _data.PushAll(delta.bytes); SWConsole.Crit($"MockIO: DoTick send PLAYER={delta.frameNumber} roomStep={_frameNumber}"); MockHandleInputFrameOperaion operation = new MockHandleInputFrameOperaion(_handler, _pingMilliseconds); operation.inputFrameData = SWBytes.Clone(_data); operation.playerLastInputFrameOnServer = _receivedInputFrameDeltas.Count; operation.predictionFrameNumber = _predictedFrameNumber; operation.correctFrameNumber = _correctFrameNumber; operation.roomStep = _frameNumber; operation.sealedFrameNumber = _sealedFrameNumber; _operationQueue.AddOperation(operation); return; } //else if(delta.predictedServerFrameNumber < _frameNumber) //{ // delta = _receivedInputFrameDeltas.Dequeue(); // delta.version = 1; // _inputFrameDeltas[delta.predictedServerFrameNumber] = delta; // _data.Reset(); // byte length = (byte)delta.bytes.DataLength; // _data.Push(length); // _data.Push(delta.bytes, 0); // SWConsole.Crit($"MockIO: DoTick send PLAYER={delta.frameNumber} roomStep={_frameNumber} prediction={delta.predictedServerFrameNumber}"); // _frameNumber--; // _sealedFrameNumber = _frameNumber - 10; // if (_sealedFrameNumber < 1) // { // _sealedFrameNumber = 1; // } // MockHandleInputFrameOperaion operation = new MockHandleInputFrameOperaion(_handler, _pingMilliseconds); // operation.inputFrameData = SWBytes.Clone(_data); // operation.playerLastInputFrameOnServer = _receivedInputFrameDeltas.Count; // operation.predictionError = _predictionError; // operation.roomStep = delta.predictedServerFrameNumber; // operation.version = delta.version; // operation.sealedFrameNumber = _sealedFrameNumber; // _operationQueue.AddOperation(operation); // return; //} } { _lastPredictedFrameNumber = _frameNumber; InputFrameDelta delta = new InputFrameDelta(); delta.frameNumber = 0; //playerFrameNumber _inputFrameDeltas[_frameNumber] = delta; _data.Reset(); _data.Push((byte)0); //length SWConsole.Crit($"MockIO: DoTick send EMPTY={delta.frameNumber} roomStep={_frameNumber}"); MockHandleInputFrameOperaion operation = new MockHandleInputFrameOperaion(_handler, _pingMilliseconds); operation.inputFrameData = SWBytes.Clone(_data); operation.playerLastInputFrameOnServer = _receivedInputFrameDeltas.Count; operation.predictionFrameNumber = _predictedFrameNumber; operation.correctFrameNumber = _correctFrameNumber; operation.roomStep = _frameNumber; operation.sealedFrameNumber = _sealedFrameNumber; _operationQueue.AddOperation(operation); } }