@@ -73,7 +73,9 @@ public void Update(float deltaTime)
7373 _accumulatedTime += deltaTime ;
7474
7575 while ( _accumulatedTime >= _tickDt )
76- {
76+ {
77+
78+ _logger . Warn ( " ========= " + ( _systems . CurrentTick + 1 ) + " ========= " ) ;
7779
7880 Tick ( ) ;
7981
@@ -82,20 +84,20 @@ public void Update(float deltaTime)
8284 }
8385
8486 private void Tick ( )
85- {
87+ {
8688 ICommand [ ] frameCommands ;
8789 lock ( _temporaryCommandBuffer )
8890 {
8991 frameCommands = _temporaryCommandBuffer . ToArray ( ) ;
9092 _temporaryCommandBuffer . Clear ( ) ;
91- }
92-
93+ }
94+
9395 if ( frameCommands . Length > 0 )
9496 {
9597 LocalCommandBuffer . Insert ( _systems . CurrentTick + LagCompensation , LocalPlayerId , frameCommands ) ;
9698 RemoteCommandBuffer . Insert ( _systems . CurrentTick + LagCompensation , LocalPlayerId , frameCommands ) ;
9799 }
98-
100+
99101 _systems . Tick ( LocalCommandBuffer . GetMany ( _systems . CurrentTick ) ) ;
100102
101103 Ticked ? . Invoke ( _systems . CurrentTick ) ;
@@ -106,26 +108,31 @@ private void SyncCommandBuffer()
106108 var currentRemoteFrame = RemoteCommandBuffer . LastInsertedFrame ;
107109
108110 if ( LastValidatedFrame < currentRemoteFrame )
109- {
110- var revertTick = currentRemoteFrame ;
111+ {
112+ _logger . Warn ( "Catching up: " + LastValidatedFrame + " -> " + currentRemoteFrame + " of " + _systems . CurrentTick ) ;
113+
114+ var revertFrame = currentRemoteFrame ; //We guess everything was predicted correctly
111115
112116 for ( var remoteFrame = LastValidatedFrame + 1 ; remoteFrame <= currentRemoteFrame ; remoteFrame ++ )
113117 {
118+ //All frames that have no commands were predicted correctly => increase remote frame
114119 var allPlayerCommands = RemoteCommandBuffer . Get ( remoteFrame ) ;
115120 if ( allPlayerCommands . Count <= 0 )
116121 {
117122 continue ;
118123 }
119124
120- if ( remoteFrame < revertTick )
125+ if ( remoteFrame < revertFrame )
121126 {
122- //Save the first tick which contains remote commands
123- revertTick = remoteFrame ;
127+ //Store the first frame where predicion was false (frame has commands)
128+ revertFrame = remoteFrame ;
124129 }
125130
126131 //Merge commands into the local command buffer
127132 foreach ( var commandPerPlayer in allPlayerCommands )
128133 {
134+
135+ _logger . Warn ( "Insert remote commands from " + remoteFrame ) ;
129136 LocalCommandBuffer . Insert ( remoteFrame , commandPerPlayer . Key , commandPerPlayer . Value . ToArray ( ) ) ;
130137 }
131138 }
@@ -135,11 +142,22 @@ private void SyncCommandBuffer()
135142 {
136143 var targetTick = _systems . CurrentTick ;
137144
138- _systems . RevertToTick ( revertTick ) ;
139-
140- while ( _systems . CurrentTick < targetTick )
141- {
142- _systems . Tick ( LocalCommandBuffer . GetMany ( _systems . CurrentTick ) ) ;
145+ //Revert everything that happened one tick after the last validated input
146+ _systems . RevertFromTick ( revertFrame + 1 ) ;
147+
148+ //Execute all commands again, beginning from the first frame that contains remote input
149+ while ( revertFrame <= targetTick )
150+ {
151+ if ( LocalCommandBuffer . GetMany ( _systems . CurrentTick ) . Length > 0 )
152+ {
153+
154+ _logger . Warn ( "Execute " + LocalCommandBuffer . GetMany ( revertFrame ) . Length + " commands from tick " + revertFrame ) ;
155+ }
156+
157+ _logger . Warn ( ">>>>========= " + ( revertFrame ) + " ========= " ) ;
158+ _systems . Tick ( LocalCommandBuffer . GetMany ( revertFrame ) ) ;
159+
160+ revertFrame ++ ;
143161 }
144162 }
145163
0 commit comments