INKEY$ verschluckt Tastaturanschläge

Previous topic - Next topic

S. P. Gardebiter

Hallo. Ich habe mir eine eigene INPUT Funktion mit INKEY$ geschrieben aber INKEY$ verschluckt bei mir regelmäßig einige Tasten, da ich schnell tippe und meine eigene INPUT Funktion scheint manchmal etwas zähflüssig zu sein.

Irgendeine Idee? Für mich sieht das schwer nach einem Bug aus :S

Code (glbasic) Select
IF Typing = TRUE OR Console = TRUE
NewChar$ = INKEY$()
IF ASC(NewChar$) = 8
NewLine$ = MID$(NewLine$, 0, LEN(NewLine$) - 1)
ELSEIF ASC(NewChar$) >= 32
NewLine$ = NewLine$ + NewChar$
ENDIF
IF Console = TRUE
IF FPSC > 30
PRINT NewLine$, 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ELSE
PRINT NewLine$ + "|", 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ENDIF
ELSE
IF FPSC > 30
PRINT "Say: " + NewLine$, 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ELSE
PRINT "Say: " + NewLine$ + "|", 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ENDIF
ENDIF
ENDIF
~ Cave Story rules! ~

Kitty Hello

oh. Der Puffer ist (glaub) nur 4 Zeichen pro SHOWSCREEN. Bist Du so schnell?

S. P. Gardebiter

Quote from: Kitty Hello on 2011-May-30
oh. Der Puffer ist (glaub) nur 4 Zeichen pro SHOWSCREEN. Bist Du so schnell?

Ah, das könnte die Eklärung dafür sein.
Naja ich weiß nicht wie schnell man dafür sein muss aber es scheint wohl so zu sein. o: Selbst wenn ich mich nicht anstrenge besonders schnell zu tippen, mache ich durchschnittlich ca. 530 Anschläge pro Minute.
Gibt es einen Weg den Buffer zu erhöhen? Dann könnte ich prüfen ob es daran liegt.
Man könnte ihn auch auf die physisch maximal erreichbare Anzahl an Anschlägen ausrichten, (ca. 750 Anschläge pro Minute) falls ihn das nicht zu groß machen würde.
~ Cave Story rules! ~

Schranz0r

4 Anschläge pro Showscreen schaft du niemals :D

530 Anschläge / 60 Sekunden = 8.83 Anschläge pro Sekunde, was schon krass ist!
ABER:

Nehmen wir mal 30 FPS (Frames per second) an, dann sind das ~9 / 30 = 0,3 Anschläge pro Frame... Also Showscreen!
Und 4 sind pro Frame da... reicht!

Oder rechne ich falsch... o.O
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

S. P. Gardebiter

#4
Das ist ja ledeglich die Durchschnittsgeschwindigkeit und hat nichts mit einzellnen "Spitzenleistungen" zutun o:
Falls du aber recht hast und es nicht am Buffer liegt, dann muss es zwangsläufig was anderes sein, denn bei anderen Programmen habe ich dieses Problem nicht, ebenso nicht bei der originalen INPUT Funktion und mein Code scheint ja auch in Ordnung zu sein O:
Ich denke es wäre zumindest einen Versuch Wert, mal zu prüfen ob es am Buffer liegt.
~ Cave Story rules! ~

Schranz0r

Naja standartmässig läuft ja GLBasic auf 60 Frames pro Sekunde
Ich bin der Meinung du schafst das so nicht....

Ich kann mir nur vorstellen, das dein Code ab und an mal das Schreiben überspringt?
Keine Ahnung wie du es eingebaut hast...
Spiel doch mal mit den FPS rum, LIMITFPS -1 und teste es nochmal, oder ich liege falsch und du musst mit den FPS runter?!
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

S. P. Gardebiter

#6
Quote from: Schranz0r on 2011-May-30Ich kann mir nur vorstellen, das dein Code ab und an mal das Schreiben überspringt?

Das halte ich zu 100% für ausgeschlossen. o:
Dann könnte es nämlich nur an meiner KeyHit Funktion liegen und wenn die rumspinnt, würde er die Eingabe automatisch bestätigen.

Quote from: Schranz0r on 2011-May-30Spiel doch mal mit den FPS rum, LIMITFPS -1 und teste es nochmal, oder ich liege falsch und du musst mit den FPS runter?!

Ich komme leider nicht über 72 FPS, obwohl ich es eigentlich müsste. (Früher gings ja auch) Mein Spiel läuft standardmäßig auf 60 FPS. Wenn ich die FPS erhöhe müsste sich aber eigentlich auch der INKEY$ Buffer schneller leeren, also beweist das nicht unbedingt irgendwas.

Edit: Bei mir ist die länge von INKEY$ auch immer nur 1, höchstens, mehr als einen Char scheint er nicht raus zu geben o:
Warum funktioniert eigentlich "^" so komisch mit INKEY$? Er gibt nur ein "^" raus wenn ich zweimal auf die Taste drücke und wenn ich einmal draufdrücke und dann auf eine andere z.B. auf die 1, dann gibt er anstatt "^1", garnichts raus.
~ Cave Story rules! ~

Kitty Hello

OK, puffer ist 16 Zeichen pro SHOWSCREEN. Das ist zuu krass.

Du musst, wenn inkey$() ungleich "" ist, nochmal durchprüfen, was inkey$ ist, bis es leer ist. Danach erst showscreen.

Code (glbasic) Select

IF Typing = TRUE OR Console = TRUE
     REPEAT
NewChar$ = INKEY$()
IF ASC(NewChar$) = 8
NewLine$ = MID$(NewLine$, 0, LEN(NewLine$) - 1)
ELSEIF ASC(NewChar$) >= 32
NewLine$ = NewLine$ + NewChar$
ENDIF
IF Console = TRUE
IF FPSC > 30
PRINT NewLine$, 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ELSE
PRINT NewLine$ + "|", 3, INTEGER((ScreenH / 2 + ScreenH / 8) / 16) * 16, TRUE
ENDIF
ELSE
IF FPSC > 30
PRINT "Say: " + NewLine$, 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ELSE
PRINT "Say: " + NewLine$ + "|", 16, ScreenH / 2 + ScreenH / 4 + ScreenH / 8, TRUE
ENDIF
ENDIF
ENDIF
     UNTIL LEN(NewChar$) = 0

S. P. Gardebiter

#8
Ah, okay, mit dem neuen Code funktioniert es schonmal viel besser, allerdings noch nicht perfekt. Wenn das nächste Update draußen ist, werden wir es ja sehen :)
Danke für eure Hilfe.

Edit: Ich bin mir nicht mehr so sicher ob das überhaupt etwas verändert hat. Ich habe mir eine Funktion geschrieben, mit der ich überprüfen kann wie oft er die Schleife durchläuft. Wenn ich zähle wie oft er durchläuft komme ich oft nur auf "1", selten mal auf "2". Habe auch überprüft ob die Schleife jeden Frame durchläuft und das tut sie. Sicher, dass der Buffer oder irgendwas ähnliches nicht verbuggt ist? o: Wenn ich zwei Tasten gleichzeitig drücke wird nur einer der beiden Buchstaben auf den Bildschirm geschrieben.
~ Cave Story rules! ~

Kitty Hello

Code (glbasic) Select

     REPEAT
NewChar$ = INKEY$()
IF ASC(NewChar$) = 8
NewLine$ = LEFT$(NewLine$, LEN(NewLine$) - 1)
ELSEIF ASC(NewChar$) >= 32
INC NewLine$, NewChar$
ENDIF
     UNTIL LEN(NewChar$) = 0


besser?

S. P. Gardebiter

#10
Nein, genau das gleiche wie eben auch O:

Edit: So, hab mal meine Funktion "getuned", hier ist das Ergebnis:

(zur besseren Übersicht entfernt)

Korrekt müsste es heißen: "Hallo, ich bin S. P. Gardebiter"
Manchmal verschluckt er auch noch mehr.
Wahrscheinlich hatte Schranzor recht, ich schaffe bestimmt keine 2 Zeichen pro Frame. Aber dennoch verschluckt er einiges. Wie lange brauch er denn um den Buffer zu leeren?


Edit edit: Vergesst es, ich bin dumm. Der Buffer von INKEY$ funktioniert nicht korrekt, INKEY$ gibt immer nur eine Taste raus und das kann ich auch beweisen:
Ich habe mir gerade eine schrottige Funktion geschrieben die ähnlich wie INKEY$ funktioniert: Sie überprüft ob eine Taste gedrückt worden ist und gibt dann die jeweiligen Buchstaben zurück.
Hier war es genau das gleiche Problem wie bei INKEY$, es wurden Tastaturanschläge verschluckt, also dachte ich mir, anstatt die Buchstaben gleich zurück zu geben, speichere ich sie nacheinander in eine Variable und gebe sie dann aus.
Ergebnis war folgendes:

http://tile44.org/files/Console.log

Ok, beim ersten Satz ein paar Tippfehler sonst aber völlig okay, was jetzt schon auffällt ist aber: Ich schaffe es tatächlich manchmal 2 Buchstaben pro Frame zu schreiben. Auch sind teilweise die Abstände zwischen 2 Buchstaben nur 2 Frames groß.

Nun wird es aber interessant:

"SPG~0: viel zu shcnell"

Nein, diesmal kein Tippfehler. Ich überprüfe die "h" Taste vor der "c" Taste und da ich beide in einem Frame geschrieben habe wird das h einfach vor das c gesetzt wegen des Codes.

"SPG~0: ich tipe zu schnell"

Da, wieder, kein Tippfehler. Das "p" ist nur einmal da und da ich keinen Buffer bei der Funktion benutzt habe, weiß ich nicht wie oft das "p" in einem Frame benutzt wurde. Daher wird auch nur eins angefügt.

"SPG~0: viel zu schnel"

Das gleiche, nur diesmal mit dem "l".
Das erklärt auch die auffallend hohe Fehlerquote bei Wörten die zwei gleiche Buchstaben nebeneinander haben: Hier kann ich viel schneller reagieren und es durchaus in einem Frame schaffen zwei Buchstaben hintereinander zu schreiben. Bei den anderen Dingen war es halt mehr oder weniger Glück wenn ich es geschafft habe, d.h.: Der Buffer von INKEY$ ist verbuggt.
~ Cave Story rules! ~

Kitty Hello

OK, teste mal das hier. Bei mir geht das korrekt.
Code (glbasic) Select


LOCAL a$, b$

WHILE TRUE
FOR i=0 TO 100
INC b$, INKEY$()
SLEEP 5
NEXT
DEBUG b$+"\n"
INC a$, b$; b$=""
PRINT a$,0,0
SHOWSCREEN
WEND


Ich kann leider nicht so schnell tippen wie Du :/

S. P. Gardebiter

#12
Hi.
Sorry für die späte Antwort, die letzten beiden Wochen waren extrem stressig.

Bei mir funktioniert das leider garnicht :/ Der nimmt garkeinen Tastendruck von mir an, zumindest solange da eine For/Next Schleife drin ist.

Wenn ich die Schleife rausnehme, nimmt der komischerweise immernoch nicht alle Anschläge an sondern verschluckt viele einfach ganz :/ Sogar wenn ich Sleep auf 1 setze.

Edit: Irgendwas stimmt mit Inkey$ nicht, wenn ich meine (schlechte) selbstgeschriebene "Nachahmungsfunktion" benutze, funktioniert alles bestens.
~ Cave Story rules! ~

Kitty Hello

Wir reden aber schon von V.10 - RC, oder? Nicht, dass Du das mit der 9er versuchst.

S. P. Gardebiter

#14
Mit Version 10 funktioniert alles super, musste nichtmal was in meinem Spiel ändern.
Vielen dank Gernot :)

Allerdings sind exe Dateien in Version 10 auch über 100 kb größer O:
Mein Programm mit 460 Befehlen ist bereits über 1,3 MB groß. Naja, 'seis drum.
~ Cave Story rules! ~