@@ -157,15 +157,15 @@ GInput get_key_inputs() {
157
157
return input;
158
158
}
159
159
160
- micro GetFrameTime (float frames_ahead) {
161
- if (frames_ahead >= 1 .0f ) {
162
- return std::chrono::duration_cast<micro >(slow_frame (1 ));
160
+ float GetFrameTime (float frames_ahead) {
161
+ if (frames_ahead >= 1 .f ) {
162
+ return std::chrono::duration< float >(slow_frame (1 )). count ( );
163
163
}
164
- else if (frames_ahead <= -1 .0f ) {
165
- return std::chrono::duration_cast<micro >(fast_frame (1 ));
164
+ else if (frames_ahead <= -1 .f ) {
165
+ return std::chrono::duration< float >(fast_frame (1 )). count ( );
166
166
}
167
167
else {
168
- return std::chrono::duration_cast<micro >(normal_frame (1 ));
168
+ return std::chrono::duration< float >(normal_frame (1 )). count ( );
169
169
}
170
170
171
171
}
@@ -229,90 +229,103 @@ int main(int argc, char* args[])
229
229
}
230
230
231
231
gekko_set_local_delay (sess, localplayer, 1 );
232
- // timing
233
-
234
- gtime_point start_time (gclock::now ());
235
- gtime_point end_time (gclock::now ());
236
232
237
233
int current = 0 ;
238
234
235
+ // timing
236
+ auto curr_time = gclock::now ();
237
+ auto prev_time (gclock::now ());
238
+
239
+ float delta_time = 0 .f ;
240
+ float accumulator = 0 .f ;
241
+ float frame_time = 0 .f ;
242
+ float frames_ahead = 0 .f ;
243
+
239
244
while (running) {
240
- start_time = gclock::now ();
245
+ curr_time = gclock::now ();
241
246
242
- auto frame_time = GetFrameTime (gekko_frames_ahead (sess));
247
+ frames_ahead = gekko_frames_ahead (sess);
248
+ frame_time = GetFrameTime (frames_ahead);
243
249
244
- std::cout << " ft: " << frame_time.count () << std::endl;
250
+ delta_time = std::chrono::duration<float >(curr_time - prev_time).count ();
251
+ prev_time = curr_time;
245
252
246
- process_events () ;
253
+ accumulator += delta_time ;
247
254
248
- // add local inputs to the session
249
- auto input = get_key_inputs ();
250
- gekko_add_local_input (sess, localplayer, &input);
255
+ gekko_network_poll (sess);
251
256
252
- int count = 0 ;
253
- auto events = gekko_session_events (sess, &count);
254
- for (int i = 0 ; i < count; i++) {
255
- auto event = events[i];
257
+ while (accumulator >= frame_time) {
256
258
257
- printf (" EV: %d\n " , event->type );
259
+ GekkoNetworkStats stats{};
260
+ gekko_network_stats (sess, localplayer == 0 ? 1 : 0 , &stats);
258
261
259
- if (event->type == DesyncDetected) {
260
- auto desync = event->data .desynced ;
261
- printf (" desync detected, f:%d, rh:%d, lc:%u, rc:%u\n " , desync.frame , desync.remote_handle , desync.local_checksum , desync.remote_checksum );
262
- }
262
+ std::cout << " ping: " << stats.last_ping
263
+ << " avg ping: " << stats.avg_ping
264
+ << " jitter: " << stats.jitter
265
+ << " ft: " << frame_time
266
+ << " fa: " << frames_ahead
267
+ << std::endl;
263
268
264
- if (event->type == PlayerDisconnected) {
265
- auto disco = event->data .disconnected ;
266
- printf (" disconnect detected, player: %d\n " , disco.handle );
267
- }
268
- }
269
+ process_events ();
269
270
270
- count = 0 ;
271
- auto updates = gekko_update_session (sess, &count);
272
- for (int i = 0 ; i < count; i++) {
273
- auto ev = updates[i];
271
+ // add local inputs to the session
272
+ auto input = get_key_inputs ();
273
+ gekko_add_local_input (sess, localplayer, &input);
274
274
275
- switch (ev->type ) {
276
- case SaveEvent:
277
- printf (" Save frame:%d\n " , ev->data .save .frame );
278
- save_state (&state, ev);
279
- break ;
280
- case LoadEvent:
281
- printf (" Load frame:%d\n " , ev->data .load .frame );
282
- load_state (&state, ev);
283
- break ;
284
- case AdvanceEvent:
285
- // on advance event, advance the gamestate using the given inputs
286
- inputs[0 ].input .value = ev->data .adv .inputs [0 ];
287
- inputs[1 ].input .value = ev->data .adv .inputs [1 ];
288
- current = ev->data .adv .frame ;
289
- printf (" F:%d, P1:%d P2:%d\n " , current, inputs[0 ].input .value , inputs[1 ].input .value );
290
- // now we can use them to update state.
291
- update_state (state, inputs, num_players);
292
- break ;
293
- default :
294
- printf (" Unknown Event: %d\n " , ev->type );
295
- break ;
275
+ int count = 0 ;
276
+ auto events = gekko_session_events (sess, &count);
277
+ for (int i = 0 ; i < count; i++) {
278
+ auto event = events[i];
279
+
280
+ printf (" EV: %d\n " , event->type );
281
+
282
+ if (event->type == DesyncDetected) {
283
+ auto desync = event->data .desynced ;
284
+ printf (" desync detected, f:%d, rh:%d, lc:%u, rc:%u\n " , desync.frame , desync.remote_handle , desync.local_checksum , desync.remote_checksum );
285
+ }
286
+
287
+ if (event->type == PlayerDisconnected) {
288
+ auto disco = event->data .disconnected ;
289
+ printf (" disconnect detected, player: %d\n " , disco.handle );
290
+ }
296
291
}
297
- }
298
292
293
+ count = 0 ;
294
+ auto updates = gekko_update_session (sess, &count);
295
+ for (int i = 0 ; i < count; i++) {
296
+ auto ev = updates[i];
297
+
298
+ switch (ev->type ) {
299
+ case SaveEvent:
300
+ printf (" Save frame:%d\n " , ev->data .save .frame );
301
+ save_state (&state, ev);
302
+ break ;
303
+ case LoadEvent:
304
+ printf (" Load frame:%d\n " , ev->data .load .frame );
305
+ load_state (&state, ev);
306
+ break ;
307
+ case AdvanceEvent:
308
+ // on advance event, advance the gamestate using the given inputs
309
+ inputs[0 ].input .value = ev->data .adv .inputs [0 ];
310
+ inputs[1 ].input .value = ev->data .adv .inputs [1 ];
311
+ current = ev->data .adv .frame ;
312
+ printf (" F:%d, P1:%d P2:%d\n " , current, inputs[0 ].input .value , inputs[1 ].input .value );
313
+ // now we can use them to update state.
314
+ update_state (state, inputs, num_players);
315
+ break ;
316
+ default :
317
+ printf (" Unknown Event: %d\n " , ev->type );
318
+ break ;
319
+ }
320
+ }
321
+ // frame done.
322
+ accumulator -= frame_time;
323
+ }
299
324
// draw the state every iteration
300
325
SDL_SetRenderDrawColor (renderer, 0 , 0 , 0 , 255 );
301
326
SDL_RenderClear (renderer);
302
327
render_state (state);
303
328
SDL_RenderPresent (renderer);
304
-
305
- end_time = gclock::now ();
306
-
307
- auto work_time = std::chrono::duration_cast<micro>(end_time - start_time);
308
- // std::cout << "wt: " << work_time.count() << std::endl;
309
-
310
- auto adjusted_sleep = frame_time - work_time;
311
- // std::cout << "st: " << adjusted_sleep.count() << std::endl;
312
-
313
- if (adjusted_sleep.count () > 0 ) {
314
- std::this_thread::sleep_for (adjusted_sleep);
315
- }
316
329
}
317
330
318
331
del_window ();
0 commit comments