ref: 25d7ad5e4fb40d731f3433df3dc684c334943d25
parent: 13a1e63e933a134d7b852f84f94e9753d3552976
author: qwx <qwx@sciops.net>
date: Sat Mar 15 09:40:29 EDT 2025
improve input lag and handling (esp. joysticks), use nanosec
--- a/gm4s.c
+++ b/gm4s.c
@@ -48,12 +48,17 @@
static void
pollproc(void *)
{
- int dt;
- ulong k, ke, old;
+ int r;
+ ulong k, ke, km, old;
+ u64int t, t0;
for(old=0;;){
if(recv(keychan, &ke) < 0)
return;
+ if(ke == 0){
+ old = keys & Ktriggers;
+ continue;
+ }
k = ke ^ ke & old;
old = ke & Ktriggers;
if(k == 0)
@@ -60,15 +65,31 @@
continue;
if(send(evc, &k) < 0)
return;
- for(dt=125, k&=Kmove; k&Kmove; k&=Kmove){
- sleep(dt);
- switch(nbrecv(keychan, &ke)){
- case -1: return;
- case 1: k = ke ^ ke & old; old = ke & Ktriggers; break;
+ t0 = nanosec() / MILLION + 125;
+ for(k&=Kmove, km=k; k&Kmove; k&=Kmove){
+ if((r = nbrecv(keychan, &ke)) < 0)
+ return;
+ else if(r == 0){
+ if((t = nanosec() / MILLION) >= t0){
+ if(send(evc, &k) < 0)
+ return;
+ t0 = t + 50;
+ }
+ old = keys & Ktriggers;
+ sleep(1);
+ continue;
}
+ if(ke == 0){
+ old = keys & Ktriggers;
+ break;
+ }
+ k = ke ^ ke & old;
+ old = ke & Ktriggers;
+ if(k == km)
+ continue;
if(send(evc, &k) < 0)
return;
- dt = 40;
+ t0 = nanosec() / MILLION + 50;
}
}
}
@@ -79,10 +100,10 @@
double t0;
vlong t, Δt;
- t0 = nsec();
+ t0 = nanosec();
for(;;){
nbsendul(stepc, 1);
- t = nsec();
+ t = nanosec();
Δt = t - t0;
t0 += T * (1 + Δt / T);
if(Δt < T)
--
⑨