[Frage] HighGUI - Interferriert mit KeyHit()

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Skulk

Betreff: [Frage] HighGUI - Interferriert mit KeyHit()

BeitragDo, Aug 10, 2006 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo...

wie dass so ist, an einem größeren Projekt, man stolpert von unerwarteten Problemen in die nächsten.

Mein Problem ist folgendes.
For ein Spiel arbeite ich derzeit am Editor. Ich möchte eine DropDown-List (Combobox) anzeigen, welche mit all den Objekten gefüllt ist, die der User platzieren darf.

Hierfür habe ich mich entschieden, Diablo.HighGUI zu verwenden (version 3)

der editor ist kein seperates programm, sondern vielmehr ein weitere GameState in meinem Spiel. ich zeichne lediglich ein paar mehr infos, wie z.b. grid, eine toolbar mit vorschau des objektes etc.

mein Problem ist nun folgendes.
sobald ich die Funktion hi_THighGUI.Render() implementiere, reagieren meine KeyHit() abfragen nicht mehr so fix wie sonst.

d.h. ich möchte mit taste G das grid ausschalten, uns muss u.U. die taste bis zu 4x drücken, damit mein Programm registriert warum.


ich hab mich schon auf die suche nach dem problem gemacht.
im HighGUI Modul, wird keinerlei KeyHit() verwendet und keinerlei FlushKeys()
es wird lediglich jede erdenkliche taste durchgegangen und sollte KeyDown() true sein, diese in einen eigenen Stack geschrieben.


bei kleineren test-programmen funktioniert es einwandfrei, erst bei größeren, aufwendigeren programmen "hakt" es.

ist euch das problem schon einmal unter gekommen?
wie kann ich es lösen?


im schlimmsten fall nehme ich auch eine andre GUI.
MaxGUI möchte ich jedoch nicht nehmen, da ich dafür viel zu viel verändern müsste. Da bastele ich dann lieber meine eigene combobox, auch wenn mir eine einfache, schnelle möglichkeit lieber wäre!
War doesn't determine who's right,
war determines who's left...
 

Dreamora

BeitragDo, Aug 10, 2006 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~

Falsches Board, im ModuleBoard sind keine Fragen gestattet
Dreamora
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Skulk

BeitragDo, Aug 10, 2006 13:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry aber hatten wir die Diskussion nicht schonmal? als ich wegen lua gefragt hatte? (Der Thread ist noch im ModuleForum: Frage zu LUA)

es heisst nämlich
Zitat:
Module
Fragen zu BlitzMax Modulen und Präsentationen von BlitzMax-Modulen



Ich halte mich gerne an Richtlinien, aber in diesem fall sind sie mir zu divergent... und das verwirrt sicher nicht nur mich
War doesn't determine who's right,
war determines who's left...
 

Dreamora

BeitragDo, Aug 10, 2006 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Jepp du darfst fragen stellen. Aber nur im Präsentationsthread des entsprechenden Modules betreffend des entsprechenden Modules dann natürlich. Für Fragen ansonsten ist das allgemeine Board da.
Das hat übrigens auch keineswegs etwas mit bösem Willen zu tun, ganz im Gegenteil: Wir wollen einfach das es Usern möglich ist, noch sinnvoll nach einem Modul zu schauen und das ist logischerweise nicht möglich wenn zwischen den Modulen noch zig Fragen zu Modulen sind die man im Board dann noch nicht einmal findet ...


Was das Problem betrifft:
Wenn das Problem mit einem kurzen Code nicht festzulegen ist, würde ich behaupten, dass irgend ein Teil deines Codes das Problem erzeugt.

Nutzt du eventuell EventHooks und dergleichen? Oder vergisst du sonst eine Überprüfungsfunktion zu "deaktivieren" wenn du in den Editorstate wechselst, welche eventuell dafür verantwortlich ist. (wobei ich eigentlich annehme, dass der Editor eine eigene MainLoop hat, da alles andere einen sehr umständlichen Code zur Folge hat weil man überall wieder verzweigen müsste)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Skulk

BeitragDo, Aug 10, 2006 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Bösen willen habe ich auch nicht unterstellt Smile

Ich wollte nur aufzeigen dass die formulierung sehr missverständlich ist.


Ich hab auch schon meinen code durchwühlt, konnte jedoch nix finden.
ich habe stückweise meine update und rendering prozduren auskommentiert (bis auf jene welche die eingaben annimmt) und es klapp dennoch nicht

sobald ich die renderfunktion von highgui auskommentiere läufts wieder blitzschnell

ich selbst nutze auch kein flushkeys() o.ä.


was ich vielleicht noch probiere, sind ein paar Messungen durchzuführen. also welche routine welche laufzeiten produziert. vielleicht hilft mir das.

ich versteh es auch nicht, woher das kommen soll. das gesammte programm läuft super performant weiter, lediglich bei KeyHit() gibts schwierigkeiten.


Nachtrag:
die Performancemessung ergab erwartete Werte
Folgende meiner Prozeduren brauchen die angegebenen Millisekunden
Code: [AUSKLAPPEN]
ProcessInputs: 0
Update: 0
Render: 10
HighGui: 1


ich versteh das nicht. es muss irgendwie an highgui liegen. irgendwo muss ein flushkeys oder keyhit verwendet werden, wo ich nicht damit rechne
War doesn't determine who's right,
war determines who's left...
 

Dreamora

BeitragDo, Aug 10, 2006 16:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicht umbedingt

Was für Gadgets benutzt du genau von der HighGUI?
Mein Problem aktuell ist eine Logik dahinter zu sehen, dass KeyHit nicht funktionieren soll oder mehrfach gedrückt werden muss.
Denn KeyHit zählt die Anzahl an KeyHits der jeweiligen Taste seit dem letzten Aufruf von KeyHit und das eigentlich unabhängig davon ob gerendert wird oder nicht.

Ich denke, dass die Performance runter geht, das ist vorweg schonmal ganz klar. Da wirst du auch nicht drumherum kommen. (drop auf 50% +- je nach System wenn du mehr als ein Radar und Lebenspunktebalken und so hast)
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.
 

Skulk

BeitragDo, Aug 10, 2006 16:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok ich beschreib mal meine situation genauer.

Ich benutze ausschliesslich eine Combobox (später sollen es 3 werden, von denen jeweils nur eine sichtbar ist)

Gedacht ist es für meinen mapeditor (performance ist also egal)
jede listbox soll je nach layer mit bestimmten objekten gefüllt sein, die gesetzt werden können


die logik dahinter verstehe ich ja auch nicht...
die render-funktion von highgui beinhaltet übrigens (dummerweise) auch 2 updatefunktionen. UpdateGUIMouse und UpdateGUIKeys

bei UpdateGUIKeys werden die gedrückt-gehaltenen tasten in einen internen puffer geschrieben. es wird keydown genutzt, kein keyhit. (somit sollte der BMax interne puffer nicht verändert werden.)

und es ist ja nicht so dass die performance selbst leidet
ich habe nachwievor stabile 60FPS (habe auf 60 limitiert, es sind sicher auch mehr drin)

scrolling oder alles was mit KeyDown(), MouseHit() etc zu tun hat funktioniert blendet. Lediglich KeyHit() "verschluckt" manche tastendrücke.


Nachtrag:
Wenn ich den Framelimiter deaktiviere, bekomme ich auf meinem (miesen) Arbeits-PC 85 FPS stabil. Egal ob mit oder ohne HighGUI.

jedoch kann ich dann fast nicht mehr irgendwelche tastendrücke "durchsetzen".

meine vermutung: irgendetwas löscht den Tasten-Puffer. Wenn ich mit 60FPS limitert arbeite, habe ich 20fps "wartezeit" in denen ich meine tasten drücken kann damit sie nicht gelöscht werden.

Nachtrag2:
Ich hab jetzt etwas mit der Funktions-Abfolge experimentiert.
D.h. ich rufe erst meine ProcessInputs-Routine auf, anschliessend rendere ich das GUI und dann kommt mein update und rendering des editors

Ich weiss, so wird das GUI immer vom editor übermalt...aber jetzt reagieren die tasten wieder zuverlässig... (klar, erst rufe ich meine taste ab, dann löscht highgui den puffer und die restlichen routinen geben dem anwender genug zeit eine taste zu drücken.)

aber dass kann doch nicht sein...!


Ich werde heute zu hause mal Highgui neu compilieren.
ich werde die beiden Update-funktionen im rendering-bereich rausnehmen und in den updatebereich verschieben.

hier auf arbeit kann ich das leider nicht compilieren, weil ich BMax in einer veralteten version vorliegen habe.
(daran liegts aber net, zuhause gehts ja auch net)


Nachtrag 3:
Wie via PM vereinbart, schicke ich dir, Dreamora, morgen den source
War doesn't determine who's right,
war determines who's left...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group