[Tiptoi] Fwd: Re: Zwischenbericht: Lern-Kartenspiel / Problem: Performance

Hendrik Fuß hendrik.fuss at gmail.com
Mi Jan 2 21:14:06 CET 2019


Hi,

freut mich, dass das die Sache mit dem Spiel bei euch auf Interesse stößt. Ich hab den Code derzeit noch nirgends auf git, werde ich aber sicher bei Gelegenheit noch machen. Ich verwende allerdings einen in Python geschriebenen Generator für das YAML-Skript, da mit das handgeschrieben zu unübersichtlich war. Ich hab versucht, in meiner Mail nicht unnötig komplex zu werden, aber es ist wohl unvermeidlich. :)

> Evtl. könntest du die zeitaufwendigen Sachen einmalig am Anfang berechnen. Dann dauert es halt ein paar Minuten, bis das System startbereit ist, wäre aber im Spiel schnell.

Ja, stimmt, ich denke, das wäre machbar. Generell kann ich mir mit ein paar Tricks viele Berechnungen sparen. Dass ich hier sparen muss, ist mir eben erst klar geworden, als ich das gme auf den Stift geladen habe … inzwischen hätte ich auch ein paar Ansätze für Sparmaßnahmen.

Allerdings ist es vielleicht tatsächlich von Interesse, wenn ich hier einen kurzen Code-Ausschnitt poste, denn soweit mir bewusst ist, ist die Ursache für das Jump-Delay-Problem noch nicht wirklich verstanden.

Beim derzeitigen Spielprinzip ist es nötig, in jeder Runde die Menge der möglichen Aufgaben anhand der ausliegenden Karten neu zu bestimmen. Das ist, wie meine weiteren Analysen bestätigt haben, der große Zeitfresser. Ein Ausschnitt aus der Subroutine, die diese Menge ermittelt, folgt. Die Register $karte_x führen Buch über die ausliegenden Karten. Die Register $aufgabe_x sollen auf 1 stehen, wenn zur jeweilige Aufgabe eine mögliche Antwortkarte ausliegt:


  sub_menge_aufgaben:
  - $aufgabe_0:=0 $aufgabe_1:=0 $aufgabe_2:=0 $aufgabe_3:=0 $aufgabe_4:=0 $aufgabe_5:=0 $aufgabe_6:=0 J(sub_menge_aufgaben_1)

  sub_menge_aufgaben_1:
  - $aufgabe_7:=0 $aufgabe_8:=0 $anzahl_karten:=0 J(sub_menge_aufgaben_r_1)

  sub_menge_aufgaben_r_1:
  - $karte_E==1? $aufgabe_0:=1 $aufgabe_5:=1  $anzahl_karten+=1 J(sub_menge_aufgaben_r_2)
  - J(sub_menge_aufgaben_r_2)

  sub_menge_aufgaben_r_2:
  - $karte_Fis==1? $aufgabe_1:=1 $aufgabe_2:=1 $aufgabe_5:=1  $anzahl_karten+=1 J(sub_menge_aufgaben_r_3)
  - J(sub_menge_aufgaben_r_3)

  sub_menge_aufgaben_r_3:
  - $karte_G==1? $aufgabe_1:=1 $aufgabe_3:=1 $aufgabe_5:=1  $anzahl_karten+=1 J(sub_menge_aufgaben_r_4)
  - J(sub_menge_aufgaben_r_4)

  sub_menge_aufgaben_r_4:
  - $karte_Gis==1? $aufgabe_1:=1 $aufgabe_4:=1 $aufgabe_5:=1  $anzahl_karten+=1 J(sub_menge_aufgaben_r_5)
  - J(sub_menge_aufgaben_r_5)

So geht es dann weiter bis *_r_16. Im Anschluss wird eine Zufallszahl erzeugt und anhand der Register $aufgabe_1 bis $aufgabe_N eine Aufgabe gewählt.

Zur Diagnose habe ich in jede dieser Routinen einen Play-Befehl eingebaut und die Zeiten gestoppt. Zwischen zwei Jumps vergehen im Schnitt 4,3 Sekunden, wobei die Audiodateien ca. 1 Sekunde lang sind. Manchmal dauert es nur die halbe Zeit, so als ob es eine Art Zeitraster gibt. (Das Diagramm im Anhang zeigt beispielhaft die Verzögerung von einem Play zum nächsten in Sekunden.)

Die Zeit, die insgesamt vergeht, scheint relativ konstant zu sein, also nicht abhängig von der Anzahl der ausliegenden Karten, aber das müsste ich nochmal durch Messung bestätigen.

Weiß nicht, ob es was hilft.

viele Grüße
Hendrik


-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : PastedGraphic-2.pdf
Dateityp    : application/pdf
Dateigröße  : 94926 bytes
Beschreibung: nicht verfügbar
URL         : <https://lists.nomeata.de/pipermail/tiptoi/attachments/20190102/20789c0b/attachment.pdf>
-------------- nächster Teil --------------




> Am 02.01.2019 um 20:23 schrieb f.gurtner85 <f.gurtner85 at gmail.com>:
> 
> Hallo Hendrik,
> Wie Markus schon schrieb wäre konkreter code zur Hilfestellung nützlich....
> Alernativ könnte die zufällige Frageauswahl auch aus einem gemischtem Fragekarten stapel bestenen und eine durch Spielregeln ( gelöste Karten werden entfernt, falsch beantwortete werden wieder zurückgelegt) die Logik zum überprüfen auf noch im Spiel befindliche Lösungskarten umgangen....
> Mfg Franz
> 
> 
> 
> Von meinem Samsung Galaxy Smartphone gesendet.
> 
> -------- Ursprüngliche Nachricht --------
> Von: Markus Heiße <Markus-Heisse at gmx.de>
> Datum: 02.01.19 19:26 (GMT+01:00)
> An: tiptoi at lists.nomeata.de
> Betreff: Re: [Tiptoi] Zwischenbericht: Lern-Kartenspiel / Problem: Performance
> 
> Hallo Hendrik,
>  
> klingt nach einer tollen Idee. Um ggf. Tipps zur Optimierung zu haben, müsste man einmal den Code sehen.
> Ansonsten könnte man, um den code generell zu vereinfachen, eine Spielrunde mit x Runden machen, in der lediglich die Aufgabe per Zufall gewählt wird. Die Karten bleiben alle im Spiel und der der richtig tippt, bekommt einfach einen Punkt (wenn es etwas greifbares sein muss, kann man irgendwelche Spielchips nehmen o. ä.). Natürlich kann es da passieren, dass eine Aufgabe mehrfach kommt. Man könnte es Variieren, in dem du z. B. für EINE Karte MEHRERE Fragen implementierst um die Gefahr von Dopplungen zu minimieren.
>  
> Braucht der Stift generell 20-40 Sekunden, um eine Aufgabe zu wählen, oder erst wenn das Spiel bereits eine Weile läuft (und einige Karten nicht mehr im Spiel sind)?
>  
> lg Markus
>  
> Gesendet: Mittwoch, 02. Januar 2019 um 18:59 Uhr
> Von: "Hendrik Fuß" <hendrik.fuss at gmail.com>
> An: "Die Mailingliste für Tiptoi-Bastler" <tiptoi at lists.nomeata.de>
> Betreff: [Tiptoi] Zwischenbericht: Lern-Kartenspiel / Problem: Performance
> So, wie ihr merkt, nutze ich die Ferien gerade intensiv, um endlich mein Tiptoi-Projekt voranzubringen. Vielleicht interessiert euch ein erstes Zwischenergebnis …
>  
> Ich bin Lehrer in einer Musikschule und versuche, mit tttool ein Lern-Kartenspiel für meine Schüler zu erstellen (siehe Bild). Dabei geht es darum, zuzuordnen, mit welchem Finger ein bestimmter Ton gespielt wird, und auf welcher Saite. Die Spielidee ist einfach: der Tiptoi-Stift nennt eine Aufgabe (z.B.: „Welchen Ton kann man mit dem ersten Finger greifen?“) und der Spieler löst die Aufgabe, indem er eine passende Karte antippt. Bei einer richtigen Antwort darf er die Karte behalten. Es gewinnt der Spieler, der am Ende die meisten Karten hat.
>  
> Ich habe das Spiel nun fertig implementiert, und es funktioniert … im Prinzip. Mein Problem ist nur, dass der Stift mit den Algorithmen heillos überfordert ist. Die zufällige Auswahl einer neuen Aufgabe dauert ca. 20–40 Sekunden. :-( Im jetzigen Zustand ist das Spiel also noch nicht wirklich spielbar.
>  
> Zugegebenermaßen ist der Algorithmus nicht ganz trivial, weil der Stift immer eine zu den ausliegenden Karten passende Aufgabe aussuchen muss. Dabei muss der Stift schätzungsweise 25–30 Jump-Befehle verarbeiten. Eigentlich nicht viel für einen Mikroprozessor …
>  
> Ich werde also die nächste Zeit damit verbringen, den Spiel-Code zu optimieren, oder zur Not die Spielregeln abwandeln, sodass der Programmcode einfacher wird.
>  
> Wenn jemand noch Optimierungs-Tipps hat, bin ich sehr dankbar.
>  
> Vielen Dank auch sonst für die Unterstützung und das durchweg positive Klima in dieser Gruppe.
>  
> viele Grüße
> Hendrik
>  
>  
> -- tiptoi mailing list tiptoi at lists.nomeata.de https://lists.nomeata.de/mailman/listinfo/tiptoi
> -- 
> tiptoi mailing list
> tiptoi at lists.nomeata.de
> https://lists.nomeata.de/mailman/listinfo/tiptoi



Mehr Informationen über die Mailingliste tiptoi