Samstag, 27. Dezember 2014

Schneller, schneller

Mit den letzten Updates von Sechzehn habe ich in drei Schritten die Performance verbessert.

  1. Den größten Performanceschub brachte die Verlagerung der Berechnung eines neuen Spieles in die Datenbank. Neuerdings wird die Lösung eines Spieles von einer Stored Procedure erledigt. Denn wenn viele gültige Wörter im Spielfeld gefunden werden konnten, dauerte die Neuberechnung eines Spieles durchaus über 30 Sekunden. Das führte dann zu Timeouts in der Anwendung. Die aktuelle Variante ist bis zu 100 mal schneller.
  2. Den für den Anwender spürbarsten Performanceschub bringt der Wechsel des HTTP-Servers. Ich habe den Webrick durch den Puma ersetzt. Im Gegensatz zum Webrick kann Puma mehrere Anfragen parallel bearbeiten. Dadurch kommt es nicht mehr für alle Spieler zu Verzögerungen, wenn jemand die Highscoretabellen durchblättert, oder gerade ein neues Spiel berechnet wird. Die Bedienung von Sechzehn fühlt sich jetzt insgesamt flüssiger an.
  3. Die dritte Änderung betrifft das Chat-Fenster. Dies habe ich auf Websockets umgestellt. Damit entfällt die Notwendigkeit, dass jeder Spieler alle fünf Sekunden auf dem Server nach neuen Nachrichten schaut. Stattdessen wird an alle Clients ein Ereignis gesendet, sobald irgendwer eine neue Nachricht schreibt. Damit entfallen eine Menge Anfragen an den Server, der dadurch mehr Zeit für das eigentliche Spiel übrig hat.

    Ein kleiner Wermutstropfen bleibt hier allerdings. Der Dienst, den ich für die Auslieferung von Nachrichten nutze (es ist Pusher), erlaubt in der kostenlosen Variante nur 20 gleichzeitige Verbindungen. Falls sich herausstellt, dass regelmäßig mehr Spieler online sind, werde ich den Chat nur für registrierte Spieler freigeben. Noch habe ich das Limit aber bei weitem nicht erreicht.

Natürlich sind mit den letzten Updates auch einige Fehler behoben worden. Die meisten betrafen lediglich das Layout des Spiels. Einer betraf den Buchstaben q. Der Fehler hat sich eingeschlichen, als das Spielfeld von <div> auf <canvas> umgestellt wurde. Damit der Pfad der getippten Buchstaben nachzeichnet werden kann, musste einiges an Javascript neu geschrieben werden. Dabei habe ich die Sonderbehandlung des q übersehen. Da dieser Buchstabe auch nur sehr selten im Spielfeld erscheint, ist der Fehler erst vor kurzem aufgefallen.