Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

1

30.05.2015, 11:24

[Lib] SNIIS - Gesundheit! - Simple Non Intrusive Input Library

Moin,

ich will euch hier kurz eine kleine OpenSource-Bibliothek vorstellen, die ich im Zuge der Splatter-Portierung geschrieben habe.

SNIIS (Gesundheit!) Simple Non-Intrusive Input Library
Link: https://github.com/Schrompf/sniis
Lizenz: WTFPL oder vergleichbare

Funktion:
SNIIS stellt alle Arten von Eingabegeräten auf den Desktop-Plattformen Windows/Linux/MacOSX zur Verfügung. Unterstützt werden mehrere Mäuse und Tastaturen sowie natürlich alle GamePads, Controller, Joysticks. Deren Eingabeelemente können dann mittels Action Mapping auf abstrakte Eingabekanäle abgebildet werden, um halt die klassische Neubelegung der Steuerung zu ermöglichen. Im Detail:

- mehrere Mäuse und Tastaturen auf Win/Mac/Linux mit sauberer Nutzer-Integration - kein Suchen mehr, was denn nun die erste Maus ist, wie z.B. bei Trine :-)
- Non-Intrusive - übernimmt *nicht* die Game Message Loop. Braucht deswegen aber gelegentlich externe Informationen, um arbeiten zu können.
- einfacher Build - einfach ein Rudel C++-Files mit dem Projekt mitkompilieren, zur Benutzung ein einzelnes Include ohne weitere Abhängigkeiten.
- einfacher Code - kein AbstractFactoryAdaptorPattern-Mist. Ich meine Dich, OIS.
- Action Mapping, also Abbildung von Eingabeelementen auf Spielaktionen, mit Kreuzübersetzung zwischen analogen und digitalen Controls
- optional mit Tastenwiederholung
- optional mit menschenlesbaren Namen für die Eingabeelemente, z.B. für's Optionsmenü, wo man die Steuerung neu belegen kann

Ursprung:
Das Ganze ist umfangreich basiert auf Object-Oriented Input System, was ich bald ein Jahrzehnt lang vorher benutzt habe. Das musste ich aber für "Mehrere Mäuse/Tastaturen" bereits kräftig umbauen, habe außerdem den XInput-Patch für saubere XBox-Controller-Unterstützung integrieren müssen, und Tilman/Sternmull hat damals das ActionMapping noch obendrauf gepflanzt. Und spätestens, als ich OIS dann unter Linux benutzen wollte und der nur noch in Crashes gerannt ist wegen der Konkurrenz um irgendwelche Systemnachrichten, war's vorbei damit.

Probleme:
Einige. Ich hoffe da auf den OpenSource-Effekt.
- fehlende Tastenbenamung auf OSX
- fehlende Benamung aller anderen Controls, also Maus und Joysticks
- unsaubere Übersetzung von HID-Buttons auf Virtual Keys unter OSX
- unschöne RawInput-Nachrichtenbesorgung auf Windows - kommt man da irgendwie eigenständig ran?
- noch völlig unfertige C-API

Andere Libs:
- ManyMouse - feines kleines Ding, angenehm unprätentiös, aber halt nur für Mäuse, und kein Remapping
- "Simple cross-platform gamepad library" von TigSource - ebenso kleines feines Ding, aber halt nur GamePads/Joysticks/usw., kein Action Mapping
- und halt OIS - quasi tot, ziemlich "objektorientiert" verbastelt, konnte nur einen Teil von dem, was ich brauchte
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Krane

Treue Seele

Beiträge: 312

Wohnort: Innsbruck, Tirol

  • Private Nachricht senden

2

30.05.2015, 11:51

Sieht sehr interessant aus!
Bin schon lange auf der Suche nach einer guten Input Library. Ich persönlich konnte mich mit OIS nicht anfreunden.
Werde es mal ausprobieren und dann versuchen etwas Feedback zu geben.

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

02.06.2015, 14:38

Danke :-)

Hat jemand eine Idee, wie ich in meiner Update-Funktion RawInput-Nachrichten bekommen könnte, ohne dass ich die Nachrichtenschleife des Programms übernehme? Also wirklich nur die RawInput-Nachrichten, ohne in ner BusyLoop mit dem Hauptprogramm zu konkurrieren, Nachrichten zu verlieren oder dem Hauptprogramm welche wegzunehmen?

Das wär nämlich der finale Ritterschlag, mit dem ich die Lib dann auch in C# oder Java anbieten könnte oder als Plugin in den Unity Asset Store setzen könnte.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

4

02.06.2015, 15:06

Auf windows würden sich wohl Hooks anbieten.

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

5

02.06.2015, 15:11

Ich glaube am ehesten wäre wohl PeekMessage mit dem Flag PM_NOREMOVE günstig. damit kannst du die Nachrichten lesen, ohne die Queue anzufassen. Ich weiß, du musst trotzdem an die Nachrichtenschleife, das konkurriert aber nicht direkt mit dem Hauptprogramm. Ansonsten bleibt dir wohl nur GetAsyncKeyState über alle gemappten Keys übrig. Hooks sind auch eine Möglichkeit, sind aber event-basiert.

Ansonsten habe ich noch das gefunden: Raw Input Devices

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

02.06.2015, 15:32

Ich belese mich mal zu Hooks. Hoffentlich gibt das keinen Ärger mit irgendwelchen Virenprogrammen. PeekMessage() wollte ich eigentlich nicht, weil ich nicht weiß, wann und wo die RawInput-Nachrichten entstehen. Wenn ich mich durch die MessageQueue durch-peeke, hab ich im Endeffekt auch nur ein Wettrennen um Nachrichten mit der Haupt-Nachrichtenschleife des Programms.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

11.06.2015, 18:52

Ich kopier hier mal meinen Text ausm ZFX rein, weil ich gerade heftig stolz bin.

-------------
It's mating ridiculous, but it works!

In der dürftigen RawInput-Doku gibt es auch einen Verweis auf GetRawInputBuffer(), was die Buffered-Version ist, die ohne Zuarbeiten von der Message Loop auskommt. Diese Funktion ist der kritische Teil, weswegen ich nun meine Input-Lib nicht mehr in UpdateVorMessageLoop(), HierNimmDieseRawInputNachricht() und UpdateNachMessageLoop unterteilen muss. Ab jetzt reicht ein einzelnes Update(). Und diese Änderung sollte es jetzt auch ermöglichen, die Lib auch von C#, Java aus benutzen zu können oder sie als Plugin in den Unity Asset Store zu stellen.

Der Trick: GetRawInputBuffer() ist auf 64bit-Windows verbuggt! Die RawInput-Nachrichten stecken in sowas:

Quellcode

1
2
3
4
struct RAWINPUT {
  struct Header header;
  union Data data;
};


Und auf 64bit-Windowsen ist data um 8 Byte verschoben. Das Problem ist Microsoft seit mindestens 2011 bekannt, aber die einzige Reaktion war, es als Note in die Doku mit aufzunehmen. Also hab ich mittels GetProcAddress() und IsWow64Process() ermittelt, ob ich das Buggy-Offset einberechnen muss, und dann in diesem Fall eine kleine fiese Zeigerbastelei ausgeführt, womit ich jetzt final korrekte RawInput-Daten gelesen bekomme.

Was für ein wirrer Mist. Aber ich freu mich, dass ich es rausgekriegt habe.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

8

11.06.2015, 18:57

Nun ja, herzlichen glückwunsch :D

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

11.06.2015, 19:23

Das bedeutet jetzt also, dass man mit Hilfe von RawInput arbeiten kann? Sehr cool ;)

Schrompf

Alter Hase

  • »Schrompf« ist der Autor dieses Themas

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

10

12.06.2015, 15:11

Danke :-)

Und "Arbeiten" ist dann doch etwas übertrieben. GetRawInputBuffer() liefert einem leider nur die seit der letzten Nachrichtenschleife aufgelaufenen RawInput-Ereignisse, wie ich jetzt feststellen musste. Die seltenen RawInput-Ereignisse, die nach meiner Abfrage und vor Abschluss der Spiel-Nachrichtenschleife reinkamen, gingen verloren. Deswegen habe ich mich jetzt zusätzlich per SetWindowLongPtr() vor die spiel-eigene WNDPROC gehängt und sammle auf die Art die sonst verlorenengegangenen Input Events noch ein.

Hässlich, das Ganze, und eigentlich ein unwürdiger Zustand für Softwarearchitektur im Jahre 2015. Aber was soll man machen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige