<?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>SpyParty - A Spy Game About Subtle Behavior &#187; indie games</title>
	<atom:link href="http://www.spyparty.com/category/indie-games/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.spyparty.com</link>
	<description>Chris Hecker&#039;s new espionage game about subtle behavior, performance, perception, and deception.</description>
	<lastBuildDate>Sun, 16 Mar 2014 05:01:44 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8.2</generator>
	<item>
		<title>SpyParty at Day of the Devs</title>
		<link>http://www.spyparty.com/2013/11/03/spyparty-at-day-of-the-devs/</link>
		<comments>http://www.spyparty.com/2013/11/03/spyparty-at-day-of-the-devs/#comments</comments>
		<pubDate>Sun, 03 Nov 2013 23:35:40 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[events]]></category>
		<category><![CDATA[indie games]]></category>
		<category><![CDATA[press]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3972</guid>
		<description><![CDATA[Yesterday we did a fun thing in San Francisco: DoubleFine and iam8bit were kind enough to invite us to set up SpyParty at their Day of the Devs party, along with a bunch of other indie friends, including Supergiant and Capy. We shared a room with Hohokum and Destructomundo, and everybody had a great time! Some press came by to [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Yesterday we did a fun thing in San Francisco: <a href="http://http://doublefine.com/">DoubleFine</a> and <a href="http://iam8bit.com/">iam8bit</a> were kind enough to invite us to set up <strong>SpyParty</strong> at their <a href="http://dayofthedevs.com/">Day of the Devs</a> party, along with a bunch of other indie friends, including <a href="http://supergiantgames.com/">Supergiant</a> and <a href="http://www.capybaragames.com/">Capy</a>. We shared a room with <a href="http://www.honeyslug.com/">Hohokum</a> and <a href="http://www.destructamundo.com/">Destructomundo</a>, and everybody had a great time! Some press came by to chat, so we may see some general coverage showing up this week, too.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-3973" alt="dotdlogo" src="http://cdn.spyparty.com/wp-content/uploads/2013/11/dotdlogo.png" width="500" height="241" /></p>
<p>This time <strong>slappydavis</strong> (in the hat) came over to help out with training newbies, and <strong>ardonite</strong> stopped by for a bit and they did a few exhibition games. Of course, I look a bunch of pictures, and here are some:</p>

<div class="ngg-galleryoverview" id="ngg-gallery-24-3972">


	
	<!-- Thumbnails -->
		
	<div id="ngg-image-1153" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6072.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6072" alt="dscn6072" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6072.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1154" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6074.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6074" alt="dscn6074" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6074.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1155" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6076.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6076" alt="dscn6076" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6076.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1156" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6077.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6077" alt="dscn6077" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6077.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1157" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6081.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6081" alt="dscn6081" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6081.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1158" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6085.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6085" alt="dscn6085" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6085.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1159" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6087.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6087" alt="dscn6087" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6087.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1160" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6089.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6089" alt="dscn6089" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6089.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1174" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6090.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6090" alt="dscn6090" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6090.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1161" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6096.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6096" alt="dscn6096" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6096.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1162" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6097.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6097" alt="dscn6097" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6097.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1163" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6101.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6101" alt="dscn6101" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6101.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1164" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6103.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6103" alt="dscn6103" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6103.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1165" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6108.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6108" alt="dscn6108" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6108.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1166" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6111.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6111" alt="dscn6111" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6111.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1167" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6112.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6112" alt="dscn6112" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6112.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1168" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6113.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6113" alt="dscn6113" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6113.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1169" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6114.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6114" alt="dscn6114" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6114.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1170" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6115.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6115" alt="dscn6115" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6115.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1171" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6125.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6125" alt="dscn6125" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6125.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1172" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6130.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6130" alt="dscn6130" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6130.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1173" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/dotd13/dscn6134.jpg" title=" " rel="lightbox[set_24]" >
								<img title="dscn6134" alt="dscn6134" src="http://cdn.spyparty.com/wp-content/gallery/dotd13/thumbs/thumbs_dscn6134.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class="ngg-clear"></div> 	
</div>


<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/11/03/spyparty-at-day-of-the-devs/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Update on the New Art, and SpyParty at XOXO in Portland</title>
		<link>http://www.spyparty.com/2013/09/25/update-on-the-new-art-and-spyparty-at-xoxo-in-portland/</link>
		<comments>http://www.spyparty.com/2013/09/25/update-on-the-new-art-and-spyparty-at-xoxo-in-portland/#comments</comments>
		<pubDate>Thu, 26 Sep 2013 01:02:34 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[art]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[indie games]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3631</guid>
		<description><![CDATA[The new art is finally nearing release to beta testers, so if you want to check it out yourself as soon as I post the build, sign up for the beta!  I&#8217;ll post more details here when I release it, and of course I&#8217;ll stream the release notes on twitch.tv/spyparty and then post them on the SpyParty [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The <a title="The New SpyParty Character Art Style" href="http://www.spyparty.com/2012/08/27/the-new-spyparty-character-art-style/">new art</a> is finally nearing release to beta testers, so if you want to check it out yourself as soon as I post the build, <a title="SpyParty Beta Registration" href="http://www.spyparty.com/beta/"><strong>sign up for the beta!</strong></a>  I&#8217;ll post more details here when I release it, and of course I&#8217;ll <a href="http://twitch.tv/spyparty">stream the release notes on twitch.tv/spyparty</a> and then post them on the <a href="http://www.youtube.com/user/SpyPartyGame"><strong>SpyParty</strong> YouTube channel</a>. Again, a reminder: it&#8217;s more of a tech demo than a playable map right now, it&#8217;ll be a while before the new art can replace the old art for real competitive play.</p>
<p>I fully intended on having the art released right after <a title="PAX West 2013 Report and Gallery" href="http://www.spyparty.com/2013/09/09/pax-west-2013-report-and-gallery/">PAX</a>, but I underestimated how much stuff I had agreed to do in September, so here we are.</p>
<p>The new artwork is working pretty well on a wide range of machines. For the PAX booth and the Omegathon, I only had to get it working reliably on Intel HD 4000 graphics, but now I need to try to make it work on everything. Dealing with different hardware and software configurations is the only real downside to doing PC games compared to the more closed platforms, but it is a significant downside. Here you can see a bunch of machines I&#8217;ve been using for testing, what year they&#8217;re from, and what graphics chip they have:</p>
<p><a href="http://www.spyparty.com/2013/09/25/update-on-the-new-art-and-spyparty-at-xoxo-in-portland/"><em>Click here to view the embedded video.</em></a></p>
<p>I try to keep a bunch of old machines running for testing, and I owe huge thanks to <a href="https://twitter.com/benkutcher">Ben Kutcher from Intel</a> for always hooking me up, and to <a href="http://the-witness.net/news/">Jonathan Blow from The Witness</a> for keeping me in constant supply of his discarded old machines. Especially for a multiplayer indie game, making sure you run on older machines is vitally important because you don&#8217;t want to limit your audience any more than you absolutely have to. I also try to develop on slightly old machines, because I think it keeps you honest as a programmer. It&#8217;s easy to get lazy if you always develop on a monster machine.</p>
<p>You can see the new map and characters work pretty well on most of the machines in the video, most at playable framerates even before optimization. The two exceptions are the Sony VAIO from way back in 2006, that has an Intel GMA 945 graphics chip in it,<sup><a href="http://www.spyparty.com/2013/09/25/update-on-the-new-art-and-spyparty-at-xoxo-in-portland/#footnote_0_3631" id="identifier_0_3631" class="footnote-link footnote-identifier-link" title="a chip that&rsquo;s pretty much universally reviled by graphics programers, but I will try hard to make it playable on this old machine!">1</a></sup> and the ThinkPad T500 from 2009. The latter is actually fast for a few minutes and then slows down, so I think there&#8217;s some kind of memory leak in the driver or something. I need to investigate more, because that hardware should run it fine.<sup><a href="http://www.spyparty.com/2013/09/25/update-on-the-new-art-and-spyparty-at-xoxo-in-portland/#footnote_1_3631" id="identifier_1_3631" class="footnote-link footnote-identifier-link" title="and, in fact, you can see the slower T400 runs the game well&hellip;sigh.">2</a></sup></p>
<p>I also briefly tested on MacOS using Wineskin, and the new art loads correctly, but it won&#8217;t draw the new level on the machine I tested. I&#8217;m not actually sure how to debug this other than commenting out stuff and hoping it starts working, but I&#8217;m crossing my fingers that it&#8217;s something simple I can find. Hopefully, once I release the build, MacOS beta testers can give me some feedback on which machines work, if any. I really need to get a Mac at some point&#8230;stealing my girlfriend&#8217;s machine after she goes to sleep is not a very robust testing methodology.</p>
<p>Loading correctly is actually half the battle, and usually when things go wrong, they go wrong during load. So, I&#8217;ve put in some code that will detect if it&#8217;s the first time you&#8217;ve loaded the new art, and if so, it&#8217;ll keep track of whether it crashes during load. If it does, the next time you run it will prompt you for whether you want to skip loading the new art, or try again. The last remaining thing I need to do is make it so if you have loaded the new art and you try to play a game against somebody who skipped loading it, you can both still play the old art levels correctly and it fails reasonably gracefully if you try to play a new art level. This shouldn&#8217;t take long to get working. Famous last words.</p>
<a name="XOXO"></a><h3>XOXO</h3>
<p>Last week I was invited by <a href="https://twitter.com/waxpancake">Andy Baio</a> to bring <strong>SpyParty</strong> to the <a href="http://2013.xoxofest.com/arcade/">XOXO Festival Arcade</a> in Portland, Oregon. Andy&#8217;s been a fan of the game for a while, and they had a great selection of experimental indie games this year at the festival. I had to return early so I missed the lectures over the weekend, but I believe they put videos online, and the Arcade was fun! As usual, I took pictures!</p>

<div class="ngg-galleryoverview" id="ngg-gallery-20-3631">


	
	<!-- Thumbnails -->
		
	<div id="ngg-image-1096" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5978.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5978" alt="dscn5978" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5978.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1097" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5980.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5980" alt="dscn5980" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5980.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1098" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5982.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5982" alt="dscn5982" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5982.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1099" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5984.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5984" alt="dscn5984" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5984.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1100" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5985.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5985" alt="dscn5985" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5985.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1101" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5987.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5987" alt="dscn5987" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5987.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1102" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5992.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5992" alt="dscn5992" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5992.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1103" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn5996.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn5996" alt="dscn5996" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn5996.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1117" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/viparty.jpg" title=" " rel="lightbox[set_20]" >
								<img title="Jpeg" alt="Jpeg" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_viparty.jpg" width="100" height="56" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1104" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6004.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6004" alt="dscn6004" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6004.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1105" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6007.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6007" alt="dscn6007" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6007.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1106" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6011.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6011" alt="dscn6011" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6011.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1107" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6015.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6015" alt="dscn6015" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6015.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1108" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6021.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6021" alt="dscn6021" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6021.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1109" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6023.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6023" alt="dscn6023" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6023.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1110" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6025.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6025" alt="dscn6025" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6025.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1111" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6026.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6026" alt="dscn6026" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6026.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1112" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6036.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6036" alt="dscn6036" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6036.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1113" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6040.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6040" alt="dscn6040" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6040.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1114" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6045.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6045" alt="dscn6045" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6045.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-1115" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6051.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6051" alt="dscn6051" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6051.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-1116" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/xoxo13/dscn6054.jpg" title=" " rel="lightbox[set_20]" >
								<img title="dscn6054" alt="dscn6054" src="http://cdn.spyparty.com/wp-content/gallery/xoxo13/thumbs/thumbs_dscn6054.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 	 	
	<!-- Pagination -->
 	<div class="ngg-clear"></div> 	
</div>


<p>&nbsp;</p>
<hr/><ol class="footnotes"><li id="footnote_0_3631" class="footnote">a chip that&#8217;s pretty much universally reviled by graphics programers, but I will try hard to make it playable on this old machine!</li><li id="footnote_1_3631" class="footnote">and, in fact, you can see the slower T400 runs the game well&#8230;sigh.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/09/25/update-on-the-new-art-and-spyparty-at-xoxo-in-portland/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evo 2013 Report and Pics</title>
		<link>http://www.spyparty.com/2013/07/23/evo-2013-report-and-pics/</link>
		<comments>http://www.spyparty.com/2013/07/23/evo-2013-report-and-pics/#comments</comments>
		<pubDate>Tue, 23 Jul 2013 23:27:14 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[competitive gaming]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[indie games]]></category>
		<category><![CDATA[press]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3504</guid>
		<description><![CDATA[We lived through Evo 2013.  At times, it was iffy. You see, a &#8220;normal&#8221; show, like PAX, lasts from 9 or 10am to about 6pm.  At that point, the guards kick everybody out and you can close up the booth and go to bed or fix the bugs your found that day, or maybe even [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>We lived through <a title="On EVO 2013, Interviewing kcmmmmm, and losing a bet with Seth Killian" href="http://www.spyparty.com/2013/07/10/on-evo-2013-interviewing-kcmmmmm-and-losing-a-bet-with-seth-killian/">Evo 2013</a>. </p>
<p>At times, it was iffy.</p>
<p>You see, a &#8220;normal&#8221; show, like <a title="Gigantic PAX West 2012 SpyParty and Storyteller Gallery!" href="http://www.spyparty.com/2012/09/06/gigantic-pax-west-2012-spyparty-and-storyteller-gallery/">PAX</a>, lasts from 9 or 10am to about 6pm.  At that point, the guards kick everybody out and you can close up the booth and go to bed or fix the bugs your found that day, or maybe even eat dinner.  Standing and talking about your game for 8 or 9 hours straight is pretty exhausting, though, and I rarely go out and have fun after hours at PAX because I want to be fresh in the morning for the next group of <strong>SpyParty</strong> players.</p>
<p>Evo, by contrast, goes from about 8am to 12am midnight.  Sometimes it goes even later, and as an exhibitor, we have to get there before the floor opens.  Yes, you are there, in your booth, talking about your game, helping people out, fixing problems, and explaining the damned over-complicated <em>Transfer Microfilm</em> mission for 16 or 17 hours a day.  Then you collapse, get up, shower, and do it again.  It is brutal.  Lots of exhibitors get in late or close up early, but not <strong>SpyParty</strong>;<em> if we&#8217;re going to fly to Vegas and set up our booth, we&#8217;re going to let people play the game when they are there.</em>  Like the Fighting Game Community itself, Evo requires a different level of commitment.</p>
<p>Surviving wouldn&#8217;t have been possible without the amazing help of <a href="https://twitter.com/shegeekshow"><strong>kate</strong></a>, <a href="https://twitter.com/kcmmmmm"><strong>kcmmmmm</strong></a>,<strong></strong> and <strong>berryalice</strong>.  John and I owe them our vocal chords.</p>
<p>Still, there&#8217;s nothing quite like seeing somebody visit the booth early in the show, being hesitant to read <a title="RT(updated)FM" href="http://www.spyparty.com/2011/03/10/rtupdatedfm/">the manual</a>, and then have them camping the unlimited play machine for hours by the end.  Even better is later seeing them <a title="SpyParty Beta Registration" href="http://www.spyparty.com/beta/">online in the lobby</a> the day after the show.</p>
<p>Also, if we didn&#8217;t go all-in at Evo, we wouldn&#8217;t have created a situation where this was possible, or maybe even inevitable:</p>
<div id="attachment_3510" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/07/DSCN4341.jpg"><img class="size-large wp-image-3510  " alt="Banana Bread Beer makes a hearty breakfast, in addition to a great prize." src="http://cdn.spyparty.com/wp-content/uploads/2013/07/DSCN4341-600x450.jpg" width="600" height="450" /></a><p class="wp-caption-text">Banana Bread Beer makes a hearty breakfast, in addition to a great prize.</p></div>
<p>If you have no idea what that is all about, read <a href="http://www.joystiq.com/2013/07/10/the-top-spyparty-player-is-a-fighting-game-guy-from-evo-2012/">this</a>, <a href="http://penny-arcade.com/report/article/why-fighting-game-players-dominate-spy-party-and-every-other-damn-system-th">this</a>, and <a title="On EVO 2013, Interviewing kcmmmmm, and losing a bet with Seth Killian" href="http://www.spyparty.com/2013/07/10/on-evo-2013-interviewing-kcmmmmm-and-losing-a-bet-with-seth-killian/">this</a>.</p>
<p>It was also great to see so many return players from <a title="SpyParty at Evo 2012 pics!" href="http://www.spyparty.com/2012/07/13/spyparty-at-evo-2012-pics/">last Evo</a>, see if you can spot them between the two galleries!</p>
<p>One thing that didn&#8217;t return was the old set of Dell Zino HD computers.  The always-amazing <a href="https://twitter.com/benkutcher">Ben Kutcher</a> got us some <a href="http://www.intel.com/content/www/us/en/motherboards/desktop-motherboards/nuc-family.html">Intel NUCs</a>, which even though they have a terrible name are pretty great pieces of hardware:</p>
<div id="attachment_3511" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/07/IMG_20130711_013148_859.jpg"><img class="size-large wp-image-3511" alt="The Intel NUCs on the left replace the Dell Zinos on the right." src="http://cdn.spyparty.com/wp-content/uploads/2013/07/IMG_20130711_013148_859-600x314.jpg" width="600" height="314" /></a><p class="wp-caption-text">The Intel NUCs on the left replace the Dell Zinos on the right.</p></div>
<p>The NUCs are way faster than the Zinos as well as being about 1/5th the size.  I&#8217;m optimistic they&#8217;ll run <a title="The New SpyParty Character Art Style" href="http://www.spyparty.com/2012/08/27/the-new-spyparty-character-art-style/">the new art</a> that&#8217;ll finally be in the game at PAX this year.  More on that soon.</p>
<a name="The+Pictures"></a><h3>The Pictures</h3>
<p>Pictures after the jump&#8230;</p>
<p><span id="more-3504"></span></p>
<p>Without further ado, here are a bunch of pics from Evo 2013.  Post a comment if I captured you!  And, once again, it&#8217;s worth pointing out that Evo is the most racially diverse video game show I&#8217;ve ever attended.  Look at the pictures, it&#8217;s pretty amazing and inspiring.</p>
<p>Edit:  whoa, <a href="http://twitter.com/live_by_foma"><strong>ky</strong></a> made this amazing thing from the gallery:  <a href="https://dl.dropboxusercontent.com/u/74568210/spyparty-char1-sm%20Mosaic.jpg">GIANT IMAGE, YOU HAVE BEEN WARNED</a> </p>

<div class="ngg-galleryoverview" id="ngg-gallery-18-3504">


	
	<!-- Thumbnails -->
		
	<div id="ngg-image-773" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4325.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4325" alt="dscn4325" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4325.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-774" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4326.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4326" alt="dscn4326" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4326.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-775" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4327.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4327" alt="dscn4327" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4327.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-776" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4330.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4330" alt="dscn4330" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4330.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-777" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4331.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4331" alt="dscn4331" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4331.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-778" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4334.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4334" alt="dscn4334" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4334.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-779" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4335.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4335" alt="dscn4335" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4335.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-780" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4337.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4337" alt="dscn4337" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4337.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-781" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4338.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4338" alt="dscn4338" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4338.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-782" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4343.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4343" alt="dscn4343" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4343.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-783" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4344.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4344" alt="dscn4344" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4344.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-784" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4346.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4346" alt="dscn4346" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4346.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-785" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4347.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4347" alt="dscn4347" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4347.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-786" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4348.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4348" alt="dscn4348" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4348.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-787" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4349.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4349" alt="dscn4349" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4349.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-788" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4350.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4350" alt="dscn4350" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4350.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-789" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4353.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4353" alt="dscn4353" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4353.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-790" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4354.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4354" alt="dscn4354" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4354.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-791" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4355.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4355" alt="dscn4355" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4355.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-792" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4356.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4356" alt="dscn4356" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4356.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-793" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4357.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4357" alt="dscn4357" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4357.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-794" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4358.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4358" alt="dscn4358" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4358.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-795" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4359.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4359" alt="dscn4359" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4359.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-796" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4360.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4360" alt="dscn4360" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4360.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-797" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4364.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4364" alt="dscn4364" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4364.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-798" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4368.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4368" alt="dscn4368" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4368.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-799" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4369.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4369" alt="dscn4369" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4369.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-800" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4374.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4374" alt="dscn4374" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4374.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-801" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4376.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4376" alt="dscn4376" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4376.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-802" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4379.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4379" alt="dscn4379" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4379.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-803" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4382.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4382" alt="dscn4382" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4382.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-804" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4384.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4384" alt="dscn4384" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4384.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-805" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4386.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4386" alt="dscn4386" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4386.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-806" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4387.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4387" alt="dscn4387" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4387.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-807" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4388.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4388" alt="dscn4388" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4388.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-949" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4389r.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4389r" alt="dscn4389r" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4389r.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-809" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4391.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4391" alt="dscn4391" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4391.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-810" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4392.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4392" alt="dscn4392" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4392.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-811" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4393.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4393" alt="dscn4393" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4393.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-812" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4394.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4394" alt="dscn4394" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4394.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-813" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4397.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4397" alt="dscn4397" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4397.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-814" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4399.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4399" alt="dscn4399" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4399.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-815" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4401.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4401" alt="dscn4401" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4401.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-816" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4402.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4402" alt="dscn4402" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4402.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-817" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4403.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4403" alt="dscn4403" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4403.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-818" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4407.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4407" alt="dscn4407" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4407.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-819" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4409.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4409" alt="dscn4409" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4409.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-820" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4410.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4410" alt="dscn4410" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4410.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-821" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4411.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4411" alt="dscn4411" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4411.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-822" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4412.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4412" alt="dscn4412" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4412.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-823" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4416.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4416" alt="dscn4416" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4416.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-824" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4418.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4418" alt="dscn4418" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4418.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-825" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4420.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4420" alt="dscn4420" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4420.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-826" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4425.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4425" alt="dscn4425" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4425.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-827" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4427.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4427" alt="dscn4427" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4427.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-828" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4428.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4428" alt="dscn4428" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4428.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-829" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4429.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4429" alt="dscn4429" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4429.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-830" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4430.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4430" alt="dscn4430" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4430.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-831" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4431.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4431" alt="dscn4431" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4431.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-832" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4434.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4434" alt="dscn4434" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4434.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-833" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4435.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4435" alt="dscn4435" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4435.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-834" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4437.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4437" alt="dscn4437" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4437.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-835" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4443.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4443" alt="dscn4443" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4443.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-836" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4444.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4444" alt="dscn4444" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4444.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-837" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4446.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4446" alt="dscn4446" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4446.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-838" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4447.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4447" alt="dscn4447" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4447.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-839" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4448.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4448" alt="dscn4448" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4448.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-840" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4451.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4451" alt="dscn4451" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4451.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-841" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4452.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4452" alt="dscn4452" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4452.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-842" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4456.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4456" alt="dscn4456" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4456.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-843" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4458.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4458" alt="dscn4458" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4458.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-844" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4461.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4461" alt="dscn4461" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4461.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-845" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4466.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4466" alt="dscn4466" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4466.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-846" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4467.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4467" alt="dscn4467" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4467.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-847" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4470.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4470" alt="dscn4470" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4470.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-848" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4473.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4473" alt="dscn4473" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4473.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-849" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4474.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4474" alt="dscn4474" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4474.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-850" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4477.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4477" alt="dscn4477" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4477.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-851" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4478.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4478" alt="dscn4478" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4478.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-852" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4480.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4480" alt="dscn4480" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4480.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-853" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4481.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4481" alt="dscn4481" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4481.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-854" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4485.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4485" alt="dscn4485" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4485.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-855" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4487.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4487" alt="dscn4487" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4487.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-856" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4488.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4488" alt="dscn4488" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4488.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-857" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4489.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4489" alt="dscn4489" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4489.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-858" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4491.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4491" alt="dscn4491" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4491.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-950" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4493r.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4493r" alt="dscn4493r" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4493r.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-860" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4494.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4494" alt="dscn4494" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4494.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-861" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4496.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4496" alt="dscn4496" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4496.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-862" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4499.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4499" alt="dscn4499" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4499.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-863" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4501.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4501" alt="dscn4501" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4501.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-864" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4502.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4502" alt="dscn4502" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4502.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-865" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4503.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4503" alt="dscn4503" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4503.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-866" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4504.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4504" alt="dscn4504" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4504.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-867" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4506.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4506" alt="dscn4506" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4506.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-868" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4513.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4513" alt="dscn4513" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4513.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-869" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4514.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4514" alt="dscn4514" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4514.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-870" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4516.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4516" alt="dscn4516" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4516.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-871" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4517.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4517" alt="dscn4517" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4517.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-872" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4519.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4519" alt="dscn4519" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4519.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-873" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4523.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4523" alt="dscn4523" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4523.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-874" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4524.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4524" alt="dscn4524" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4524.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-875" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4526.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4526" alt="dscn4526" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4526.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-876" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4530.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4530" alt="dscn4530" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4530.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-877" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4533.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4533" alt="dscn4533" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4533.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-878" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4535.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4535" alt="dscn4535" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4535.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-879" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4538.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4538" alt="dscn4538" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4538.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-880" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4540.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4540" alt="dscn4540" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4540.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-881" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4549.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4549" alt="dscn4549" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4549.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-882" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4556.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4556" alt="dscn4556" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4556.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-883" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4557.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4557" alt="dscn4557" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4557.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-884" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4558.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4558" alt="dscn4558" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4558.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-885" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4562.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4562" alt="dscn4562" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4562.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-886" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4565.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4565" alt="dscn4565" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4565.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-887" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4568.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4568" alt="dscn4568" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4568.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-888" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4569.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4569" alt="dscn4569" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4569.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-889" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4573.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4573" alt="dscn4573" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4573.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-890" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4577.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4577" alt="dscn4577" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4577.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-891" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4578.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4578" alt="dscn4578" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4578.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-892" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4583.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4583" alt="dscn4583" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4583.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-893" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4584.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4584" alt="dscn4584" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4584.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-894" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4588.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4588" alt="dscn4588" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4588.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-895" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4591.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4591" alt="dscn4591" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4591.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-896" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4593.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4593" alt="dscn4593" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4593.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-897" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4595.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4595" alt="dscn4595" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4595.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-898" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4597.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4597" alt="dscn4597" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4597.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-899" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4598.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4598" alt="dscn4598" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4598.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-900" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4600.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4600" alt="dscn4600" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4600.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-901" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4601.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4601" alt="dscn4601" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4601.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-902" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4602.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4602" alt="dscn4602" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4602.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-903" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4604.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4604" alt="dscn4604" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4604.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-904" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4605.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4605" alt="dscn4605" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4605.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-905" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4606.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4606" alt="dscn4606" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4606.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-906" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4609.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4609" alt="dscn4609" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4609.jpg" width="56" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-907" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4610.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4610" alt="dscn4610" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4610.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-908" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4613.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4613" alt="dscn4613" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4613.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-909" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4616.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4616" alt="dscn4616" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4616.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-910" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4617.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4617" alt="dscn4617" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4617.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-911" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4618.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4618" alt="dscn4618" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4618.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-912" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4619.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4619" alt="dscn4619" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4619.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-913" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4626.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4626" alt="dscn4626" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4626.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-914" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4628.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4628" alt="dscn4628" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4628.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-915" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4630.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4630" alt="dscn4630" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4630.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-916" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4631.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4631" alt="dscn4631" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4631.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-917" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4632.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4632" alt="dscn4632" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4632.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-918" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4634.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4634" alt="dscn4634" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4634.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-919" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4635.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4635" alt="dscn4635" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4635.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-920" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4638.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4638" alt="dscn4638" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4638.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-921" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4640.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4640" alt="dscn4640" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4640.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-922" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4643.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4643" alt="dscn4643" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4643.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-923" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4649.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4649" alt="dscn4649" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4649.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-924" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4650.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4650" alt="dscn4650" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4650.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-925" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4654.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4654" alt="dscn4654" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4654.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-926" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4657.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4657" alt="dscn4657" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4657.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-927" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4658.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4658" alt="dscn4658" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4658.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-928" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4659.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4659" alt="dscn4659" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4659.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-929" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4668.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4668" alt="dscn4668" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4668.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-930" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4669.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4669" alt="dscn4669" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4669.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-931" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4676.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4676" alt="dscn4676" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4676.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-932" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4677.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4677" alt="dscn4677" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4677.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-933" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4680.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4680" alt="dscn4680" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4680.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-934" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4681.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4681" alt="dscn4681" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4681.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-935" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4683.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4683" alt="dscn4683" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4683.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-936" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4685.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4685" alt="dscn4685" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4685.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-937" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4691.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4691" alt="dscn4691" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4691.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-938" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4694.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4694" alt="dscn4694" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4694.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-939" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4697.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4697" alt="dscn4697" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4697.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-940" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4700.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4700" alt="dscn4700" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4700.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-941" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4702.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4702" alt="dscn4702" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4702.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-942" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4707.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4707" alt="dscn4707" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4707.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 		
	<div id="ngg-image-943" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4709.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4709" alt="dscn4709" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4709.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-944" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4710.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4710" alt="dscn4710" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4710.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-945" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4715.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4715" alt="dscn4715" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4715.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-946" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4716.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4716" alt="dscn4716" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4716.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
		
 		
	<div id="ngg-image-947" class="ngg-gallery-thumbnail-box" style="width:20%;" >
		<div class="ngg-gallery-thumbnail" >
			<a href="http://cdn.spyparty.com/wp-content/gallery/evo13/dscn4720.jpg" title=" " rel="lightbox[set_18]" >
								<img title="dscn4720" alt="dscn4720" src="http://cdn.spyparty.com/wp-content/gallery/evo13/thumbs/thumbs_dscn4720.jpg" width="100" height="75" />
							</a>
		</div>
	</div>
	
				<br style="clear: both" />
	
 	 	
	<!-- Pagination -->
 	<div class="ngg-clear"></div> 	
</div>


<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/07/23/evo-2013-report-and-pics/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>On EVO 2013, Interviewing kcmmmmm, and losing a bet with Seth Killian</title>
		<link>http://www.spyparty.com/2013/07/10/on-evo-2013-interviewing-kcmmmmm-and-losing-a-bet-with-seth-killian/</link>
		<comments>http://www.spyparty.com/2013/07/10/on-evo-2013-interviewing-kcmmmmm-and-losing-a-bet-with-seth-killian/#comments</comments>
		<pubDate>Wed, 10 Jul 2013 21:01:33 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[beta]]></category>
		<category><![CDATA[competitive gaming]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[indie games]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3460</guid>
		<description><![CDATA[I had totally forgotten about the bet, but it&#8217;s clear I lost it, fair and square: &#8220;Didn&#8217;t I bet you in my invitation to evo last year that an evo guy would become your #1 player?   I want a beer, or at least some opportunity to be smug somehow :)&#8221; &#8211; Seth Killian I had [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>I had totally forgotten about the bet, but it&#8217;s clear I lost it, fair and square:</p>
<blockquote>
<p><em>&#8220;Didn&#8217;t I bet you in my invitation to evo last year that an evo guy would become your #1 player?   I want a beer, or at least some opportunity to be smug somehow :)&#8221; &#8211; <a href="https://twitter.com/sethkillian">Seth Killian</a></em></p>
</blockquote>
<p>I had just emailed Seth, <a href="https://twitter.com/ProtomCannon">Tom Cannon</a>, and <a href="https://twitter.com/Capy_Nathan">Nathan Vella</a> about <strong>SpyParty</strong> at <a href="http://evo.shoryuken.com/">Evo  2013</a>, the premier fighting game convention and tournament.  If you recall, <a title="SpyParty at Evo 2012 pics!" href="http://www.spyparty.com/2012/07/13/spyparty-at-evo-2012-pics/">we had a great time at Evo 2012</a>, and <strong>we&#8217;re going to be back again this week, at the Paris Hotel &amp; Casino, Las Vegas, July 12-14</strong>.  <strong>SpyParty</strong> is part of the Evo Indie Showcase, which is this awesome thing where they invite competitive multiplayer indie games to set up at the show so the Fighting Game Community (FGC) can check them out.  You can see the list of returning games from last year <a href="http://evo.shoryuken.com/2013/07/08/inside-the-evo-2013-indie-showcase-part-1-the-returning-champions/">here</a>, and the list of new games for this year <a href="http://evo.shoryuken.com/2013/07/10/inside-the-evo-indie-showcase-part-2-the-new-challengers/">here</a>.</p>
<p>I was mailing those guys because I&#8217;d just realized that <a href="http://www.twitch.tv/kcmmmmm"><strong>kcmmmmm</strong></a> (a.k.a. Korey Mueller) had taken the #1 spot on the <strong>SpyParty</strong> leaderboard about a month previously, and he had told me he&#8217;d first seen the game at Evo 2012, and <strong>kcmmmmm</strong> also lives in Las Vegas, and is going to be helping out at the booth on Friday, the 12th!   I figured I&#8217;d let those guys know; hey, wasn&#8217;t that neat?  That was when Seth reminded me of the bet from his March 16th, 2012 invitation:</p>
<blockquote>
<p><em>&#8220;If you take me up on it, I&#8217;d even be willing to make a gentleman&#8217;s bet</em> <em>with you that an that an EVO attendee will be your #1 player in </em><em>subsequent tests, and take down whoever the existing top players might </em><em>be. I dunno which one, but I trust implicitly in these guys as a group.&#8221;</em></p>
</blockquote>
<p>Welp.</p>
<p>In honor of losing this bet, of Seth&#8217;s prescience about the FGC, of flying to Evo 2013 tomorrow, and of <strong>kcmmmmm</strong>&#8216;s leaderboard ascendance and his Friday presence at Evo, I decided to interview him about his history with fighting games, Evo, and <strong>SpyParty</strong><strong>.</strong><strong></strong></p>
<p>You can follow <strong>kcmmmmm</strong> on twitch.tv, where he plays some great high-level <strong>SpyParty</strong> games with live comments at <a href="http://twitch.tv/kcmmmmm">http://twitch.tv/kcmmmmm</a></p>
<a name="kcmmmmm"></a><h3>kcmmmmm</h3>
<p><em>Why don&#8217;t we start with you giving me a bit of backstory about you and Evo and the FGC and whatnot? How many Evos have you been to, how&#8217;d you get into it, which fighting games do you like, why, how&#8217;d you hear about <strong>SpyParty</strong>, what&#8217;d you think of the Indie Showcase last year, etc.</em></p>
<p>I started gaming at a pretty young age, but never had a large selection of games until I got older and could afford my own. So, I was stuck with whatever few games I already had on SNES, one of which was Street Fighter 2. My brother and I were BAD. I really didn&#8217;t play many more fighting games until a friend introduced me to the Guilty Gear series. From there I was hooked on the game, and played it almost religiously with anyone I could find. Unfortunately, that was very few people. Only a few of my friends were into fighter&#8217;s, so it wasn&#8217;t until BlazBlue came out in 2008 that I finally was able to consistently find people to play online. I had played a lot of non-fighters online in the past&#8230;primarily Counter-Strike. The fighting community is so different. Since fighters rely on more than a purely twitch-response skill set, fg players tend to be more knowledgeable about the games they play. In a shooter, you only need to know map layout, relative weapon strengths/weaknesses, and how to quickly shoot someone in the head the second you see them. In fg&#8217;s, success depends on a large variety of information, most of which is not immediately apparent or available. Essentially, you need to learn which moves have higher priority, what moves can gatling or combo into each other, safe blockstrings, move properties (which usually depend on knowing the core game system), just to name a few. And just knowing it for your own character isn&#8217;t enough. Players have to learn the relative matchups, so they know their own strengths and weaknesses in any situation. The information requirement is incredibly high, so the community works together to gather all of the pertinent information. Players break down the games on a frame-by-frame level, and make that information available to everyone. The community sort of reflects this togetherness, and individual members just seem more interested in talking about their favorite games on a deeper level than players in other genres. It&#8217;s a great community because players work so hard to help each other improve &#8211; to help their opponents improve. I met some of my best friends today playing fg&#8217;s online, and even more than the games themselves, the community has kept me into the genre.</p>
<p>My favorite series is the Guilty Gear series. I&#8217;ve never been particularly good at it (mainly because of a lack of a decent online version). But since it reintroduced me to fg&#8217;s, it will always have a special nostalgia for me. The game has an amazing style, and matches are intense and fun. In general, I like 1v1 air-dash fighters most. Guilty Gear, BlazBlue, Persona 4 Arena (P4A), <a href="http://skullgirls.com/">Skullgirls</a> also counts (sort of). I like being able to dash right in and get overly aggressive on defending opponents with mixups. I usually play to one of two extremes. Either I play a slow, beefy character (like a grappler), or a quick aggressive character.</p>
<p>But there&#8217;s something special about the slower paced fighters that air-dash fighters lack. I was actually surprised at how much I enjoy Street Fighter 4. A lot of people complain that the game is all about footsies, and less about actual combat. It&#8217;s true, but the tension of slowly sussing out your opponent, poking at air to bait mistakes, predicting jump-ins with anti-air attacks&#8230;all of that lends this kind of chess-like feel. You don&#8217;t really get that in quicker paced games. Any good fighter allows for deep opponent-reading, but SF4 seems to hit a higher level by giving players the <i>time</i> to think. Somehow it strikes that perfect balance between action and meditation. At any given moment, when you&#8217;re down and almost out, you can come back with a series of perfectly read and executed responses. It&#8217;s possible in faster games&#8230;but seems more unlikely.</p>
<p>I enjoy watching team fighters like MvC more than playing. There&#8217;s just too much stuff going on the screen. It just feels less personal when you take away the 1v1 mechanic.</p>
<p>Last year&#8217;s EVO (2012) was the first I ever attended. It was&#8230;incredible. A few friends from all over the US flew in, and we spent the weekend beating each other up. I think we spent most of our time playing P4A, since it hadn&#8217;t been released yet, and we were hyped to check it out. My favorite part of EVO had to be the finals. Particularly the King of Fighters 13 finals&#8230;that game brought some amazing competition, and was so fun to watch.</p>
<p>As for the indie showcase, there were a few interesting games there. I remember playing a My Little Pony fg&#8230;which was actually pretty fun. <a href="http://www.divekick.com/">DiveKick</a> was surprisingly awesome. I thought it was going to be a bit of a joke, but it&#8217;s actually pretty damn competitive. It sort of cuts out all of the flashy combos and super moves, and instead focuses entirely on the guessing game. The loser is always the person who loses their cool and jumps or dives first, or waits too long to dive after a jump. It&#8217;s like a tribute to the pissing match. I remember playing <a href="http://aztez.com/">Aztez</a> as well. It&#8217;s a side-scrolling beat-em-up with stylized black and white (and very, very red) visuals&#8230;the combat system is actually pretty similar to a fighting game&#8217;s: you can combo, grab, air juggle, and just beat helpless enemies senseless.</p>
<p>However, of all of the games at EVO, one in particular caught my eye. In the midst of all of these high tech and visually-stunning games (right across from PS All-Stars&#8217; booth, if I recall) was this sort of ugly game which looked like The Sims from 2002. I&#8217;m not a graphics whore or anything, but the game just felt very out of place. It seemed as far removed from fighting games as was possible. It caught my eye immediately. I wandered over, and there&#8217;s just this table of pamphlets and a sign telling me to read the manual first. Read the manual? What? So I pocketed a manual to read later, walked up to the guy standing next to the table, and asked &#8220;So&#8230;what am I looking at here?&#8221; I didn&#8217;t know you were the creator of the game, but you laughed and explained the game to me, and I immediately loved the idea. A slow paced 1v1 game where the players are given the time to suss out an opponent&#8217;s actions and respond? Kind of sounds a bit familiar actually.</p>
<p><em>On the topic of learning character-specific information in fighters you mention above, I can&#8217;t remember if you&#8217;re a fan of the &#8220;dossiers&#8221; idea for <strong>SpyParty</strong>, where the different characters have different backgrounds and biases, so the General might drink too much every night, Girta might be obsessed with statues, etc., but what do you think of this (or some variant on this) with respect to the amount of study necessary to get good at a fighting game?  More generally, how do you feel about having to do &#8220;homework&#8221; for games?</em></p>
<p>Well, originally I was against the &#8220;dossier&#8221; idea.  I still don&#8217;t think it would make sense in the current state of the game, but when the new art is implemented, and characters all have unique traits, animations, and personalities, it makes sense to include that personality into the gameplay.  As for how this relates to studying in fighting games, it&#8217;s hard to say.  Research in a fighting game is very different than <strong>SpyParty</strong>; it involves spending an amount of time honing combos, practicing hit confirms, learning what your character is capable of (and how they match against opposing characters), testing defensive options, gimmicks, traps, etc.  A lot of this time is spent with a direct hands-on approach, interspersed with finding and learning tech from other players, which you then practice yourself.  Learning character traits in <strong>SpyParty</strong> might end up being equally time consuming, but I think most of that time would be spent observing the &#8220;natural state&#8221; of the AI, and learning their behaviors.  Since micro is largely a non-issue in the game (compared to fighters), learning AI behavior would be paramount to taking advantage of the &#8220;dossier&#8221; concept.  In a way, I think this actually might be more difficult information to gather, because it&#8217;s more entertaining to learn stuff by actually directly tackling it than simply watching it unfold in the game on its own.  Eventually, players will make most of that information available to everyone, so you&#8217;ll be able to find it online without having to do all of the work, but reading (or observing) that information and applying it in a game are very different.  I don&#8217;t mind doing homework for games, so long as there is a reward at the end of it.  If players put hundreds of hours into studying the &#8220;dossier&#8221; behaviors, but are unable to apply that to real games, then it will have failed as a feature.  So it needs to be deep and effective to ensure that players benefit from doing their homework.</p>
<p><em>I assume you did not have a clear idea that a year later you would be at the top of the leaderboard.  How did you go from pocketing the manual to becoming so passionate about <strong>SpyParty</strong>?  Was there a point where you said to yourself &#8220;I want to be one of the top players of this game?&#8221;, or do you do that for any game you really like, or did you look up one day and realized you&#8217;d played 6000+ games, or what?  Basically, what&#8217;s your arc in <strong>SpyParty</strong>?</em></p>
<p>I hadn&#8217;t heard of <strong>SpyParty</strong> before EVO, but I was just immediately blown away by the concept.  This is a really cool idea!  I signed up for the beta a few days later, and realized then that the beta was closed and there was a waiting list.  A really long waiting list.  So, I just did what I could to follow the game here and there, reading news updates and waiting for my invitation.  From what I could tell, the game&#8217;s community was really blossoming into something special.  There was a lot of talk about expert players mentoring newbies, and people just being generally pleasant.  I guess my main goal, even before getting in, was to be a positive member of the community myself when I finally did get in.  Somehow, that translated into getting to know all of the veterans, who were happy to mentor me along the way, and helping along players newer than myself.  Next thing I knew, I was playing on even footing with the players who had mentored (and destroyed) me not so long ago.  There&#8217;s always this feeling that there&#8217;s some way I can improve, and every time I meet a personal goal, I find another one.  I couldn&#8217;t really look at the game and decide to be a top player, I just wanted to continue to improve&#8230;and at some point, I guess I got pretty decent at it.  Now that you mention it, 6000 games is a lot.</p>
<p><em>Can you compare and constrast the <strong>SpyParty</strong> community and the FGC?  Not in a &#8220;which one&#8217;s better&#8221; sense, but what are the similarities and differences, what can <strong>SpyParty</strong> learn from the FGC, etc.</em></p>
<p>Well, obviously the biggest difference between the two communities is that the FGC is a genre community, whereas <strong>SpyParty</strong>&#8216;s is a singular game community.  So, when you compare <strong>SpyParty</strong>&#8216;s community to all of FG&#8217;s, you find that there is just an enormous amount of diversity in interests within the FGC.  Everyone who plays and gets involved in <strong>SpyParty</strong> has this one game in common, but being a part of the FGC is a much more broad category.  There are a lot of differing opinions on what FG&#8217;s are best, where most players prefer one style of game over another, and half the time they don&#8217;t agree.  Sometimes it can get pretty ridiculous, but for the most part, everyone gets along.  There&#8217;s a lot of diversity in player preference, and a general acceptance of that fact within the overall community.  For the most part, players are willing to help each other out more often than put each other down.  Ultimately, I think the longevity of the community is probably the biggest difference between <strong>SpyParty</strong>&#8216;s community and the FGC.  Considering the increasing number of games, wide variety of players from all over the world, and tens of years of development, the community is still incredibly strong and continues to encourage diversity.  If the <strong>SpyParty</strong> community can learn anything from that, it&#8217;s to continue to work towards helping other players develop, and continuing to work to maintain the quality.  This means nurturing each new member as a valuable part of the community, and teaching each of them to uphold the high standards we set for it and ourselves right now.</p>
<p><em>Did I get you in any of the Evo 2012 pics?</em></p>
<p>You actually did get me, in one picture.  I&#8217;m the guy in the blue shirt and glasses, standing behind the center table.  Hands in pockets, looking around confused.</p>
<p><a href=" http://www.spyparty.com/2012/07/13/spyparty-at-evo-2012-pics/#lightbox=dscn1536.jpg">http://www.spyparty.com/2012/07/13/spyparty-at-evo-2012-pics/#lightbox=dscn1536.jpg</a></p>
<a name="kcmmmmm%2C+by+the+numbers"></a><h3>kcmmmmm, by the numbers</h3>
<p style="text-align: center;"><em>&#8220;Now that you mention it, 6000 games is a lot.&#8221;</em></p>
<table style="width: 60%; text-align: center; margin-left: 20%; margin-right: 20%;">
<thead>
<tr>
<th>Username</th>
<th>Total Matches</th>
<th>Match Time</th>
<th>Total Games</th>
<th>Game Time</th>
<th>Login Time</th>
</tr>
</thead>
<tbody>
<tr>
<td>kcmmmmm</td>
<td>709</td>
<td>416:38:23</td>
<td>6436</td>
<td>262:00:48</td>
<td>1020:02:24</td>
</tr>
</tbody>
</table>
<table style="width: 60%; text-align: center; margin-left: 20%; margin-right: 20%;">
<thead>
<tr>
<th colspan="6">As Spy</th>
</tr>
<tr>
<th>Total Spy Games</th>
<th>Total Spy Wins</th>
<th>Mission Wins</th>
<th>Timeouts</th>
<th>Sniper Shot Spy</th>
<th>Sniper Shot Civilian</th>
</tr>
</thead>
<tbody>
<tr>
<td>3179</td>
<td>1690</td>
<td>837</td>
<td>70</td>
<td>1419</td>
<td>853</td>
</tr>
</tbody>
</table>
<table style="width: 60%; text-align: center; margin-left: 20%; margin-right: 20%;">
<thead>
<tr>
<th colspan="6">As Sniper</th>
</tr>
<tr>
<th>Total Sniper Games</th>
<th>Total Sniper Wins</th>
<th>Shot Spy</th>
<th>Shot Civilian</th>
<th>Spy Mission Wins</th>
<th>Spy Timeouts</th>
</tr>
</thead>
<tbody>
<tr>
<td>3257</td>
<td>2248</td>
<td>2052</td>
<td>556</td>
<td>453</td>
<td>196</td>
</tr>
</tbody>
</table>
<p>Here&#8217;s the current Top 10:</p>
<table style="width: 60%; text-align: center; margin-left: 20%; margin-right: 20%;">
<thead>
<tr>
<th style="text-align: center;">Username</th>
<th>Total Games</th>
<th>Game Time</th>
<th>Total Spy Wins</th>
<th>Total Sniper Wins</th>
</tr>
</thead>
<tbody>
<tr>
<td>kcmmmmm</td>
<td>6436</td>
<td>262:00:48</td>
<td>1690</td>
<td>2248</td>
</tr>
<tr>
<td>sawchuk1</td>
<td>5151</td>
<td>212:48:25</td>
<td>1745</td>
<td>1435</td>
</tr>
<tr>
<td>drawnonward</td>
<td>5056</td>
<td>195:34:58</td>
<td>1201</td>
<td>1207</td>
</tr>
<tr>
<td>virifaux</td>
<td>4429</td>
<td>130:44:51</td>
<td>998</td>
<td>1166</td>
</tr>
<tr>
<td>r7stuart</td>
<td>4324</td>
<td>162:48:13</td>
<td>1432</td>
<td>1580</td>
</tr>
<tr>
<td>tytalus</td>
<td>3692</td>
<td>142:42:20</td>
<td>1049</td>
<td>1184</td>
</tr>
<tr>
<td>scallions</td>
<td>3685</td>
<td>147:24:33</td>
<td>980</td>
<td>1031</td>
</tr>
<tr>
<td>james1221</td>
<td>3506</td>
<td>150:39:27</td>
<td>882</td>
<td>1252</td>
</tr>
<tr>
<td>zerotka</td>
<td>3467</td>
<td>143:43:11</td>
<td>733</td>
<td>1025</td>
</tr>
<tr>
<td>turnout8</td>
<td>3437</td>
<td>138:26:09</td>
<td>808</td>
<td>920</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>A couple notes about the current <strong>SpyParty</strong> leaderboard, since it&#8217;s a little bit different from a lot of games: </p>
<ul>
<li>Right now, <strong>SpyParty</strong> ranking is based on total games played.  I don&#8217;t have a skill-based ranking algorithm implemented yet,<sup><a href="http://www.spyparty.com/2013/07/10/on-evo-2013-interviewing-kcmmmmm-and-losing-a-bet-with-seth-killian/#footnote_0_3460" id="identifier_0_3460" class="footnote-link footnote-identifier-link" title="If you&rsquo;re curious, I&rsquo;m going to use this one.">1</a></sup> but because most elite players agree we haven&#8217;t found the skill-ceiling for the game yet, the number of games played is fairly well correlated with skill, at least to a first approximation.  A lot of the top players play mentoring games with newbies, and other wacky player-created alternative game modes for fun, so the number of games isn&#8217;t a perfect indicator of skill, but if you&#8217;re at the top of the leaderboard with thousands of games played, you are really really really good at <strong>SpyParty</strong>, way better than me, and I wrote the game.  <strong>kcmmmmm</strong> can hand me my ass without trying very hard on his worst days.</li>
<li>There is another player, <strong>virifaux</strong> in the above top-10, who is an alt started about halfway through the player&#8217;s SpyParty career, and if we add <strong>virifaux</strong><em></em> and <strong>viriflod</strong> (his original username) together, they&#8217;re actually the highest ranking player, and <strong>kcmmmmm</strong> is 2nd ranked!  This is an issue sports don&#8217;t have to deal with.  &#8220;Hey, isn&#8217;t that Tiger Woods with a fake mustache?&#8221;</li>
</ul>
<p>&nbsp;</p>
<hr/><ol class="footnotes"><li id="footnote_0_3460" class="footnote">If you&#8217;re curious, I&#8217;m going to use <a href="http://www.csie.ntu.edu.tw/~cjlin/papers/online_ranking/">this one</a>.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/07/10/on-evo-2013-interviewing-kcmmmmm-and-losing-a-bet-with-seth-killian/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Diversity and Inclusivity in SpyParty and the Beta Community</title>
		<link>http://www.spyparty.com/2013/06/18/diversity-and-inclusivity-in-spyparty-and-the-beta-community/</link>
		<comments>http://www.spyparty.com/2013/06/18/diversity-and-inclusivity-in-spyparty-and-the-beta-community/#comments</comments>
		<pubDate>Tue, 18 Jun 2013 23:40:30 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[art]]></category>
		<category><![CDATA[beta]]></category>
		<category><![CDATA[competitive gaming]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[indie games]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3359</guid>
		<description><![CDATA[When you&#8217;re making an online multiplayer game, you have to worry about the community that builds itself around your game.  In the beginning the worry is, &#8220;Will there be a community at all?&#8221;  If you&#8217;re lucky and don&#8217;t screw things up too badly, and people like your game, a community will start growing around it, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>When you&#8217;re making an online multiplayer game, you have to worry about the community that builds itself around your game.  In the beginning the worry is, &#8220;Will there be a community at all?&#8221;  If you&#8217;re lucky and don&#8217;t screw things up too badly, and people like your game, a community will start growing around it, and as the designer, it&#8217;s your job to nurture it and help it stay healthy.  The analogy with parenting is pretty obvious.  And, just like with parenting, while you have some influence over the community&#8217;s health, in a lot of ways all you can do is set a good example with your own behavior and the feel of your game, and hope for the best.</p>
<p>One of the aspects of <strong>SpyParty</strong> that I&#8217;m most proud of is its community.  It&#8217;s really hard to describe how it feels to play the game, or hang out in the lobby, the forums, or the TeamSpeak channel, or <a title="SpyParty Streams Lists and Notification Sign Up" href="http://www.spyparty.com/streams/">watch a stream</a>, and see all these people who were strangers to each other before they started playing your game&#8230;and they&#8217;re friends now.  What&#8217;s more, they&#8217;re welcoming new people into the community with open arms, setting their own good examples and helping it stay healthy!  Let&#8217;s just say it&#8217;s a pretty great feeling.  It&#8217;s an even greater feeling when you know you&#8217;re making an insanely hardcore player-skill competitive game, and they&#8217;re still all helping each other out, both beginners and elite players.</p>
<p>Another aspect of <strong>SpyParty</strong> that&#8217;s incredibly important to me is <em>diversity</em>, in terms of allowing people to choose characters that fairly represent a wide array of different colors, body shapes, ages, genders, sexual orientations, and physical abilities.  In fact, I have a goal to make <strong>SpyParty</strong> the &#8220;most diverse game ever&#8221;, in the sense that you will be able to kick somebody&#8217;s ass straight into next week as the Spy while playing as a queer octogenarian of color in a wheelchair.  You might move a little slower, but you&#8217;re low to the ground, so it&#8217;s easier to hide that listening device!  I am very lucky that the fiction of <strong>SpyParty</strong> is compatible with making an intense player-skill game that can still be diverse in this way.<sup><a href="http://www.spyparty.com/2013/06/18/diversity-and-inclusivity-in-spyparty-and-the-beta-community/#footnote_0_3359" id="identifier_0_3359" class="footnote-link footnote-identifier-link" title="There are other important kinds of diversity SpyParty probably can&rsquo;t explore effectively, like class and income diversity.">1</a></sup> You are unlikely to see this kind of playable character plausibly slashing dragons with a sword or shooting space aliens, but as a Spy at a cocktail party?  I say it&#8217;s perfect cover!</p>
<p>You can see a start to see this diversity in <a title="The New SpyParty Character Art Style" href="http://www.spyparty.com/2012/08/27/the-new-spyparty-character-art-style/">the initial batch of new characters we&#8217;ve revealed</a>:</p>
<div id="attachment_2634" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2012/08/SpyParty-AllChars_16x9-sm.jpg"><img class="size-large wp-image-2634" alt="They're a good start, diversity-wise." src="http://cdn.spyparty.com/wp-content/uploads/2012/08/SpyParty-AllChars_16x9-sm-600x337.jpg" width="600" height="337" /></a><p class="wp-caption-text">They&#8217;re a good start, diversity-wise.</p></div>
<p>I&#8217;ll talk more about this &#8220;in-game diversity&#8221; in another post.</p>
<p>Today, I want to talk about a complementary kind of diversity, that of the community.  I don&#8217;t have any data on this, but I think these two kinds of diversity go hand-in-hand, because if the game is setting a good example with its design, gameplay, and aesthetics, I think it&#8217;s probably more likely the community will follow suit.</p>
<p>But, a more important part of community diversity is the community valuing inclusiveness and speaking up for it.  Below is an example from last week in the beta forums.  The influx of new people from the <a title="SpyParty Beta Registration" href="http://www.spyparty.com/beta/">open beta</a> happened, and one of the community members felt the need to post a note to the new players.  Some mature discussion happened, including some respectful disagreement, and people arrived at a consensus.  This is not how conventional wisdom says it&#8217;s supposed to work in hardcore multiplayer gaming communities on the internet, but yet, it can if everyone wants it to work that way.</p>
<p>I thought this thread was a perfect example of the <strong>SpyParty</strong> beta community in action.  Some of the players posting in this thread are at the top of the leaderboard, the best players in the game.  <em>Way</em> better than you or me, and I made the damned game.  But they&#8217;re also respectful, humble, mature, and open to the fact that there are other ideas in the world that may not come naturally but are worth the effort to consider, and they&#8217;re working to keep the community a healthy environment for all kinds of people&#8230;a healthy environment to ruthlessly shoot each other<sup><a href="http://www.spyparty.com/2013/06/18/diversity-and-inclusivity-in-spyparty-and-the-beta-community/#footnote_1_3359" id="identifier_1_3359" class="footnote-link footnote-identifier-link" title="and the occasional innocent civilian">2</a></sup> over and over again.</p>
<p>If you&#8217;d like to be a part of this kind of community, <a title="SpyParty Beta Registration" href="http://www.spyparty.com/beta/">you are welcome to join us</a>!</p>
<table style="margin-right: 10%; margin-left: 10%; border-style: none; width: 80%; background-color: #eee;" border="0">
<tbody>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2"><strong>Subject: PSA to the new people about community and language</strong></td>
</tr>
<tr>
<td style="border-style: none;"><strong>noche</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/11 17:10</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>Hey everyone -</p>
<p>I know we recently got a lot of new people what with the prepping for the open beta and now with the beta open the server is flooded with new people and it&#8217;s great! Thanks for coming and playing with us. I just have something to mention since we do have so many new people:</p>
<p>Please be polite &#8211; we do have girls, gay people, queer people, trans people, people of every color, shape and size playing the game. Don&#8217;t make disparaging remarks about another group of people (or even your own). You don&#8217;t know who the other person(s) watching are. It alienates new people trying to get into the community that aren&#8217;t typically seen openly in other gaming groups. It also makes those of us who have been here a while not quite as excited to have so many new faces.</p>
<p>I know for me (yes, I am mostly a girl) I am more hesitant to play new people when my friends aren&#8217;t on the game or in ts because frankly I don&#8217;t want to deal with people making comments about girls, the two larger characters, etc. It&#8217;s not pleasant and I am nearly at the point where I don&#8217;t want to play new people that I haven&#8217;t seen play my friends on stream. I love to mentor but I am not going to put myself through the awkwardness of telling someone that just made a disparaging comment about women that I am one. Or that I am not skinny, or that I am queer, or or or. It&#8217;s just not fun and has been known to ruin my evening enough that I get off the game. Between my two accounts I have over 1000 games &#8211; clearly I really like spyparty.</p>
<p>This isn&#8217;t just about me though. I want to see more non male people playing spyparty. Right now Gun0m and I are the only two regular females that are active (as far as I know). We have had a lot of other females go through the game and bump right back out and I can&#8217;t help but think that a part of that is the attitude about anyone that isn&#8217;t male that some people have. I know that out girls are a largely unseen part of gaming but there are a lot of them, many just hide behind their screen name because to come out openly as a female is to invite ridicule quite often. It&#8217;s not as bad in spyparty as in other games but that doesn&#8217;t mean that the fear isn&#8217;t there still.</p>
<p>Seeing someone make a comment about &#8216;female logic&#8217; or calling bertha &#8216;brown cow&#8217; is a real turn off. While we don&#8217;t have as much open hostility it makes new people that don&#8217;t know that turn away because this is just like every other game. I know how great of a community we have &#8211; I have made some great friends through this game and I want more people involved. I also want it to be an inclusive community, not one that makes people like me feel bad and want to go play something else (that doesn&#8217;t involve other people).</p>
<p>Just have fun &#8211; that doesn&#8217;t have to involve putting other people, or groups of people down.</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>kcmmmmm</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/11 21:59</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>I don&#8217;t intend to, but if I ever cross a line, please let me know, and I&#8217;ll do my best to correct that behavior in the future.</p>
<p>_________________<br />KCMmmmm</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>icarox</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/12 03:19</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>I agree completely, and I have nearly zero tolerance for that kind of behaviour.</p>
<p>When some jackasses chat on Drawns stream, they always ask about the graphics and every single time there&#8217;s been comments of how ugly the ladies are and etc.</p>
<p>If you expect me to be your friend; please use a language that reflects the manner of somebody who is respectful to the highest amount of people possible.</p>
<p>If you can&#8217;t do that, fake it &#8217;til you make it.</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>emotedllama</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/12 12:25</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>I, uh, don&#8217;t have anything to add other than that I completely agree with the OP. Let&#8217;s not be discriminatory.</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>checker</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/12 19:57</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>Stickied for truth.</p>
<p>It&#8217;s very important to me that SpyParty be the most diverse game ever, both in the game, in the sense that there is going to be a more diverse set of playable characters in this game than any other game in history, and that the community is diverse and supportive. I love the idea of having an extremely hardcore player-skill competitive game, but with an awesome and helpful community. I&#8217;m an optimist, and I think it&#8217;s possible.</p>
<p>So, please don&#8217;t be afraid to remind somebody to be cool about words or phrases. It&#8217;s a very big adjustment from &#8220;normal gaming communities&#8221;, so new people will need to be cut some slack. Some people don&#8217;t know that saying &#8220;fat chick&#8221; is offensive to some people, and just giving them a heads up is enough to make them think about it and adjust their behavior. It&#8217;s easy to describe the characters using their clothes instead of their body shape, &#8220;orange dress&#8221; FTW, for example.</p>
<p>If you don&#8217;t feel comfortable talking to somebody, just PM me with a timestamp of when you heard something alienating and let me know, and I can check the logs and email the person and explain how we do it around here. If you do bring something up in a kind and empathetic way and the person is not receptive, also PM me. If somebody gets really out of hand and doesn&#8217;t respond to warnings, I will ban them from online play, of course.</p>
<p>Thanks to everybody who helps the community stay awesome, helpful, kind, and mature,</p>
<p>Chris</p>
<p>PS. I&#8217;m going to post this thread on the blog, assuming everybody is okay with that. It&#8217;s important to be clear and public about this stuff, and it&#8217;s way more powerful when it&#8217;s the community saying it first, not just me. Also, kate is back with a vengeance lately, and I believe there are other women playing who don&#8217;t announce that fact.</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>noche</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/13 01:41</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>Checker you&#8217;re awesome. Go ahead and post away btw, I am chill.</p>
<p>on a side note &#8211; I don&#8217;t think I have met kate. hmmm. when is she on?</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>zerotka</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/13 11:04</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>I know of at least 4, not including noche and kate. Our community is probably more diverse than we know.</p>
<p>good post. +3</p>
<p>_________________<br />ZeroTKA</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>kcmmmmm</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/13 16:04</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>This is a bit off-topic, but I wish to add that the SpyParty community is ecstatic to have new members join and contribute to the forum. Whether you&#8217;re here asking questions, posting bugs, offering opinions (positive or negative), making suggestions, or just chatting casually, we&#8217;re happy to have you join in. Worry less about posting everything in the exactly perfect place or about reposts, and more about the stuff in the OP; be respectful to others in the community, and we&#8217;ll do the same for you. Welcome to the SpyParty beta, and &#8211; perhaps more importantly &#8211; welcome to the SpyParty beta community!</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>cornergraf</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/14 05:45</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>I don&#8217;t try intentionally to be rude in the chat, and I try to stay nice and polite, but I think some of you are taking this to the extreme a bit too much. Remarks like &#8220;female logic&#8221; are absolutely wrong to use, I agree, but some of the other examples given here are not so bad.</p>
<p>If someone is fat, they <em>are</em> fat, and I will call them fat. &#8220;Fat chick&#8221; is not any more offensive than &#8220;fat guy&#8221;. This is not to offend fat people, but it&#8217;s just how it is. If you have a problem with being fat, then do something about it, don&#8217;t tell me to not offend you. Or just ignore me if you think I am stupid &#8211; &#8220;sticks and stones&#8230;&#8221; and all that.</p>
<p>Just to reiterate &#8211; I do not mean to offend anyone but political correctness can be taken too far. And some (insecure?) people have a tendency to take offense at the slightest word, even if it was not meant to offend. To those people I would like to suggest to relax a bit.</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>bl00dw0lf</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/14 12:37</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>I don&#8217;t actually think I can change your mind on the Political Correctness front, but hopefully you can see reason just for being considerate. If one or more users don&#8217;t want you using those terms for two characters out of 20, and have provided alternatives, does not doing it really inconvenience you that much?</p>
<p>You may not see yourself as using those words in a harmful way, but there are certainly people out there who will. Detecting intent through purely text is impossible, there&#8217;s all kinds of hilarious and sad examples on the Internet of people failing to catch the use of sarcasm.</p>
<p>Body issues are a serious thing, and using words like &#8220;fat&#8221; when there is no reason to may be jarring (Maybe, I&#8217;m making this up as I go). Telling all people who are unhappy with their body image to &#8220;do something about it&#8221; is unhelpful. For all you know they are doing everything they can to better themselves. Obesity has a genetic factor, so not everybody has to put equal amounts of work into maintaining a healthy weight. It may be easier for you to stay healthy with your genes and age than others.</p>
<p>Lastly, we are all trying our best to foster an amazing community. We don&#8217;t want anyone to get turned off of the game because of things that the community does. If you want to grow the community like most of us do, being respectful of all people is a part of it. I would much rather see a mature respectful community than a community of younger teenagers who think using slurs or calling people fat is funny (To be clear, I do <em>not</em> think you are a part of this second group). Accepting everybody, even those you personally think take political correctness too far, will keep the community awesome. Calling the OP names does not benefit the community.</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>checker</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/14 13:13</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>Yeah, I want to be clear here: this is not reddit, or the internet at large. This is my house, and I am incredibly delighted and incredibly almost-indescribably grateful that everybody decided to come over for this party I&#8217;m having, and people do seem to be having a genuinely great time, which basically brings me almost to tears of joy on a daily basis. But, everyone needs to be polite to each other. There aren&#8217;t going to be debates about free speech and truth and whether some words should or should not be hurtful and how somebody else should feel in one situation or another, that can happen elsewhere (almost everywhere) on the internet.</p>
<p>No single word or phrase is important enough to keep using on principal or out of habit if it hurts somebody else&#8217;s feelings, no matter how truthful and purely descriptive and well intentioned you feel it is. If you are the kind of person who would call someone with a higher than average BMI &#8220;fat&#8221; when they&#8217;re standing right there in real life, especially after they ask you not to, or act awkwardly when you say it, then you need to keep that to yourself around here, both in the forums, and in the lobby. How you talk when you&#8217;re not at my place is none of my business, of course, but if you&#8217;re over here, then these are the rules.</p>
<p>This is not aimed at cornergraf specifically, but that post was a good opportunity for me to write this post. I totally empathize that &#8220;political correctness&#8221; can be taken to extremes and can sometimes seem absurd or like a minefield, especially when there was absolutely no intent to hurt anybody, but as bl00dw0lf says, here it&#8217;s not so much about political correctness as it is about just being nice to a bunch of people who share the same interests around this video game I&#8217;m trying to make awesome with all of your help. So, if somebody asks you nicely to not use a word so casually, I hope everyone will agree that the right thing to do is to be a kind human being and say, &#8220;oh, yeah, sorry, didn&#8217;t realize, no problem&#8221; and then just continue on with talking about the fun stuff you were talking about before, and the wrong thing is to get upset and start some discussion about how that other person shouldn&#8217;t feel some way. Language is rich, and there are plenty of words to describe something or someone without needing to use ones that may hurt somebody&#8217;s feelings.</p>
<p>It&#8217;s a two-way street, of course. Often people aren&#8217;t used to being sensitive in this way, don&#8217;t know which words might hurt somebody, make mistakes even if they do know (I am guilty of this too!), and need reminders. I don&#8217;t think over-sensitivity is anywhere near as big a problem as insensitivity in communities, but it can be a problem, so people who are sensitive to this stuff need to be empathetic as well. I have never seen anybody here intending to hurt somebody else&#8217;s feelings, and intent matters a lot in my book. But, it takes a lot of social courage to ask somebody politely to stop using a word, so if you&#8217;re asked, please understand that.</p>
<p>The vast majority of people in the world are considerate and mean well, and if given the chance to communicate and have an identity they will behave like good people you would invite over in real life. I believe that completely, and this community is designed around that premise. No, that does not mean you&#8217;re all invited to my real house, my house is tiny, you&#8217;d never fit.</p>
<p>Thanks for understanding, and &lt;3,</p>
<p>Chris</p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>cornergraf</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/14 13:29</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>Edit: trying to make it short and sweet, I will not post any further on this issue as I think everything worth saying has been said. Checker, your post is spot on I think.</p>
<p>I am/will be doing my best to be polite, but I am not going to second guess every word and every statement as to whether it might possibly ever offend someone else. I would hate for players to turn away from this community because they feel like they constantly have to walk on egg shells.</p>
<p>That being said, if someone tells me in a reasonable tone that they object to my statement, I will of course apologize and try to avoid making similar statements again.</p>
<div style="padding-left: 30px;">
<p>bl00dw0lf wrote:<br />Calling the OP names does not benefit the community.</p>
</div>
<p>That was in no way my intent, if it came across as such I apologize!</p>
<p><span style="font-size: xx-small;">Last edited by cornergraf on 2013/06/14 14:55, edited 1 time in total.</span></p>
</td>
</tr>
<tr>
<td style="border-style: none;"><strong>checker</strong></td>
<td style="border-style: none;" align="right"><b>Posted:</b> 2013/06/14 13:38</td>
</tr>
<tr>
<td style="border-style: none; border-bottom-style: dotted; border-bottom-width: 1px;" colspan="2">
<p>Okay, I think cornergraf was writing his latest post while I was writing mine, and it&#8217;s a great edition to this thread, but for people coming here from THE FUTURE, no more debate on the merits of the topic, please. I don&#8217;t want to silence anybody, I just also don&#8217;t want it to turn into a thread about topics that will not be resolved here. I totally empathize with both sides, but I think I pretty clearly spell out the kind of community I want in my post a couple up from this one.</p>
<p>Now, I want to go finish up <a title="Release notes v0.1.2758.0 – lobby stuff, mostly" href="http://www.spyparty.com/2013/06/17/release-notes-v0-1-2758-0-lobby-stuff-mostly/">this build</a> today!</p>
<p>Chris</p>
</td>
</tr>
</tbody>
</table>
<hr/><ol class="footnotes"><li id="footnote_0_3359" class="footnote">There are other important kinds of diversity SpyParty probably can&#8217;t explore effectively, like class and income diversity.</li><li id="footnote_1_3359" class="footnote">and the occasional innocent civilian</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/06/18/diversity-and-inclusivity-in-spyparty-and-the-beta-community/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Loadtesting for Open Beta, Part 4: Done optimizing the lobbyserver!</title>
		<link>http://www.spyparty.com/2013/05/21/loadtesting-for-open-beta-part-4-done-optimizing-the-lobbyserver/</link>
		<comments>http://www.spyparty.com/2013/05/21/loadtesting-for-open-beta-part-4-done-optimizing-the-lobbyserver/#comments</comments>
		<pubDate>Tue, 21 May 2013 06:13:11 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[beta]]></category>
		<category><![CDATA[indie games]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3210</guid>
		<description><![CDATA[Check out Loadtesting for Open Beta, Part 1, Part 2, and Part 3 to read the previous installments of this epic tale! It&#8217;s been a while since the last update in this series, sorry about that!  At the end of Part 3, I mentioned the SimCity launch giving me pause about my goal of testing [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em>Check out <a title="Loadtesting for Open Beta, Part 1" href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/">Loadtesting for Open Beta, Part 1</a>, <a title="Loadtesting for Open Beta, Part 2" href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/">Part 2</a>, and <a title="Loadtesting for Open Beta, Part 3" href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/">Part 3</a> to read the previous installments of this epic tale!</em></p>
<p>It&#8217;s been a while since the last update in this series, sorry about that!  At the end of <a title="Loadtesting for Open Beta, Part 3" href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/">Part 3</a>, I mentioned the <a href="http://kotaku.com/tag/sim-city">SimCity launch</a> giving me pause about my goal of testing the <strong>SpyParty</strong> lobbyserver to 1000 simultaneous robots.  Well, I got scared enough after their launch that I increased my optimization target to 2000 simultaneous robots on my old and slow server, and then I also decided to bite the bullet and upgrade the server hardware after I hit 2000 to give myself some extra headroom.  I really don&#8217;t think I&#8217;m going to hit these numbers at Open Beta launch or even for a long time after that, but I&#8217;d rather err on the conservative side and have it purr along nicely.</p>
<p>Since I waited so long to post this Part 4, I can&#8217;t really give a play-by-play of all the optimizations I did as they happened, so I&#8217;m going to give the general arc I followed, and then talk about some of the interesting stops along the way.</p>
<a name="iprof%2C+atop%2C+oprofile%2C+et+al."></a><h3>iprof, atop, oprofile, et al.</h3>
<p>As I mentioned at the end of the last post, I&#8217;d fixed some of the huge and obvious things with the network bandwidth usage, so it was time to start profiling the CPU usage.  There are lots of different kinds of profilers, but the one I use the most is based on <a href="http://silverspaceship.com/src/iprof/">Sean Barrett&#8217;s iprof</a>.  I&#8217;ve modified it a fair bit over the years,<sup><a href="http://www.spyparty.com/2013/05/21/loadtesting-for-open-beta-part-4-done-optimizing-the-lobbyserver/#footnote_0_3210" id="identifier_0_3210" class="footnote-link footnote-identifier-link" title="I&rsquo;ll&nbsp; release my changes at some point.">1</a></sup> but the core of the system is still the same.  It&#8217;s a runtime profiler that requires instrumenting your code into blocks, it&#8217;s efficient enough that you can leave it on all the time as long as you don&#8217;t stick a &#8220;prof block&#8221; in an inner loop, and you can generally see where you&#8217;re spending your time hierarchically.  It can draw to the screen, but I also have it output to a string, and so on the lobbyserver I can have it output to the log after a spike, and also catch a signal I send and it&#8217;ll force a prof dump.  Here&#8217;s an example:</p>
<pre style="padding-left: 30px;"><span style="font-size: x-small;">2013/04/17-16:12:10: 85.156 ms/frame (fps: 11.74)  sort self - current frame</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: zone                                                     self     hier    count</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:  ProcessMessages                                      59.2910  59.2910     1.00</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +Send                                                 17.8164  18.4493  1120.69</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +ClientsUpkeepAndCloseLoop                             2.3034   2.6989   793.15</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:  Log                                                   1.3559   1.3559    25.97</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:  unpack_bytes                                          0.7311   0.7311    26.56</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:  unpack                                                0.6674   0.6674  3551.71</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +ClientsPacketLoop                                     0.5492   3.7160   792.58</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +ClientsUpdated                                        0.4023  10.9843     0.56</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +SendQueuedClientRoomMessages                          0.2524   7.3086     1.00</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:  FindClientByID                                        0.2494   0.2494   267.05</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +JournalQueuedSave                                     0.2374   0.3882     1.43</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +Tick                                                  0.2112  25.6313     1.00</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:  iprof_update                                          0.2051   0.2051     1.00</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: +JournalSavePrep                                       0.1560   0.5442     1.43</span></pre>
<p>As you can see, it&#8217;s pretty easy to read, and you can drill down on individual blocks and see who calls them and who they call:</p>
<pre style="padding-left: 30px;"><span style="font-size: x-small;">2013/04/17-16:12:10: 85.156 ms/frame (fps: 11.74)  sort graf - current frame</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: zone                                                     self     hier    count</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:     LoginReply                                         0.0006   0.0006     0.01</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:     JOINING                                            0.0007   0.0008     0.03</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +TYPE_CLIENT_GAME_ID_REQUEST_PACKET                 0.0011   0.0014     0.44</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +NewWaitingForJoinClients                           0.0019   0.0019     0.01</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +TYPE_CLIENT_PLAY_PACKET                            0.0086   0.0087     0.12</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +TYPE_CLIENT_INVITE_PACKET                          0.0213   0.0225     2.37</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +TYPE_CLIENT_IN_MATCH_PACKET                        0.0280   0.0282     0.49</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +JournalQueuedSave                                  0.0563   0.0571     1.18</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +RoomsChanged                                       0.0852   0.0939    15.38</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +NewInLobbyClients                                  0.1155   0.1342    14.55</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +ClientsUpkeepAndCloseLoop                          0.1362   0.2093   150.55</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +TYPE_CLIENT_MESSAGE_PACKET                         0.3122   0.3170     8.87</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +SendQueuedClientRoomMessages                       6.7122   7.0013   501.99</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:    +ClientsUpdated                                    10.3361  10.5720   424.67</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10: -Send                                                 17.8164  18.4493  1120.69</span><br /><span style="font-size: x-small;">2013/04/17-16:12:10:     unpack                                             0.6329   0.6329  3362.06</span></pre>
<p>This is super useful.  The biggest downside to it is that it&#8217;s not thread-aware, but I&#8217;ve made it thread-safe via the brute force method of having it ignore all threads that aren&#8217;t the &#8220;main&#8221;.  My code is mostly single-threaded, but the threadedness increased a fair bit during these optimizations, so I hope to eventually modify iprof to be thread-aware without losing too much simplicity and performance.  However, until I make those modifications, any background thread activity will show up attributed to one of these main-thread blocks.  You can still get useful data, you just have to be aware of this.  For example, ProcessMessages in the loop above is hiding a WaitForMultipleObjectsEx call on Windows, or a call to select/epoll on POSIX, so it&#8217;s not actually taking that much active time on the main thread.</p>
<p>I also used <a href="http://oprofile.sourceforge.net/news/">oprofile</a>, which is a nice sampling profiler on Linux that can profile per-thread using just the debug information in an application, and <a href="http://atoptool.nl/">atop</a> for keeping track of things happening on the machine as a whole.</p>
<p>Here&#8217;s a list of the stuff I ended up optimizing:</p>
<ul>
<li>I was originally sending out the chat messages to all clients as they came in, but I started queuing them up and sending them all out at once to reduce send calls.  Of course, once you do this, you have to make sure you don&#8217;t overflow the network packet if you have queued a lot of messages that tick, so that makes the code more complicated and harder to modify, which is a tradeoff one often has to make while optimizing, and it&#8217;s why you want to put off most optimization until you need it&#8230;although you should have a rough plan for how you&#8217;ll optimize a piece of code in the future even if you write it the dumb way first.</li>
<li>I made more threads, including putting network sending and receiving on separate threads, making a separate thread for logging, and a thread for saving files to the disk.  There were already threads for talking to the database and Kerberos, for receiving network packets, and for checking for new client builds.  These are all relatively simple threads to add, because they&#8217;re all just throwing data into a queue on one thread and taking it out on another, although multithreading a program always makes it harder to understand.  I discovered a fair number of deadlock bugs in <a href="https://developers.google.com/talk/libjingle/">libjingle</a>, the library I&#8217;m using for <a href="http://en.wikipedia.org/wiki/NAT_traversal">NAT traversal</a> and some cross platform threading stuff, and I&#8217;ve fixed some of them.  I&#8217;ve veered far enough from the original libjingle code that I&#8217;m probably just going to have to put my version up as a fork, sadly.</li>
<li>I timesliced the login phase for the clients.  Previously, when a client would log in, I&#8217;d process a bunch of stuff immediately, including some authentication stuff which can be somewhat time consuming.  In a load test where hundreds of clients log in to the server at the same time, this would bog down, so I now process a maximum of 20ms worth of clients each tick.  This makes some clients wait a bit longer before they&#8217;re logged in, but doesn&#8217;t result in a positive feedback loop where there&#8217;s a really long tick, so a lot of packets will have arrived while it was happening, so the next tick is really long too, etc.</li>
<li>Like the player list packets, I also made the room list packets incremental, and able to span multiple network packets.  This way all the lists of players and rooms that the lobby sends to the clients can be differential and arbitrarily long, so there&#8217;s no more hard limit on the number of clients that can join the lobby.  I think there&#8217;s actually a bug in this code, but I&#8217;ve only ever seen it once, even after tens of thousands of robot sessions, so I just hope it shows up more at some point.</li>
<li>I switched the POSIX networking inner loop in libjingle from <a href="http://linux.die.net/man/2/select">select</a> to <a href="http://linux.die.net/man/4/epoll">epoll</a>.  This was not so much an optimization as it was simply to allow more than 1024 sockets to work at all.  epoll is also a lot faster, but I&#8217;m currently kinda using it in a dumb way, so I&#8217;m not benefiting from that speed boost much yet.</li>
<li>There were also a bunch of smaller traditional code optimizations, like using maps to cache lookups, using free lists to avoid some allocations, and whatnot.  Oh, and don&#8217;t forget to <a href="https://twitter.com/checker/status/335503826939424768">change the ulimit -n settings in limits.conf</a> on Linux, so your process can actually accept a lot of connections!</li>
</ul>
<p>As I was doing these optimizations, I would run a loadtest with a bunch of robots and profile the lobby.  I was at 500 robots at the end of Part 3, and I slowly raised the ceiling as I improved the code over the weeks:  569 robots&#8230;741 robots&#8230;789 robots, 833, 923, 942, 990, 997, 1008, 1076, 1122, 1158, 1199, 1330, 1372, 1399, 1404, 1445, 1503, 1614, 1635, 1653, 1658, 1659&#8230;</p>
<p>When I hit 1659 it was late one night, and so I stopped for the day.  When I resumed work and did the next couple of optimizations, I figured I&#8217;d get it to 1800 or something.  I always launched 20% or so more robots than I was hoping to support in a given test to account for internet and <a href="http://aws.amazon.com/ec2/">EC2</a> variation, and for plain old bugs in the clients that would sometimes manifest themselves, so this time I must have launched 2500 robots, because when I looked up from the profiles running in ssh terminals and over to my <strong>SpyParty</strong> client logged into the test lobby, I saw this:</p>
<div id="attachment_3224" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/05/SpyParty-v0.1.2681.1-20130501-15-23-57-0.png"><img class="size-large wp-image-3224" title="SpyParty-v0.1.2681.1-20130501-15-23-57-0" alt="" src="http://cdn.spyparty.com/wp-content/uploads/2013/05/SpyParty-v0.1.2681.1-20130501-15-23-57-0-600x415.png" width="600" height="415" /></a><p class="wp-caption-text">This wasn&#8217;t supposed to happen yet.</p></div>
<p>Uh, I guess I was done optimizing?</p>
<p>I was actually kind of disappointed, to be honest.  I had all sorts of cool ideas for optimizations I was planning to do that I&#8217;d come up with while testing and profiling the code, and now, if I was going to follow my own plan and stop when I hit 2000 simultaneous robots, I would have to just take a bunch of notes for next time I optimized so I could pick up where I left off, and move on.  The good news is I&#8217;m pretty sure I can make the lobby almost twice as efficient if and when the time comes to do that!</p>
<a name="Room+at+the+Inn"></a><h3>Room at the Inn</h3>
<p>If you look closely at that screenshot, you&#8217;ll see the thumb on the scrollbar for the player list is pretty small.  That&#8217;s because all 2010 players are in a single room, which is not going to work very well for a lobby full of real people.  In fact, the only reason there were 2010 players in that room was because at the time I&#8217;d limited the room size to 2010 because I didn&#8217;t want to bother teaching the robots how to use rooms.  There were actually a few hundred more robots knocking on the door but they couldn&#8217;t get in.  But, now that I&#8217;d hit my 2k target, it was time to fix that.</p>
<p>I immediately realized I had a problem.  Currently, when you connect to the lobby, it sends you a list of rooms, and you have to pick one to log in.  But, what if the rooms are full?  Oops, you couldn&#8217;t log in.  So, as soon as I set the room size down to something more reasonable, like 100, then the first 100 robots got in and the rest just sat there failing to join.</p>
<p>It seemed like there were a number of solutions to this problem, including allowing players to create new rooms before logging in, but in the end I went with the simplest and most robust solution, which is to have the lobby create a new empty room if all the current rooms are full.  The initial room is always called <em>Headquarters</em>, so I named these new dynamic rooms <em>Headquarters 2</em> and onward.  Very creative, I know.  Somebody suggested using spy movie titles for these room names, but I figured that wouldn&#8217;t scale very well, ignoring the potential copyright issues.  If the lobby ever finds one of these dynamic rooms empty, it kills it, unless all the other rooms are full.  I also have the lobby automatically put you in a now-guaranteed-to-exist-non-full-room if you log in and try to join a full room, even if it wasn&#8217;t full when you clicked on it, so this eliminated a login race condition too, which is always a good sign.</p>
<p>This last bit also made it so I didn&#8217;t need to make the loadtesting robots know very much about rooms:  they always try to join Headquarters and if they don&#8217;t end up there, oh well.  As they join, they kind of spill over into the latest dynamic room until it fills up, and then they continue to the next, kind of like filling up an ice tray with water from one end.  I should probably make them test the actual room features by creating and changing rooms and whatnot, but the single giant 2010 player room was a way more intense loadtest than having 20 rooms with 100 players in each due to the chat broadcasting.</p>
<p>I don&#8217;t know if 100 is the right limit for room populations.  100 would still be way too many people to have in a single reasonable conversation, but I didn&#8217;t want to put too low of a limit on the size before I have tested things with humans instead of just robots.</p>
<a name="The+Client"></a><h3>The Client</h3>
<p>There&#8217;s this annoying thing that happens when you&#8217;re testing computer code, and it&#8217;s that you encounter problems and bugs not only in the code you&#8217;re trying to test, but also in your test code.  This was no different.  I was constantly fixing various bugs in the robots that would keep them from all connecting correctly, and I even made sure some of the optimizations helped the client side so I could run more robots on a given EC2 server.  Plus, just making sure the robots keep trying to connect and login was important, because if there was a timeout due to an initial burst, you want them to try again automatically after it dies down, rather than just sitting there not doing anything.</p>
<p>As I said in <a title="Loadtesting for Open Beta, Part 1" href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/">Part 1</a>, I started out running about 50 robots on each m1.small EC2 instance.  That didn&#8217;t scale, for some reason I&#8217;m still trying to figure out.  That worked okay with a low number of instances, but as I increased the number of instances, I had to lower the number of robots on each instance, eventually to around 20 per m1.small.  An AWS account starts with only being able to start 20 instances, so I did a total of two instance limit requests to Amazon, first to 100 and then to 300.  It&#8217;s scary to have 300 instances running&#8230;even though m1.small instances are only 6¢ an hour each, that&#8217;s still $18 an hour when there are 300 of them running, and Amazon rounds up to the hour, so if you miss shutting them down by a minute you just lost a large pizza!  It looks like Google&#8217;s new <a href="https://cloud.google.com/pricing/compute-engine">Compute Engine</a> thing is about twice as expensive for their somewhat similar low end machine (ignoring performance differences), but charges in 1 minute increments after the first 10, which might be cheaper for this very transient use-case.</p>
<p>I seem to remember reading somewhere that Amazon allocates instances for the same account to the same physical machine if possible, which might explain this scaling problem, since it means I was probably maxing out a given piece of server hardware with too many instances bursting at the same time.  It&#8217;s hard to tell if this is the case, and I need to do more testing before saying for sure.  A <a href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/comment-page-1/#comment-67637">commenter</a> said there might be a packets-per-second limitation in EC2, as well, but I haven&#8217;t verified that.  Once I&#8217;ve tried a few different things, I&#8217;ll do a long technical post on <a href="http://chrishecker.com">chrishecker.com</a> about EC2, <a href="https://www.linode.com/">linode</a>, and my dedicated host machine, comparing the different results I got.</p>
<p>Finally, I had to do some optimization on the <strong>SpyParty</strong> game client when the numbers started getting high.  I went a little nuts with the chat system early on and it has completion on all commands, room names, and player names, but the code that builds the completion tree was calling the memory allocator 35k times per update when the numbers of players got high, so I had to remove some of the stupid in that code as well.</p>
<a name="The+New+Server"></a><h3>The New Server</h3>
<p>With all that done, and 2010 robots running on the old server, I haggled with my hosting provider and started renting a newer and much faster server.  I use <a href="http://www.softlayer.com/">SoftLayer</a> for dedicated hosting, and have for years.<sup><a href="http://www.spyparty.com/2013/05/21/loadtesting-for-open-beta-part-4-done-optimizing-the-lobbyserver/#footnote_1_3210" id="identifier_1_3210" class="footnote-link footnote-identifier-link" title="Well, they were servermatrix when I started, and then The Planet, and now SoftLayer.">2</a></sup> My old server was a Pentium 4 with a single hyperthreaded core, 1GB ram, and a 100Mbps uplink, and the new server is a Xeon 3460 with four hyperthreaded cores, 4GB ram, and 1Gbps uplink, so it&#8217;s slightly more expensive but a lot faster.  That said, everybody seems to be using <a href="http://en.wikipedia.org/wiki/Virtual_private_server">VPS</a> hosts these days.  I talked to some other indie game developers, but I didn&#8217;t have time to do a full evaluation of the tradeoffs, so went with the devil I knew, so to speak.  It seems like VPS is going to be a bit slower but also a bit cheaper, but the big advantage of VPS to me is that you can move the virtual machine image to faster hardware and have it up and running again in minutes.  That&#8217;s a pretty great scaling sweetspot between having a single physical server and praying it doesn&#8217;t melt, and a scalable system that elastically uses cloud computing The Right Way™, but it&#8217;s also hundreds of times easier to get a VPS image working and then move it to a faster machine than it is to scale elastically.  So, I dunno, it&#8217;s definitely something worth looking into more during the year as I see how things are scaling.</p>
<p>The new server ate the robots for lunch:</p>
<div id="attachment_3230" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/05/SpyParty-v0.1.2703.1-20130518-20-57-40-0.png"><img class="size-large wp-image-3230" title="SpyParty-v0.1.2703.1-20130518-20-57-40-0" alt="" src="http://cdn.spyparty.com/wp-content/uploads/2013/05/SpyParty-v0.1.2703.1-20130518-20-57-40-0-600x421.png" width="600" height="421" /></a><p class="wp-caption-text">The new server works pretty well.</p></div>
<p>For reference, 4850 simultaneous players is pretty far up the <a href="http://store.steampowered.com/stats/">top 100 Steam games by player count</a>, so I don&#8217;t think I have to worry about those numbers for a while.  Here&#8217;s atop&#8217;s view of things:</p>
<div id="attachment_3237" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/05/2013-05-18-20_47_06-atop.png"><img class="size-large wp-image-3237" title="2013-05-18 20_47_06-atop" alt="" src="http://cdn.spyparty.com/wp-content/uploads/2013/05/2013-05-18-20_47_06-atop-600x344.png" width="600" height="344" /></a><p class="wp-caption-text">Well within parameters.</p></div>
<a name="What%26%238217%3Bs+Next%3F"></a><h3>What&#8217;s Next?</h3>
<p>So, that&#8217;s it for the lobbyserver loadtesting.  Now I need to move the website and registration system over to the new server, test them a bit, and start inviting everybody in in big batches.  Soon I&#8217;ll send out email to the beta testers to set up some scheduled human loadtests as well.  The robots will be jealous, left out in the cold, looking in at all the humans actually playing the game. </p>
<p>Open Beta is fast approaching.</p>
<hr/><ol class="footnotes"><li id="footnote_0_3210" class="footnote">I&#8217;ll  release my changes at some point.</li><li id="footnote_1_3210" class="footnote">Well, they were servermatrix when I started, and then The Planet, and now SoftLayer.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/05/21/loadtesting-for-open-beta-part-4-done-optimizing-the-lobbyserver/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Come ask questions of me and Jonathan Blow in San Francisco on Wednesday!</title>
		<link>http://www.spyparty.com/2013/05/06/come-ask-questions-of-me-and-jonathan-blow-in-san-francisco-on-wednesday/</link>
		<comments>http://www.spyparty.com/2013/05/06/come-ask-questions-of-me-and-jonathan-blow-in-san-francisco-on-wednesday/#comments</comments>
		<pubDate>Tue, 07 May 2013 00:25:15 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[design]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[indie games]]></category>
		<category><![CDATA[miscellaneous]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3200</guid>
		<description><![CDATA[Update:  Okay, the video is up from this talk, it&#8217;s a mix of general indie game stuff, some SpyParty and The Witness stuff, and miscellaneous stuff: Jonathan Blow and I will be answering—or trying to answer—questions from the audience on Wednesday, May 8th, at 7pm PDT in San Francisco as guests of the SF IGDA. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Update:  Okay, the video is up from this talk, it&#8217;s a mix of general indie game stuff, some <strong>SpyParty</strong> and <a href="http://the-witness.net">The Witness</a> stuff, and miscellaneous stuff:</p>
<p><a href="http://www.spyparty.com/2013/05/06/come-ask-questions-of-me-and-jonathan-blow-in-san-francisco-on-wednesday/"><em>Click here to view the embedded video.</em></a></p>
<p><a href="http://the-witness.net">Jonathan Blow</a> and I will be answering—or trying to answer—questions from the audience on Wednesday, May 8th, at 7pm PDT in San Francisco as guests of the <a href="https://www.facebook.com/IGDASanFrancisco">SF IGDA</a>.  We did a kind of similar thing <a href="http://kotaku.com/5923134/weve-got--jonathan-blow-the-witness-braid-and-chris-hecker-spy-party-here-to-answer-your-best-questions">a while back on Kotaku</a>, and it turned out pretty well, so hopefully it&#8217;ll work again this time.  It&#8217;s open to the public, and it&#8217;s hosted by Dolby Labs:</p>
<p style="padding-left: 30px;">Dolby Laboratories Inc.<br />100 Potrero Ave, San Francisco, CA</p>
<p>Here&#8217;s the <a href="https://groups.google.com/forum/?fromgroups=#!topic/igda-sf/W3IcSo0D554">official announcement</a>.  I assume the questions will mostly be about indie game development.  I hope most of the questions are about indie game development.  Come ask questions about indie game development, please.</p>
<div id="attachment_3203" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/05/jon-loves-chris-DSCN0932.jpg"><img class="size-large wp-image-3203" title="Friendship" src="http://cdn.spyparty.com/wp-content/uploads/2013/05/jon-loves-chris-DSCN0932-600x450.jpg" alt="" width="600" height="450" /></a><p class="wp-caption-text">This post was really just an excuse to show you this picture.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/05/06/come-ask-questions-of-me-and-jonathan-blow-in-san-francisco-on-wednesday/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Loadtesting for Open Beta, Part 3</title>
		<link>http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/</link>
		<comments>http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/#comments</comments>
		<pubDate>Mon, 18 Mar 2013 06:37:06 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[beta]]></category>
		<category><![CDATA[indie games]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3139</guid>
		<description><![CDATA[Read Loadtesting for Open Beta, Part 1 and Part 2 to catch up on the spine-tingling story so far! When we last left our hero, our differential state update change was a resounding success and reduced the network bandwidth utilization from 98% to 3%, and it looked like we could move on to optimizing the [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><em>Read <a title="Loadtesting for Open Beta, Part 1" href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/">Loadtesting for Open Beta, Part 1</a> and <a title="Loadtesting for Open Beta, Part 2" href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/">Part 2</a> to catch up on the spine-tingling story so far!</em></p>
<p><a title="Loadtesting for Open Beta, Part 2" href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/">When we last left our hero</a>, our differential state update change was a resounding success and reduced the network bandwidth utilization from 98% to 3%, and it looked like we could move on to optimizing the lobbyserver code itself to get to our goal of 1000 simultaneous loadtesting robots, until we noticed <a title="Loadtesting for Open Beta, Part 2" href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/#Up+Next,+The+Case+of+the+Missing+Robots">some of our robots were missing</a>!  This led me on a wild and wooly chase through the code, which I will recount for you now&#8230;</p>
<a name="Where%26%238217%3Bd+the+robots+go%3F"></a><h3>Where&#8217;d the robots go?</h3>
<p>The first order of business was to figure out why some robots were dying when they <em>weren&#8217;t</em> supposed to, and some weren&#8217;t dying when they <em>were</em> supposed to.  Robots: they never do what you tell them.</p>
<p>If you look at this graph of the number of running robots from last time, you can see that right off the bat, a bunch of them die on all the machines, and then they keep dying for about 30 seconds, and then it stabilizes.  Each of these machines should have 50 robots running solidly during the test period.</p>
<div id="attachment_3116" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/ec2-loadtest-client-counts.png"><img class="size-large wp-image-3116" title="ec2-loadtest-client-counts" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/ec2-loadtest-client-counts-600x344.png" alt="" width="600" height="344" /></a><p class="wp-caption-text">The number of loadtest robots running on each EC2 instance.</p></div>
<p>Then, to make matters worse, some of them don&#8217;t die when they&#8217;re supposed to at the end of the test.  In the graph above, they only all finally die when I kill them manually from a separate script at 03:16:30.  This points towards two different problems I&#8217;m going to have to debug on the test machines&#8230;that only manifest themselves intermittently&#8230;with gdb&#8230;in the cloud. Good times!</p>
<p>Okay, first things first, let&#8217;s see if the robots will tell me where they&#8217;re going.  The lobbyclient robots can output verbose log files, but I had them turned off because I was worried about bogging down the client machines.  It turns out this isn&#8217;t much of a problem as I&#8217;ll discuss below, so I turned on logging and re-ran a test.  Then I ssh&#8217;d into one of the servers, and looked at the log files.  Well, before I looked the files themselves, I just did an <span style="font-family: courier new,courier;">ls</span> of the directory:</p>
<pre style="padding-left: 30px;">-rw-r--r-- 1 root root 258577 Mar  5 03:02 out59<br />-rw-r--r-- 1 root root 332320 Mar  5 03:02 out60<br />-rw-r--r-- 1 root root 177743 Mar  5 03:02 out61<br />-rw-r--r-- 1 root root 181639 Mar  5 03:02 out62<br />-rw-r--r-- 1 root root 264535 Mar  5 03:02 out63<br />-rw-r--r-- 1 root root 333515 Mar  5 03:02 out64<br />-rw-r--r-- 1 root root 282875 Mar  5 03:02 out65<br />-rw-r--r-- 1 root root 271040 Mar  5 03:02 out66<br />-rw-r--r-- 1 root root    264 Mar  5 03:01 out67<br />-rw-r--r-- 1 root root    264 Mar  5 03:01 out68<br />-rw-r--r-- 1 root root 284838 Mar  5 03:02 out69<br />-rw-r--r-- 1 root root 332967 Mar  5 03:02 out70<br />-rw-r--r-- 1 root root 303352 Mar  5 03:02 out71<br />-rw-r--r-- 1 root root 310596 Mar  5 03:02 out72<br />-rw-r--r-- 1 root root 194669 Mar  5 03:02 out73<br />-rw-r--r-- 1 root root 313193 Mar  5 03:02 out74<br />-rw-r--r-- 1 root root 238246 Mar  5 03:02 out75<br />-rw-r--r-- 1 root root 264190 Mar  5 03:02 out76<br />-rw-r--r-- 1 root root 198096 Mar  5 03:02 out77<br />-rw-r--r-- 1 root root 233980 Mar  5 03:02 out78<br />-rw-r--r-- 1 root root    264 Mar  5 03:01 out79<br />-rw-r--r-- 1 root root    264 Mar  5 03:01 out80<br />-rw-r--r-- 1 root root 301029 Mar  5 03:02 out81<br />-rw-r--r-- 1 root root 299694 Mar  5 03:02 out82<br />-rw-r--r-- 1 root root    264 Mar  5 03:01 out83<br />-rw-r--r-- 1 root root 351158 Mar  5 03:02 out84<br />-rw-r--r-- 1 root root 188071 Mar  5 03:02 out85<br />-rw-r--r-- 1 root root 242228 Mar  5 03:02 out86</pre>
<p>Well, there&#8217;s a clue, at least for the early-dyers.  The contents of those 264 byte log files look like this:</p>
<pre style="padding-left: 30px;">Lobby Standalone Client: 1000.0.0.5<br />init genrand w/0, first val is 1178568022<br />Running for 61 seconds.<br />LobbyClient started, v1000.0.0.5 / v12<br />LobbyClient UDP bound to port 32921<br />lobbyclient: sendto_kdc.c:617: cm_get_ssflags: Assertion `i &lt; selstate-&gt;nfds' failed.</pre>
<p>A-ha!  sendto_kdc.c is a file in the <a href="http://web.mit.edu/Kerberos/">Kerberos</a> libraries, which I use for login authentication.</p>
<p>I really love Kerberos, <a href="http://web.mit.edu/kerberos/dialogue.html">the architecture just feels right to me</a>, the API is simple, clean, and flexible, it&#8217;s cross-platform and open source, so I&#8217;ve been able to contribute features and bug fixes as I&#8217;ve used it and trace into the code when I was confused about something, and the folks at MIT that develop it are smart, knowledgeable, open-minded, and <a href="http://www.google.com/search?hl=en&amp;q=%2B&quot;Chris Hecker&quot; site%3Amail-archive.com kerberos">don&#8217;t mind some crazy indie game developer asking dumb questions</a> about the best way to do things that were pretty clearly not part of the original university and enterprise use-cases.  Most importantly, it&#8217;s battle-tested; it&#8217;s used by tons of different applications, and it&#8217;s the foundation of the modern Windows domain and Xbox authentication systems, so I know it works.  <strong>The last thing you ever want to do is roll your own authentication system.</strong></p>
<p>So, that assert&#8217;s the first place to look for the early-dying robots.</p>
<p>Next, I looked into the never-dying robots.  I logged into one of the machines that still had zombie robots<sup><a href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/#footnote_0_3139" id="identifier_0_3139" class="footnote-link footnote-identifier-link" title="ZOMBIE ROBOTS!!!">1</a></sup> running, ran <span style="font-family: Courier New,Courier,mono;">pidof lobbyclient</span> to figure out the process ID of one of them, and attached gdb to the robot.  A quick <span style="font-family: Courier New,Courier,mono;">thread apply all backtrace full</span> and I found the thread that was hanging while the main thread was trying to join them and exit cleanly.  It looked like the bad code was in a call to <a href="http://linux.die.net/man/2/poll">poll</a>, and it just so happened it was in sendto_kdc.c as well! I realized I was going to need some debug symbols, but this was easy since I build the Kerberos libraries myself,<sup><a href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/#footnote_1_3139" id="identifier_1_3139" class="footnote-link footnote-identifier-link" title="I have some local patches I haven&rsquo;t cleaned up enough to contribute yet">2</a></sup> so a quick scp of the debuginfo rpm and reattaching gdb and I could dig down a bit deeper.</p>
<p>The Kerberos libraries are built with optimizations on, which always makes debugging interesting, but I think it builds programming character to debug optimized code, so I don&#8217;t mind.<sup><a href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/#footnote_2_3139" id="identifier_2_3139" class="footnote-link footnote-identifier-link" title="gdb is not the best for assembly language debugging, but I did learn about &ldquo;layout asm&rdquo;, which helps a bit.">3</a></sup>  Here&#8217;s the code in question:</p>
<pre>    if (in-&gt;end_time.tv_sec == 0)<br />        timeout = -1;<br />    else {<br />        e = k5_getcurtime(&amp;now);<br />        if (e)<br />            return e;<br />        timeout = (in-&gt;end_time.tv_sec - now.tv_sec) * 1000 +<br />            (in-&gt;end_time.tv_usec - now.tv_usec) / 1000;<br />    }<br />    /* We don't need a separate copy of the selstate for poll, but use one<br />     * anyone for consistency with the select wrapper. */<br />    *out = *in;<br />    *sret = poll(out-&gt;fds, out-&gt;nfds, timeout);</pre>
<p>Well, these loadtesting machines are under some load themselves so they can be a bit sluggish, and there&#8217;s a problem with this code in that scenario if the call to k5_getcurtime() happens later than the in-&gt;end_time passed in by the caller.  As it says on the <a href="http://linux.die.net/man/2/poll">poll manpage</a>, <em>&#8220;Specifying a negative value in timeout means an infinite timeout.&#8221;</em>  Digging around on the stack verified the timeout was negative.</p>
<p>Okay, so now we have a pretty good clue for each of the problems.  The second problem with the poll timeout seemed easy to fix, but the first one was pretty mysterious and might take some real debugging.  I decided to<a href="http://mailman.mit.edu/pipermail/krbdev/2013-March/011451.html"> check with the krbdev mailing list</a> to see if they had any ideas while I looked into the problems more deeply.  While doing so, I looked at the main Kerberos source repository and <a href="http://mailman.mit.edu/pipermail/krbdev/2013-March/011452.html">found a commit for the timeout problem</a>, so it had already been fixed in a later version.  I was hoping maybe this was true of the assert as well.  True to form, the most excellent Greg Hudson <a href="http://mailman.mit.edu/pipermail/krbdev/2013-March/011453.html">replied with three more commits</a> he thought might help.  Meanwhile, I hacked the code to loop on a call to sleep() instead of asserting to convert the early-dyers into never-dying zombies so I could attach the debugger, since that&#8217;d worked so well on the second problem.</p>
<p>Sadly, although the negative-timeout-check fixed the original zombies, none of the fixes prevented the assert problem.  It wasn&#8217;t asserting anymore because the asserters were now looping, so now I had more zombies to deal with.</p>
<div id="attachment_3151" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-17-16_45_07-50-not-working.png"><img class="size-large wp-image-3151" title="2013-03-17 16_45_07-50-not-working" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-17-16_45_07-50-not-working-600x302.png" alt="" width="600" height="302" /></a><p class="wp-caption-text">Lots of zombie robots!</p></div>
<p>Time to get down and dirty and debug it for real.</p>
<p>As an aside, it&#8217;s a weird feeling when you&#8217;re debugging something on an <a href="http://aws.amazon.com/ec2/">EC2 instance</a>, since you&#8217;re paying for it hourly.  I felt a definite pressure to hurry up and debug faster&#8230;oh no, there went another $0.06 * 5 instances!</p>
<a name="Too+deep+we+delved+there%2C+and+woke+the+nameless+fear%21"></a><h3>Too deep we delved there, and woke the nameless fear!</h3>
<p>Like I said, debugging optimized code builds character, and I built a lot of character with this bug.  The assert was in a function that was inlined by the optimizer, which was in a function that was inlined by the optimizer, which was in a loop, which looked like it had been unrolled.  It was slow going, with lots of restarts and stuffing values into memory and registers so the code would execute again.  At one point, I thought I&#8217;d <a href="http://mailman.mit.edu/pipermail/krbdev/2013-March/011466.html">narrowed it down to a compiler bug in gcc</a>, because it seemed like a variable wasn&#8217;t getting reloaded from the stack correctly sometimes, but it was really hard to tell with all the inlining.  Even thinking it was a compiler bug was pretty silly and that thought always violates <a title="One Bug’s Story, or, Assume it’s a bug!" href="http://www.spyparty.com/2013/02/09/one-bugs-story-or-assume-its-a-bug/">Assume it&#8217;s a Bug</a>, so I should have known better, but it happens. </p>
<p>Finally, a combination of stepping through the code, and looking at the code, and modifying the code revealed the problem. Here&#8217;s <a href="https://github.com/krb5/krb5/blob/krb5-1.9.2-final/src/lib/krb5/os/sendto_kdc.c#L1255">the source file at the version I was debugging</a>, linked to the area of the code where the bug lurked.  If you search for &#8220;host+1&#8243;, you will see that it occurs twice, once inside the loop, and once outside the loop.  This is what threw me when I was debugging&#8230;initially I didn&#8217;t notice there were two separate calls to service_fds(), so in the debugger I thought it was looping again but loading weird values.  I can only assume the second call almost never occurred in the wild for anybody but me after the inner loop on hosts completed, because in that case host+1 is n_conns+1, which is out-of-bounds for the connections.<sup><a href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/#footnote_3_3139" id="identifier_3_3139" class="footnote-link footnote-identifier-link" title="It never crashed because conns has a preallocated number of connections that was always bigger than n_conns+1">4</a></sup>  This bug was easy for me to fix locally, and it looks like it was (inadvertently?) fixed in <a href="https://github.com/krb5/krb5/commit/8b9d249e40601047e69c92d7acb578fd0bbafc00">this commit</a> in the main Kerberos code.</p>
<p>Thank goodness for open source code, where you can modify it and debug it when you run into troubles!</p>
<div id="attachment_3150" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-17-16_36_15-50-working.png"><img class="size-large wp-image-3150" title="2013-03-17 16_36_15-50-working" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-17-16_36_15-50-working-600x302.png" alt="" width="600" height="302" /></a><p class="wp-caption-text">No more zombies!</p></div>
<a name="Moar+Robots%21"></a><h3>Moar Robots!</h3>
<p>Now that I (thought I) was done debugging the robots, and I still had 5 EC2 instances running, I decided to see how well the instances did with 100 robots on each.  My original tests indicated I could only run about 50 per <a href="http://aws.amazon.com/ec2/instance-types/">m1.small</a> instance, but the client also got a lot more efficient with the differential state update change described last time, and it turns out 100 per instance is no problem, as you can see here:</p>
<div id="attachment_3147" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_53_11-100-robots.png"><img class="size-large wp-image-3147" title="2013-03-16 02_53_11-100-robots" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_53_11-100-robots-600x379.png" alt="" width="600" height="379" /></a><p class="wp-caption-text">Top on an m1.small instance running 100 robots at only 20% CPU.</p></div>
<p> The lobby was a little more grim with 501 clients:</p>
<div id="attachment_3153" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/SpyParty-v0.1.2602.1-20130316-02-53-39-0.png"><img class="size-large wp-image-3153" title="SpyParty-v0.1.2602.1-20130316-02-53-39-0" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/SpyParty-v0.1.2602.1-20130316-02-53-39-0-600x415.png" alt="" width="600" height="415" /></a><p class="wp-caption-text">500 robots and me.</p></div>
<p> Here&#8217;s how the CPU looks with all these robots in the lobby, chatting at each other:</p>
<div id="attachment_3148" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_53_25-100-in-lobby.png"><img class="size-large wp-image-3148" title="2013-03-16 02_53_25-100-in-lobby" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_53_25-100-in-lobby-600x322.png" alt="" width="600" height="322" /></a><p class="wp-caption-text">atop in CPU mode with 500 robots in the lobby jabbering.</p></div>
<p>There are two cores in this machine, which is why the lobbyserver is at 115% CPU.  It&#8217;s mostly single-threaded for simplicity, but it uses threads for servicing network connections.</p>
<p>However, once the robots start playing each other, the CPU usage drops a bunch:</p>
<div id="attachment_3149" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_53_49-100-playing.png"><img class="size-large wp-image-3149" title="2013-03-16 02_53_49-100-playing" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_53_49-100-playing-600x322.png" alt="" width="600" height="322" /></a><p class="wp-caption-text">Stop talking, start playing!</p></div>
<p>This is pretty good news.  I think it means the chat system needs some work, because when everybody&#8217;s in the lobby all the chats go to all the players, but when people in are a match, chats only go between those two players, and they don&#8217;t get any of the lobby chats.  We&#8217;ll find out soon as I describe below.  Memory looks pretty good with 501 clients, staying at about 256kb per client:</p>
<pre style="padding-left: 30px;">2013/03/16-04:53:11: MEMORY_POSIX 501/993/492: resident 25540/25540, virtual 198000/198000<br />2013/03/16-04:53:11: MEMORY_NEW 501/993/492: bytes 132098963, news 69166, deletes 55478</pre>
<p>One last atop screenshot&#8230;this one is while the robots are starting up and connecting, but before they&#8217;re in the lobby:</p>
<div id="attachment_3146" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_52_57-startup.png"><img class="size-large wp-image-3146" title="2013-03-16 02_52_57-startup" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-16-02_52_57-startup-600x322.png" alt="" width="600" height="322" /></a><p class="wp-caption-text">Loadtest startup performance.</p></div>
<p>This one shows Kerberos and <a href="http://www.openldap.org/">OpenLDAP</a> taking a fair amount of time at the start of a new loadtest.  I use LDAP as the database backend for Kerberos, among other things, and when all of these robots are trying to get login tickets at the same time, it bogs down a bit.  I&#8217;m not too worried about this profile, since this scenario of 500 people all needing tickets at the same time is going to be rare (the tickets last a while, so this doesn&#8217;t happen every time), and there are well-known ways of scaling Kerberos and OpenLDAP if I need them.</p>
<p>Finally, here&#8217;s a shot of the 100 robots per instance:</p>
<div id="attachment_3152" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-17-16_47_28-100-working-plus-deadlock.png"><img class="size-large wp-image-3152" title="2013-03-17 16_47_28-100-working-plus-deadlock" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-17-16_47_28-100-working-plus-deadlock-600x302.png" alt="" width="600" height="302" /></a><p class="wp-caption-text">Wait a second&#8230;</p></div>
<p>Oh no!  Who the hell is that single zombie robot at the end on instance 4!?!  Sigh.  I find that machine, log in, attach the debugger, and check it out.  It looks like I have a pretty rare deadlock between two threads during shutdown.  I&#8217;m just going to ignore it for now and deal with it later.  All the bugs above were preventing robots from doing a good job at loadtesting, while this one is just preventing 1 out of 500 from shutting down completely&#8230;it can wait.  Here&#8217;s a shot of this guy, still in the lobby, mocking me:</p>
<div id="attachment_3154" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/SpyParty-v0.1.2602.1-20130316-02-55-54-0.png"><img class="size-large wp-image-3154" title="SpyParty-v0.1.2602.1-20130316-02-55-54-0" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/SpyParty-v0.1.2602.1-20130316-02-55-54-0-600x415.png" alt="" width="600" height="415" /></a><p class="wp-caption-text">At least I have one more Sniper win on this debug server than this troll!</p></div>
<p>There&#8217;s actually another bug I found in the new differential state update code while I was testing this, where the server will send a duplicate client sometimes, but I had a comment in the code that I thought it might be possible, and now I know it is.  It turns out when you have 500 clients pounding on a server, you find bugs.</p>
<a name="Coming+Up+Next+Time"></a><h3>Coming Up Next Time</h3>
<p>Okay, so now we&#8217;ve got things where I can easily run a predictable number of loadtesting robots against the debug lobbyserver, and I&#8217;ve got some high level profiles telling me that I&#8217;m now CPU bound inside the server itself.  That points to a clear next step:  profile the code.  I use an old hacked up version of <a href="http://silverspaceship.com/src/iprof/">Sean Barrett&#8217;s iprof</a> for all my client runtime profiling, so my next task is to integrate that into the server code, and get it running on Linux.  That shouldn&#8217;t be too hard, and then I&#8217;ll be able to tell what&#8217;s actually taking the time<sup><a href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/#footnote_4_3139" id="identifier_4_3139" class="footnote-link footnote-identifier-link" title="This is only partially true, because iprof is single-threaded&hellip;I really wish there was a good cross-platform light-weight way to get per-thread timings.">5</a></sup> when a lot of clients are in the lobby.</p>
<p>My prediction, based on the above, is that the chat message handling is going to be the main culprit.  If so, it&#8217;ll be easy to queue up the chats and send them out in bunches, but I need to be careful here, because the robots chat a lot more than real humans would right now, so I don&#8217;t want to spend too much time optimizing this.  I think I&#8217;ll keep the robots as they are for the initial profiles, and then dial back their chattiness to more realistic levels after I&#8217;ve plucked the low-hanging chat fruit.  I also need to teach the robots how to use lobby rooms for a more realistic test.</p>
<p>Finally, I&#8217;m wondering if my usage of select() is going to be an issue as I get close to 1000 robots.  I may need to port to epoll().  We shall see!</p>
<p>&#8220;Assume Nothing!&#8221;</p>
<p>And finally, the SimCity launch has given me pause&#8230;I&#8217;m still forging ahead with my 1000 simultaneous goal, but I really hope it&#8217;s enough and things go smoothly.  I would much rather have a slow buildup of players over the next year as I roll out more cool stuff than a giant spike that melts everything and makes players grumpy.</p>
<p><a title="Loadtesting for Open Beta, Part 4: Done optimizing the lobbyserver!" href="http://www.spyparty.com/2013/05/21/loadtesting-for-open-beta-part-4-done-optimizing-the-lobbyserver/">On to Part 4&#8230;</a></p>
<hr/><ol class="footnotes"><li id="footnote_0_3139" class="footnote">ZOMBIE ROBOTS!!!</li><li id="footnote_1_3139" class="footnote">I have some local patches I haven&#8217;t cleaned up enough to contribute yet</li><li id="footnote_2_3139" class="footnote">gdb is not the best for assembly language debugging, but I did learn about &#8220;layout asm&#8221;, which helps a bit.</li><li id="footnote_3_3139" class="footnote">It never crashed because conns has a preallocated number of connections that was always bigger than n_conns+1</li><li id="footnote_4_3139" class="footnote">This is only partially true, because iprof is single-threaded&#8230;I really wish there was a good cross-platform light-weight way to get per-thread timings.</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Loadtesting for Open Beta, Part 2</title>
		<link>http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/</link>
		<comments>http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/#comments</comments>
		<pubDate>Sun, 03 Mar 2013 23:28:11 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[beta]]></category>
		<category><![CDATA[indie games]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3109</guid>
		<description><![CDATA[In our last exciting episode of Loadtesting for Open Beta, we did some initial profiling to see how the lobbyserver held up under attack by a phalanx of loadtesting robots spawned in the cloud. It didn&#8217;t hold up, obviously, or the beta would already be open. Specifically, it failed by saturating the server&#8217;s 100Mbps network [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>In our <a title="Loadtesting for Open Beta, Part 1" href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/">last exciting episode of <em>Loadtesting for Open Beta</em></a>, we did some initial profiling to see how the lobbyserver held up under attack by a phalanx of loadtesting robots spawned in the cloud. It didn&#8217;t hold up, obviously, or the beta would already be open.</p>
<p>Specifically, it failed by saturating the server&#8217;s 100Mbps network link, which turned out to be a great way to fail because it meant there were some pretty simple things I could do to optimize the bandwidth utilization.  I had done the initial game<span style="font-size: medium;">↔</span>lobby protocol in the simplest way possible, so every time any player state changed, like a new connection, or switching from chatting in the lobby to playing, it sent out the entire list of player states to everybody.  This doesn&#8217;t scale at all, since as you add more players, most aren&#8217;t changing state, but you&#8217;re sending all of their states out to everybody even if only one changes.  This doesn&#8217;t mean it was the wrong way to program it initially; it&#8217;s really important when you&#8217;re writing complicated software<sup><a href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/#footnote_0_3109" id="identifier_0_3109" class="footnote-link footnote-identifier-link" title="especially by yourself!">1</a></sup> to do things the simplest way possible, as long as you have a vague plan for what you&#8217;ll do if it turns into a problem later.  In this case, I knew what I was doing was probably not going to work in the long run, but it got things up and running more quickly than overengineering some fancy solution I might not have needed, and I waited until it actually <em>was</em> a problem before fixing it.</p>
<a name="Tell+Me+Something+I+Don%26%238217%3Bt+Know"></a><h3>Tell Me Something I Don&#8217;t Know</h3>
<p>The solution to this problem is pretty obvious: differential state updates.  Or, in English, only send the stuff that&#8217;s changed to the people who care about it.  Doing differential updates is significantly more complicated than just spamming everybody with everything, however.  You still have to send the initial state of all the curent players when new players log in, you have to be able to add and remove players in the protocol, which you didn&#8217;t have to before because you were just sending the complete new state every time, etc.</p>
<p>This was going to be a fairly large change, so I took it by steps.  I knew that I&#8217;d have to send out the complete state of everybody to new logins, so it made sense to start by optimizing that initial packet using normal data size optimization techniques.  I pretty easily got it from about 88 bytes per player down to 42 bytes per player, which is nice, because my goal for these optimizations is 1000 simultaneous players, and at 88 bytes they wouldn&#8217;t all fit in my 64kb maximum packet size, where at 42 bytes they should fit, no problem, so I don&#8217;t have to add any kind of break-up-the-list-across-packets thing.  However, it turns out I actually got the ability to send the entire list across multiple packets while I was doing this, because I had to program the ability to add players as part of the differential updates, so now I could just use that packet type to send any clients in a really large player list that didn&#8217;t fit in a single packet.  But, like I said in the last episode, although I don&#8217;t think I&#8217;ll hit 1000 simultaneous outside of load testing for a while, it&#8217;s always nice to know you have that sort of thing in your back pocket for the future.</p>
<p>Once I&#8217;d tested the new optimized player list, I started making the updates differential.  New players get the initial list, and then they&#8217;re considered up-to-date and just get updates along with everybody else.  The list of new players is sent as additions to players already in the lobby.  For each player, I track some simple flags about what&#8217;s been updated in their state, so if they set or clear their /away message for example, that flag is set, and I only send that information.</p>
<p>In programming, usually when you&#8217;ve got the right design, you get some unintentional upside, and this case was no different.  Previously, I was not sending live updates to player stats (wins, game time, etc.) to the players in the lobby until the player was done playing the match, or some other state changed that caused everybody&#8217;s state to be re-sent.  Now, since the differential updates are efficient, I&#8217;m updating player stats in real time as well, so people in the lobby can see wins as they accumulate for players in matches, which is nice and how you&#8217;d expect it to work.</p>
<a name="Results"></a><h3>Results</h3>
<p>It basically worked exactly as planned.  After lots of debugging, of course.  Here you can see the profiles for one of the loadtests, which got to 340 simultaneous players in the lobby:</p>
<div id="attachment_3117" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/SpyParty-v0.1.2553.1-20130303-00-13-24-0.png"><img class="size-large wp-image-3117" title="SpyParty-v0.1.2553.1-20130303-00-13-24-0" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/SpyParty-v0.1.2553.1-20130303-00-13-24-0-600x447.png" alt="" width="600" height="447" /></a><p class="wp-caption-text">I really need to have the robot Sniper win sometimes.</p></div>
<p>&nbsp;</p>
<div id="attachment_3115" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-03-00_13_34-atop-mem.png"><img class="size-large wp-image-3115" title="2013-03-03 00_13_34-atop-mem" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-03-00_13_34-atop-mem-600x243.png" alt="" width="600" height="243" /></a><p class="wp-caption-text">atop in memory mode</p></div>
<p>&nbsp;</p>
<div id="attachment_3114" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-03-00_13_31-atop-cpu.png"><img class=" wp-image-3114" title="2013-03-03 00_13_31-atop-cpu" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/2013-03-03-00_13_31-atop-cpu-600x243.png" alt="" width="600" height="243" /></a><p class="wp-caption-text">atop in cpu mode</p></div>
<p>Look ma, 3% network utilization!  That&#8217;s whats so awesome about a really spiky profile&#8230;when you pound one of the spikes down, things just get better!</p>
<p>Here&#8217;s the new table of packet sizes for this run.  If you compare this with the <a title="Loadtesting for Open Beta, Part 1 - Packet Size Table" href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#Update:+Assuming+More+Nothing&amp;#8230;Er,+Less+Nothing?">previous results</a>, you can see the PLAYER_LIST packets are way way way smaller, and this table was accumulated from two longer test runs, so it&#8217;s not even a fair comparison!  It&#8217;s interesting, because the TYPE_LOBBY_MESSAGE_PACKET is smaller as well, and I think that&#8217;s because now the robots can actually start games since the network isn&#8217;t saturated, and this means they don&#8217;t broadcast chats to the entire lobby while they&#8217;re playing, so that&#8217;s a nice side effect of optimizing the bandwidth.</p>
<table border="0" cellspacing="0" cellpadding="0" align="center">
<thead>
<tr>
<td><strong>Packet Type</strong></td>
<td align="right"><strong>Total Bytes</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td>TYPE_LOBBY_MESSAGE_PACKET</td>
<td align="RIGHT">58060417</td>
</tr>
<tr>
<td>TYPE_LOBBY_PLAYER_LIST_UPDATE_PACKET</td>
<td align="RIGHT">29751413</td>
</tr>
<tr>
<td>TYPE_CLIENT_GAME_JOURNAL_PACKET</td>
<td align="RIGHT">18006186</td>
</tr>
<tr>
<td>TYPE_LOBBY_ROOM_LIST_PACKET</td>
<td align="RIGHT">16674479</td>
</tr>
<tr>
<td>TYPE_LOBBY_PLAYER_LIST_ADDITION_PACKET</td>
<td align="RIGHT">4280563</td>
</tr>
<tr>
<td>TYPE_LOBBY_PLAYER_LIST_PACKET</td>
<td align="RIGHT">3482691</td>
</tr>
<tr>
<td>TYPE_CLIENT_MESSAGE_PACKET</td>
<td align="RIGHT">1501822</td>
</tr>
<tr>
<td>TYPE_CLIENT_LOGIN_PACKET</td>
<td align="RIGHT">477356</td>
</tr>
<tr>
<td>TYPE_CLIENT_INVITE_PACKET</td>
<td align="RIGHT">435368</td>
</tr>
<tr>
<td>TYPE_LOBBY_INVITE_PACKET</td>
<td align="RIGHT">275781</td>
</tr>
<tr>
<td>TYPE_LOBBY_LOGIN_PACKET</td>
<td align="RIGHT">235878</td>
</tr>
<tr>
<td>TYPE_LOBBY_GAME_ID_PACKET</td>
<td align="RIGHT">96000</td>
</tr>
<tr>
<td>TYPE_LOBBY_GAME_OVER_PACKET</td>
<td align="RIGHT">68901</td>
</tr>
<tr>
<td>TYPE_CLIENT_GAME_ID_CONFIRM_PACKET</td>
<td align="RIGHT">40257</td>
</tr>
<tr>
<td>TYPE_LOBBY_PLAY_PACKET</td>
<td align="RIGHT">32498</td>
</tr>
<tr>
<td>TYPE_CLIENT_IN_MATCH_PACKET</td>
<td align="RIGHT">25714</td>
</tr>
<tr>
<td>TYPE_LOBBY_IN_MATCH_PACKET</td>
<td align="RIGHT">21204</td>
</tr>
<tr>
<td>TYPE_CLIENT_CANDIDATE_PACKET</td>
<td align="RIGHT">16089</td>
</tr>
<tr>
<td>TYPE_CLIENT_PLAY_PACKET</td>
<td align="RIGHT">12419</td>
</tr>
<tr>
<td>TYPE_CLIENT_GAME_ID_REQUEST_PACKET</td>
<td align="RIGHT">9610</td>
</tr>
<tr>
<td>TYPE_LOBBY_WELCOME_PACKET</td>
<td align="RIGHT">4494</td>
</tr>
<tr>
<td>TYPE_CLIENT_JOIN_PACKET</td>
<td align="RIGHT">4494</td>
</tr>
<tr>
<td>TYPE_KEEPALIVE_PACKET</td>
<td align="RIGHT">1011</td>
</tr>
<tr>
<td>TYPE_CLIENT_IDLE_PACKET</td>
<td align="RIGHT">24</td>
</tr>
</tbody>
</table>
<p>Hmm, I just noticed as I&#8217;m writing this that the resident memory utilization in the atop screenshot is way lower now than before&#8230;I wonder why&#8230; On the application side I take about 250kb per player right now, which at 340 players should be about 85MB.  Looking at the lobbyserver logs, right about when the screenshot was taken, the lobby self-reported this data:</p>
<pre style="padding-left: 30px;">2013/03/03-02:13:15: MEMORY_POSIX 348/757/409: resident 12808/12808, virtual 160276/160276<br />2013/03/03-02:13:15: MEMORY_NEW 348/757/409: bytes 91766974, news 45707, deletes 36155</pre>
<p>The MEMORY_NEW stats looks about right for this load and my quick math, but the MEMORY_POSIX stats—which are read from /proc/pid/status—match the atop results: expected virtual but low resident.   Maybe it was just paged out for a second, or maybe I&#8217;m not touching much of that 250kb and so it doesn&#8217;t stay resident.  A lot of it is network buffers, so it makes some sense with this lower bandwidth protocol that it wouldn&#8217;t be resident compared to last profile because less buffering is having to be done.  I&#8217;ll have to investigate this more.</p>
<a name="Up+Next%2C+The+Case+of+the+Missing+Robots"></a><h3>Up Next, The Case of the Missing Robots</h3>
<p>So, the bandwidth optimizations were a resounding success!  Plus, both the CPU and memory utilization of the lobbyserver are really reasonable and haven&#8217;t been optimized at all, so we&#8217;re sitting pretty for getting to 1000 simulataneous robots&#8230;</p>
<p>Except, where are the remaining 160 robots?  In the test above, I ran 10 EC2 instances, each with 50 robots, thinking the optimizations might let me get to 500 simultaneous and find the next performance issue&#8230;but it never got above 340 in the lobby.  I updated my perl loadtesting framework and had each instance output how many lobbyclients were running every two seconds with this shell command over ssh:</p>
<pre style="padding-left: 30px;">'while true; do echo `date +%T`,`pidof lobbyclient | wc -w`; sleep 2; done'</pre>
<p>And then I loaded that into gnuplot,<sup><a href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/#footnote_1_3109" id="identifier_1_3109" class="footnote-link footnote-identifier-link" title="&hellip;which I hate, but I forgot to install excel on my new laptop, and Google&rsquo;s spreadsheet sucks at pivottables, and the Office for Web excel doesn&rsquo;t even have them as far as I could tell!">2</a></sup> and graphed the number of robots on each instance:</p>
<div id="attachment_3116" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/03/ec2-loadtest-client-counts.png"><img class="size-large wp-image-3116" title="ec2-loadtest-client-counts" src="http://cdn.spyparty.com/wp-content/uploads/2013/03/ec2-loadtest-client-counts-600x344.png" alt="" width="600" height="344" /></a><p class="wp-caption-text">The number of loadtest robots running on each EC2 instance.</p></div>
<p>You can see that they all started up with 50, but then a bunch of them lost clients until they found a steady state.   Something is killing my robots, and I need to figure out what it is&#8230;</p>
<p><a title="Loadtesting for Open Beta, Part 3" href="http://www.spyparty.com/2013/03/18/loadtesting-for-open-beta-part-3/">Turn the page to Part 3&#8230;</a></p>
<hr/><ol class="footnotes"><li id="footnote_0_3109" class="footnote">especially by yourself!</li><li id="footnote_1_3109" class="footnote">&#8230;which I hate, but I forgot to install excel on my new laptop, and Google&#8217;s spreadsheet sucks at pivottables, and the Office for Web excel doesn&#8217;t even have them as far as I could tell!</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Loadtesting for Open Beta, Part 1</title>
		<link>http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/</link>
		<comments>http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#comments</comments>
		<pubDate>Thu, 28 Feb 2013 03:21:24 +0000</pubDate>
		<dc:creator><![CDATA[checker]]></dc:creator>
				<category><![CDATA[beta]]></category>
		<category><![CDATA[indie games]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.spyparty.com/?p=3072</guid>
		<description><![CDATA[Way back in 2011, right before I opened up Early-Access Beta signups, I loadtested and optimized the signup page to make sure it wouldn&#8217;t crash if lots of people were trying to submit their name and email and confirm their signup. I always intended to write up a technical post or two about that optimization [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a title="Here we go…it’s SpyParty Beta time!" href="http://www.spyparty.com/2011/05/10/here-we-go-its-spyparty-beta-time/">Way back in 2011</a>, right before I opened up <a title="Sign Up for the SpyParty Early-Access Beta!" href="http://www.spyparty.com/beta-sign-up/"><em>Early-Access Beta</em></a> signups, I loadtested and optimized the signup page to make sure it wouldn&#8217;t crash if lots of people were trying to submit their name and email and confirm their signup. I always intended to write up a technical post or two about that optimization process because it was an interesting engineering exercise, but I have yet to get around to it. However, I can summarize the learnings here pretty quickly: <a href="http://wordpress.org/">WordPress</a> is excruciatingly slow, <a href="https://www.varnish-cache.org/">Varnish</a> is incredibly fast, I ♥ <a href="http://www.perl.org/">Perl</a>,<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_0_3072" id="identifier_0_3072" class="footnote-link footnote-identifier-link" title="See this thread for how I wrote the dynamic loadtesting form submission in a way that would saturate the network link.">1</a></sup> <a href="http://httpd.apache.org/">Apache</a> with plain old mod_php (meaning <em>not</em> loading WordPress) was actually <em>way</em> faster than I expected, slightly faster even than <a href="http://nginx.org/">nginx</a> + php-fpm in my limited tests, <a href="http://aws.amazon.com/cloudfront/">CloudFront</a> is pretty easy to use,<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_1_3072" id="identifier_1_3072" class="footnote-link footnote-identifier-link" title="I use CF for images and other static stuff, with W3 Total Cache to keep them synced to S3, but I only use W3TC for this CDN sync, since Varnish blows it out of the water for actual caching.">2</a></sup> and even cheap and small dedicated servers can handle a lot of traffic if you&#8217;re smart about it.</p>
<p>Like with any kind of optimization, <em><a href="http://www.phatcode.net/res/224/files/html/ch03/03-01.html">Assume Nothing</a></em>, so you should always write the loadtester first, and run it to get a baseline performance profile, and continue running it as you optimize the hotspots. When I started, the signup submission could only handle 2 or 3 submits per second. When I was done, it could handle 400 submissions per second. I figured that was enough.<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_2_3072" id="identifier_2_3072" class="footnote-link footnote-identifier-link" title="Let me be clear, I think 400 submissions per second is really pretty slow for raw performance on a modern computer, but web apps these days have so many layers that you lose a ton of performance relative to what would happen if you wrote the whole thing in C. For an interesting example of this, there&rsquo;s a wacky high performance web server called G-WAN that gets rid of all the layers and lets you write the pages directly in compiled C.">3</a></sup> If more than 400 people were signing up for the <strong>SpyParty</strong> beta every second, well, let&#8217;s file that under &#8220;good problem to have&#8221;.</p>
<p>After all the loadtesting and optimizing, the signups <a title="Beta Data" href="http://www.spyparty.com/2011/05/12/beta-data/">went off without a hitch</a>.</p>
<p>Loadtesting and optimizing the beta signup process was important, because the entire reason I took signups instead of just letting people play immediately was &#8220;fear of the unknown&#8221;. I couldn&#8217;t know in advance how many people would be interested in the game, and getting a couple web forms scalable in case that number was &#8220;a lot&#8221; was much easier than getting the full game and its server scalable, and that&#8217;s ignoring the very real need to exert some control over the growth of the community, to make sure the game wasn&#8217;t incredibly buggy on different hardware configurations or that there wasn&#8217;t some glaring balance issue, etc. Overall, starting with signups and a closed beta was great for the game, even if it&#8217;s meant frustrating people who signed up and want to play.</p>
<p>But it&#8217;s been long enough, and I&#8217;m now finally actively loadtesting and optimizing for opening the beta!</p>
<a name="Lobby+Loadtesting+Framework"></a><h3>Lobby Loadtesting Framework</h3>
<p>Like with the signup form, I&#8217;m loadtesting first. This will tell me where I need to optimize, and allow me to test my progress against the baseline. However, loadtesting a game lobby server is a lot more complicated than loadtesting a web form, so it&#8217;s a bit slower-going. I&#8217;ve had to create a robot version of the game client that logs into the lobby, chats, invites other robots to play, and then reports on the results of the fake games played. I build this on top of the game&#8217;s client interface, so it looks just like a real game to the lobby.</p>
<p>As with all testing, you need to make sure you aren&#8217;t <a href="http://en.wikipedia.org/wiki/Werner_Heisenberg">Heisenberg</a>-ing<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_3_3072" id="identifier_3_3072" class="footnote-link footnote-identifier-link" title="I just read on wikipedia that the uncertainty principle is often confused with the observer effect, and so on the surface this verbing of Heisenberg&rsquo;s name isn&rsquo;t correct, except he apparently also confused the two, so I&rsquo;m going to keep on verbing.">4</a></sup> your results, so I wanted to get fairly close to the same load that would happen with multiple real game clients hitting the server. This means I had to have a good number of machines running these robots hitting the test lobby at the same time, and that means using cloud computing. I was inspired by the <a href="http://blog.apps.chicagotribune.com/2010/07/08/bees-with-machine-guns/"><em>bees with machine guns</em></a> article about using Amazon Web Services&#8217;s Elastic Compute Cloud (EC2) to launch a bunch of cheap http load testers. I use AWS for <strong>SpyParty</strong> already, distributing updates and uploading crashdumps using S3, so this seemed like a good fit. At first I tried modifying the bees code to do what I want, but I found the Python threading technique they used for controlling multiple instances didn&#8217;t scale well running on Windows, and since I wanted more control over the instances anyway and the core idea was not terribly difficult to implement, I wrote my own version in Perl, which I&#8217;m much more familiar with. The code uses <a href="http://search.cpan.org/~mallen/Net-Amazon-EC2-0.23/lib/Net/Amazon/EC2.pm">Net::Amazon::EC2</a> to talk to AWS to start, list, and stop EC2 instances, and <a href="http://search.cpan.org/~rkitover/Net-SSH2-0.48/lib/Net/SSH2.pm">Net::SSH2</a> to talk to the instances themselves, executing commands and waiting for exit codes, downloading logs, and whatnot. I just use an existing CentOS EC2 AMI<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_4_3072" id="identifier_4_3072" class="footnote-link footnote-identifier-link" title="ami-c9846da0">5</a></sup> and then have the scripts download and install my robots onto it from S3 every time I start one up; I didn&#8217;t want to bother with creating a custom AMI when my files are pretty small. I&#8217;m going to post all the loadtest framework code once I&#8217;ve got it completely working so others can use it.</p>
<a name="How+Much+is+Enough%3F"></a><h3>How Much is Enough?</h3>
<p>In loadtesting the loadtesters, I found that an <a href="http://aws.amazon.com/ec2/instance-types/"><em>m1.small</em> instance</a> could run about 50 loadtest bots simultaneously with my current client code. I can switch to larger and more expensive EC2 instance types if I need to run more robots per instance, and as I optimize the server I&#8217;m pretty sure the client code will get optimized as well, which will allow more concurrency. Amazon limits accounts to 20 simultaneous EC2 instances until you apply for an exception, so I&#8217;ve done that,<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_5_3072" id="identifier_5_3072" class="footnote-link footnote-identifier-link" title="although they haven&rsquo;t gotten back to me so I guess I&rsquo;ll apply again&hellip;sigh, customer service &ldquo;in the cloud&rdquo; &nbsp;Update: Woot! &nbsp;My limit has been increased, now I can DDOS myself to my heart&rsquo;s content!">6</a></sup> but even with that limitation, I can loadtest to about 1000 concurrent clients, which seems like more than enough for now.</p>
<p>I still don&#8217;t know exactly what to expect when I open up the beta, but I don&#8217;t think I&#8217;ll hit 1000 simultaneous <strong>SpyParty</strong> players outside of loadtesting anytime soon. If you look at <a href="http://store.steampowered.com/stats/">the Steam Stats page</a>, 1000 simultaneous players is right in the middle of the top 100 games on the entire service, including some pretty popular mainstream games with mature player communities. In the current closed beta, I think our maximum number of simultaneous players has been around 25, and it&#8217;s usually between 10 and 15 on any given night at peak times, assuming there&#8217;s no event happening and I haven&#8217;t just sent out a big batch of invites. I still have about 6000 people left to invite for the first time from the signup list, and 9000 who didn&#8217;t register on their first invite to re-invite, all of whom I&#8217;ll use for live player loadtesting after the 1000 robots are happily playing without complaints. I think the spike from those last closed invites will be bigger than the open beta release spike, unless there are a ton of people who didn&#8217;t want to sign up with their email address, but who will buy the game once the beta is open. I guess that&#8217;s possible, but who knows? Again, if we go over 1000 simultaneous, I guess I will scramble to move the lobby to a bigger server, and keep repeating the &#8220;good problem to have&#8221; mantra over and over again, but I&#8217;m betting it&#8217;s not going to happen and things will go smoothly.</p>
<p>After open beta there will be a long list of awesome stuff coming into the game, including new maps and missions, spectation and replays, the <a title="The New SpyParty Character Art Style" href="http://www.spyparty.com/2012/08/27/the-new-spyparty-character-art-style/">new art</a>, and lots more, but once things are open it&#8217;ll be easier to predict the size of those spikes and plan accordingly. Eventually I&#8217;ll probably (hopefully?) have to move the lobby off my current server, but I&#8217;m pretty sure based on my initial testing that the old girl can keep things going smoothly a bit longer.</p>
<a name="Initial+Loadtesting+Baseline"></a><h3>Initial Loadtesting Baseline</h3>
<p>Okay, so what happens when I unleash the robots? Well, I haven&#8217;t let 1000 of them loose yet, but I&#8217;ve tried 500, and things fall over, as you might expect. It looks like around 250 is the maximum that can even connect right now, which is actually more than I thought I&#8217;d start out with.</p>
<div id="attachment_3075" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/02/SpyParty-v0.1.2532.0-20130227-11-56-33-0.png"><img class="size-large wp-image-3075" title="SpyParty-v0.1.2532.0-20130227-11-56-33-0" src="http://cdn.spyparty.com/wp-content/uploads/2013/02/SpyParty-v0.1.2532.0-20130227-11-56-33-0-600x505.png" alt="" width="600" height="505" /></a><p class="wp-caption-text">The loadtesting robots are not very good conversationalists.</p></div>
<p>Things don&#8217;t work very well even with 250 clients, though, with connections failing, and match invites not going through.<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_6_3072" id="identifier_6_3072" class="footnote-link footnote-identifier-link" title="Let&rsquo;s ignore the lobby UI also drawing all over itself for now.">7</a></sup> However, when I looked at <a href="http://www.atoptool.nl">atop</a> while the robots were pounding on the lobby, a wonderful thing was apparent:</p>
<div id="attachment_3096" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/02/2013-02-27-12_32_00-atop-cpu.png"><img class="size-large wp-image-3096" title="2013-02-27 12_32_00-atop-cpu" src="http://cdn.spyparty.com/wp-content/uploads/2013/02/2013-02-27-12_32_00-atop-cpu-600x256.png" alt="" width="600" height="256" /></a><p class="wp-caption-text">atop in CPU mode</p></div>
<p>&nbsp;</p>
<div id="attachment_3095" style="width: 610px" class="wp-caption aligncenter"><a href="http://cdn.spyparty.com/wp-content/uploads/2013/02/2013-02-27-12_31_53-atop-mem.png"><img class="size-large wp-image-3095" title="2013-02-27 12_31_53-atop-mem" src="http://cdn.spyparty.com/wp-content/uploads/2013/02/2013-02-27-12_31_53-atop-mem-600x256.png" alt="" width="600" height="256" /></a><p class="wp-caption-text">atop in memory mode</p></div>
<p>Neither the CPU utilization nor the memory utilization was too terrible, but the lobbyserver was saturating the 100 Mbps ethernet link! That&#8217;s awesome, because that&#8217;s going to be easy to fix!</p>
<p>Before I explain, let me say that the best kind of profile is one with a single giant spike, one thing that&#8217;s obviously completely slow and working poorly. The worse kind of profile is a flat line, where everything is taking 3% of the time and there&#8217;s no single thing you can optimize. This is a great profile, because it points right towards the first thing I need to fix, which is the network bandwidth.</p>
<p>My protocol between the game clients and the lobby server is really pretty dumb in a lot of ways, but the biggest way it&#8217;s dumb is that on any state change of any client, it sends the entire list of clients and their current state to every client. This is the simplest thing to do and means there&#8217;s no need to track which clients have received which information, and this in turn means it&#8217;s the right thing to do first when you&#8217;re getting things going, but it&#8217;s also terribly wasteful performance-wise compared to just sending out the clients who changed each tick. So, I was delighted to see that bandwidth was my first problem, because it&#8217;s easy to see that I have to fix the protocol. I&#8217;m guessing switching to a differential player state update will cut the bandwidth by 50x, which will then reveal the next performance spike.</p>
<p style="text-align: left;">I can&#8217;t wait to find out what it will be!<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_7_3072" id="identifier_7_3072" class="footnote-link footnote-identifier-link" title="You can see the CPU usage is pretty high relative to the memory usage, and seeing slapd and krb5kdc in there is a bit worrying, since that&rsquo;s kerberos and ldap, which are used for the login and client authentication and are going to be a bit harder to optimize if they start poking their heads up too high, but both of them have very battle-tested enterprise-scale optimization solutions via replication, so worst-case is I&rsquo;ll have to get another machine for them, I think. If the lobbyserver itself is still CPU-bound after fixing the bandwidth issue, then I&rsquo;ll start normal code optimization for it, including profiling, of course. I&rsquo;ll basically recurse on the lobbyserver executable!">8</a></sup></p>
<p>Oh, and the total EC2 bill for my loadtesting over the past few days: $5.86</p>
<a name="So%26%238230%3BOpen+Beta%3F"></a><h3>So&#8230;Open Beta?</h3>
<p>Within weeks! Weeks, I tell you!</p>
<p>Oh, and as I&#8217;ve said before, everybody who is signed up will get invited in before open beta. I will then probably have a short &#8220;quiet period&#8221; where I let things settle down before really opening it up, so if you want in before open beta, <a title="Sign Up for the SpyParty Early-Access Beta!" href="http://www.spyparty.com/beta-sign-up/">sign up now</a>.</p>
<a name="Update%3A+Assuming+More+Nothing%26%238230%3BEr%2C+Less+Nothing%3F"></a><h3>Update: Assuming More Nothing&#8230;Er, Less Nothing?</h3>
<p>After posting this article, I was about to start optimizing the client list packets, when it occurred to me I wasn&#8217;t <a href="http://www.phatcode.net/res/224/files/html/ch03/03-01.html">assuming enough nothing</a>, because I was assuming it was the client list taking all the bandwidth. This made me a bit nervous, which is the right feeling to have when you&#8217;re not following your own advice,<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_8_3072" id="identifier_8_3072" class="footnote-link footnote-identifier-link" title="&hellip;let alone Mike Abrash&rsquo;s advice!">9</a></sup> so I implemented a really simple bit of code that accumulated the per-packet send and recieve sizes, and printed them on exit, and then threw another 250 robots at the server for 60 seconds. The results validated the client list assumption, it&#8217;s by far the biggest bandwidth consumer, sending 1.6GB in 60 seconds.<sup><a href="http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/#footnote_9_3072" id="identifier_9_3072" class="footnote-link footnote-identifier-link" title="Or actually trying to send, since 1.6GB in 60 seconds is 200Mbps, which is not happening on a 100Mbps link!">10</a></sup> However, it did show that the lobby sending chat and status messages to the clients is also maybe going to be a problem, so yet again: <em>measuring things is crucial</em>.</p>
<table border="0" cellspacing="0" cellpadding="0" align="center">
<thead>
<tr>
<td><strong>Packet Type</strong></td>
<td align="right"><strong>Total Bytes</strong></td>
</tr>
</thead>
<tbody>
<tr>
<td>TYPE_LOBBY_PLAYER_LIST_PACKET</td>
<td align="right">1632549877</td>
</tr>
<tr>
<td>TYPE_LOBBY_MESSAGE_PACKET</td>
<td align="right">66687600</td>
</tr>
<tr>
<td>TYPE_LOBBY_ROOM_LIST_PACKET</td>
<td align="right">9474937</td>
</tr>
<tr>
<td>TYPE_CLIENT_INVITE_PACKET</td>
<td align="right">303056</td>
</tr>
<tr>
<td>TYPE_CLIENT_MESSAGE_PACKET</td>
<td align="right">226779</td>
</tr>
<tr>
<td>TYPE_CLIENT_LOGIN_PACKET</td>
<td align="right">157795</td>
</tr>
<tr>
<td>TYPE_LOBBY_INVITE_PACKET</td>
<td align="right">131667</td>
</tr>
<tr>
<td>TYPE_LOBBY_LOGIN_PACKET</td>
<td align="right">77951</td>
</tr>
<tr>
<td>TYPE_KEEPALIVE_PACKET</td>
<td align="right">43032</td>
</tr>
<tr>
<td>TYPE_CLIENT_GAME_JOURNAL_PACKET</td>
<td align="right">5478</td>
</tr>
<tr>
<td>TYPE_LOBBY_PLAY_PACKET</td>
<td align="right">1888</td>
</tr>
<tr>
<td>TYPE_LOBBY_WELCOME_PACKET</td>
<td align="right">1491</td>
</tr>
<tr>
<td>TYPE_CLIENT_JOIN_PACKET</td>
<td align="right">1491</td>
</tr>
<tr>
<td>TYPE_CLIENT_PLAY_PACKET</td>
<td align="right">836</td>
</tr>
<tr>
<td>TYPE_CLIENT_IN_MATCH_PACKET</td>
<td align="right">713</td>
</tr>
<tr>
<td>TYPE_LOBBY_IN_MATCH_PACKET</td>
<td align="right">532</td>
</tr>
<tr>
<td>TYPE_CLIENT_CANDIDATE_PACKET</td>
<td align="right">490</td>
</tr>
<tr>
<td>TYPE_LOBBY_GAME_ID_PACKET</td>
<td align="right">300</td>
</tr>
<tr>
<td>TYPE_CLIENT_GAME_ID_REQUEST_PACKET</td>
<td align="right">30</td>
</tr>
</tbody>
</table>
<p>It&#8217;s interesting that the clients are only sending 300KB worth of chat messages to the lobby, but it&#8217;s sending 66MB back to them, but 66MB is around 250 * 300KB, so it makes back-of-the-envelope sense. I&#8217;m probably going to need to investigate that more once I&#8217;ve hammered the player list traffic down. Maybe I&#8217;ll have to accumulate them every tick, compress them all, and send them out.</p>
<p><a title="Loadtesting for Open Beta, Part 2" href="http://www.spyparty.com/2013/03/03/loadtesting-for-open-beta-part-2/">This way to Part 2&#8230;</a></p>
<hr/><ol class="footnotes"><li id="footnote_0_3072" class="footnote">See <a href="http://www.perlmonks.org/?node_id=901638">this thread</a> for how I wrote the dynamic loadtesting form submission in a way that would saturate the network link.</li><li id="footnote_1_3072" class="footnote">I use CF for images and other static stuff, with <a href="http://wordpress.org/extend/plugins/w3-total-cache/">W3 Total Cache</a> to keep them synced to S3, but I only use W3TC for this CDN sync, since Varnish blows it out of the water for actual caching.</li><li id="footnote_2_3072" class="footnote">Let me be clear, I think 400 submissions per second is really pretty slow for raw performance on a modern computer, but web apps these days have so many layers that you lose a ton of performance relative to what would happen if you wrote the whole thing in C. For an interesting example of this, there&#8217;s a wacky high performance web server called <a href="http://gwan.com/benchmark/babel.html">G-WAN</a> that gets rid of all the layers and lets you write the pages directly in compiled C.</li><li id="footnote_3_3072" class="footnote">I just read on wikipedia that the <a href="http://en.wikipedia.org/wiki/Uncertainty_principle">uncertainty principle</a> is often confused with the <a href="http://en.wikipedia.org/wiki/Observer_effect_%28physics%29">observer effect</a>, and so on the surface this verbing of Heisenberg&#8217;s name isn&#8217;t correct, except he apparently also confused the two, so I&#8217;m going to keep on verbing.</li><li id="footnote_4_3072" class="footnote">ami-c9846da0</li><li id="footnote_5_3072" class="footnote">although they haven&#8217;t gotten back to me so I guess I&#8217;ll apply again&#8230;sigh, customer service &#8220;in the cloud&#8221;  Update: Woot!  My limit has been increased, now I can DDOS myself to my heart&#8217;s content!</li><li id="footnote_6_3072" class="footnote">Let&#8217;s ignore the lobby UI also drawing all over itself for now.</li><li id="footnote_7_3072" class="footnote">You can see the CPU usage is pretty high relative to the memory usage, and seeing slapd and krb5kdc in there is a bit worrying, since that&#8217;s <a href="http://web.mit.edu/Kerberos/">kerberos</a> and <a href="http://www.openldap.org/">ldap</a>, which are used for the login and client authentication and are going to be a bit harder to optimize if they start poking their heads up too high, but both of them have very battle-tested enterprise-scale optimization solutions via replication, so worst-case is I&#8217;ll have to get another machine for them, I think. If the lobbyserver itself is still CPU-bound after fixing the bandwidth issue, then I&#8217;ll start normal code optimization for it, including profiling, of course. I&#8217;ll basically recurse on the lobbyserver executable!</li><li id="footnote_8_3072" class="footnote">&#8230;let alone Mike Abrash&#8217;s advice!</li><li id="footnote_9_3072" class="footnote">Or actually <em>trying to send</em>, since 1.6GB in 60 seconds is 200Mbps, which is not happening on a 100Mbps link!</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.spyparty.com/2013/02/27/loadtesting-for-open-beta-part-1/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Object Caching 5172/5193 objects using apc
Content Delivery Network via Amazon Web Services: CloudFront: cdn.spyparty.com

 Served from: www.spyparty.com @ 2014-04-13 03:57:39 by W3 Total Cache -->