TUTORIAL: Account for network lag.
This commit is contained in:
parent
4a6d83d55c
commit
0acb1e30ca
@ -23,6 +23,7 @@
|
|||||||
#include <guacamole/layer.h>
|
#include <guacamole/layer.h>
|
||||||
#include <guacamole/protocol.h>
|
#include <guacamole/protocol.h>
|
||||||
#include <guacamole/socket.h>
|
#include <guacamole/socket.h>
|
||||||
|
#include <guacamole/timestamp.h>
|
||||||
#include <guacamole/user.h>
|
#include <guacamole/user.h>
|
||||||
|
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
@ -37,15 +38,30 @@ void* ball_render_thread(void* arg) {
|
|||||||
guac_client* client = (guac_client*) arg;
|
guac_client* client = (guac_client*) arg;
|
||||||
ball_client_data* data = (ball_client_data*) client->data;
|
ball_client_data* data = (ball_client_data*) client->data;
|
||||||
|
|
||||||
|
/* Init time of last frame to current time */
|
||||||
|
guac_timestamp last_frame = guac_timestamp_current();
|
||||||
|
|
||||||
/* Update ball position as long as client is running */
|
/* Update ball position as long as client is running */
|
||||||
while (client->state == GUAC_CLIENT_RUNNING) {
|
while (client->state == GUAC_CLIENT_RUNNING) {
|
||||||
|
|
||||||
/* Sleep a bit */
|
/* Default to 30ms frames */
|
||||||
usleep(30000);
|
int frame_duration = 30;
|
||||||
|
|
||||||
|
/* Lengthen frame duration if client is lagging */
|
||||||
|
int processing_lag = guac_client_get_processing_lag(client);
|
||||||
|
if (processing_lag > frame_duration)
|
||||||
|
frame_duration = processing_lag;
|
||||||
|
|
||||||
|
/* Sleep for duration of frame, then get timestamp */
|
||||||
|
usleep(frame_duration);
|
||||||
|
guac_timestamp current = guac_timestamp_current();
|
||||||
|
|
||||||
|
/* Calculate change in time */
|
||||||
|
int delta_t = current - last_frame;
|
||||||
|
|
||||||
/* Update position */
|
/* Update position */
|
||||||
data->ball_x += data->ball_velocity_x * 30 / 1000;
|
data->ball_x += data->ball_velocity_x * delta_t / 1000;
|
||||||
data->ball_y += data->ball_velocity_y * 30 / 1000;
|
data->ball_y += data->ball_velocity_y * delta_t / 1000;
|
||||||
|
|
||||||
/* Bounce if necessary */
|
/* Bounce if necessary */
|
||||||
if (data->ball_x < 0) {
|
if (data->ball_x < 0) {
|
||||||
@ -73,6 +89,9 @@ void* ball_render_thread(void* arg) {
|
|||||||
guac_client_end_frame(client);
|
guac_client_end_frame(client);
|
||||||
guac_socket_flush(client->socket);
|
guac_socket_flush(client->socket);
|
||||||
|
|
||||||
|
/* Update timestamp */
|
||||||
|
last_frame = current;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user