<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Zeitalter3 - Browsergames Entwicklerblog &#187; Pipeline</title>
	<atom:link href="http://blog.zeitalter3.de/tag/pipeline/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.zeitalter3.de</link>
	<description>Ein Blog über persistente Browsergames und deren Entstehung</description>
	<lastBuildDate>Sat, 07 Aug 2010 06:22:27 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Spielzustände</title>
		<link>http://blog.zeitalter3.de/2009/02/15/spielzustande/</link>
		<comments>http://blog.zeitalter3.de/2009/02/15/spielzustande/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 13:12:02 +0000</pubDate>
		<dc:creator>Dirk</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[Gamestates]]></category>
		<category><![CDATA[Pipeline]]></category>

		<guid isPermaLink="false">http://blog.zeitalter3.de/?p=542</guid>
		<description><![CDATA[Das Projekt hat gerade eine lange Refakturierungs-Phase hinter sich. Ziel war es, die eigentliche Spiel-Pipeline zu überarbeiten. Kurz zur Problematik: ein Spieler führt eine Aktion aus, beispielsweise will er sich nach Punkt D bewegen. Daraus ergeben sich einige Fragen. Darf er das in diesem Moment? Wie lange braucht er dazu? Wo befindet er sich überhaupt [...]]]></description>
			<content:encoded><![CDATA[<p>Das Projekt hat gerade eine lange Refakturierungs-Phase hinter sich. Ziel war es, die eigentliche Spiel-Pipeline zu überarbeiten.</p>
<p>Kurz zur Problematik: ein Spieler führt eine Aktion aus, beispielsweise will er sich nach Punkt D bewegen. Daraus ergeben sich einige Fragen. Darf er das in diesem Moment? Wie lange braucht er dazu? Wo befindet er sich überhaupt in diesem Moment gerade? Um eine Aktion auszuführen muss das System also in dem meisten Fällen erst einmal wissen, in welchem Zustand sich der Spieler befindet (im Sinne von Ort, Zeit etc.).</p>
<p>Die Reihenfolge sieht also in etwa so aus:</p>
<ul>
<li>Ein Spieler führt eine Aktion aus</li>
<li>Das System schaut, in welchem Zustand sich der Spieler befindet</li>
<li>Es prüft, ob diese Aktion dem Spieler im Moment gestattet ist</li>
<li>Falls ja führt es sie aus und stößt eventuelle Konsequenzen (für den Spieler selbst und für andere Spieler) an</li>
</ul>
<p>Das klingt so weit ganz einfach, doch spannend wird es, diesen Ablauf in einen sauber verständliches und vor allem performantes Konstrukt zu bringen. Je nach Spiel kann der aktuelle Status des Spielers recht kompliziert werden. Insbesondere, wenn er noch mit anderen Spielern interagiert.</p>
<p>Das aktuelle Konstrukt sieht in etwa so aus:</p>
<p><img class="aligncenter size-full wp-image-543" title="lineracer_spielverwaltung" src="http://blog.zeitalter3.de/wp-content/uploads/2009/02/lineracer_spielverwaltung.jpg" alt="lineracer_spielverwaltung" width="450" height="162" /></p>
<p>Zur Erklärung:</p>
<ul>
<li>Die Präsentationsschicht nimmt die Eingaben der Spieler auf</li>
<li>Die Aktionsverwaltung stößt die entsprechenden Prozesse an, die zu einer Aktion gehören</li>
<li>Der aktuelle Spielzustand, der den Benutzer betrifft, wird generiert. Er setzt sich zusammen aus den relevanten vergangenen Aktionen des Benutzers und aus den Events, die ihn in diesem Moment betreffen</li>
<li>Diese ganzen Daten werden zu einen aktuellen Snapshot der Situation für den Spieler verarbeitet und in einer Struktur gespeichert</li>
<li>Die Aktionen der Aktionsverwaltung greifen auf diese Struktur zu und führen die vom Spieler durchgeführten Aktionen aus</li>
<li>Zukünftig wirkende Aktionen werden als Events gespeichert</li>
<li>Die gerade durchgeführte Aktion des Spielers wird gespeichert, um später den Spielzustand wieder zu rekonstuieren</li>
</ul>
<p>Durch die selektive Betrachtung des für den Spieler relevanten Spielzustands werden unter Umständen eine ganze Menge Ressourcen gespart. Darüber hinaus gibt es durch die gespeicherten Aktionen ein definitives Backlog, was jeder Spieler wann gemacht hat. Ein schöner Nebeneffekt ist damit die komplette Nachvollziehbarkeit, um Fehler im Ablauf zu finden, aber auch um Cheater aufzuspüren. Um die Größe der Daten mache ich mir in diesem Fall keine Sorgen: die Tabelle enthält nur die ID des Spielers, die ID der Aktion, die Parameter und einen Zeitstempel. Entsprechend alte Einträge werden in eine Archiv-Tabelle verschoben.</p>
<p>Alles in allem hat mich das jetzt lockere 2 Wochen gekostet bis alles Hand in Hand griff und ich mit dem Design zufrieden war (zumindest bis zur nächsten Refakturierungs-Runde). Als weiteren Nebeneffekt habe ich die Unit-Tests der Pipeline überarbeitet: sie benutzen nun zufällige IDs zum Erstellen von Objekten. Vorher kam es vor, dass ich im Code Primärschlüssel vertauscht hatte und die Tests nicht Alarm schlugen, weil beide im Test den Wert 1 haben sollten. Es knallte erst im eigentlichen Spiel an der entsprechenden Stelle. Faulheit verfolgt einen bei Unit Tests eben immer.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.zeitalter3.de/2009/02/15/spielzustande/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
