shithub: gm4s

Download patch

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)
--