<?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>Game Dev Without a Cause &#187; XNA</title>
	<atom:link href="https://gamedevwithoutacause.com/?cat=14&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://gamedevwithoutacause.com</link>
	<description>Rob&#039;s Thoughts on Games, Game Dev, and Design - Temporary home of Skyboy Games</description>
	<lastBuildDate>Wed, 23 Jul 2014 09:18:52 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Slay the Beast 0.0.9 for Windows on IndieDB</title>
		<link>https://gamedevwithoutacause.com/?p=2004</link>
		<comments>https://gamedevwithoutacause.com/?p=2004#comments</comments>
		<pubDate>Thu, 10 Oct 2013 17:06:22 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Slay the Beast]]></category>
		<category><![CDATA[XBLIG]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=2004</guid>
		<description><![CDATA[So, I&#8217;ve been plugging away at Slay the Beast and posting builds on IndieDB. It&#8217;s&#8230; pretty cool actually. I admit that I was a bit cautious going into the whole &#8220;open development&#8221; thing, but posting regular builds to IndieDB has &#8230; <a href="https://gamedevwithoutacause.com/?p=2004">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/10/BeastSS018.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/10/BeastSS018-1024x576.png" alt="BeastSS018" width="584" height="328" class="aligncenter size-large wp-image-2005" /></a></p>
<p>So, I&#8217;ve been plugging away at Slay the Beast and posting builds on IndieDB.  It&#8217;s&#8230; pretty cool actually.  I admit that I was a bit cautious going into the whole &#8220;open development&#8221; thing, but posting regular builds to IndieDB has been really enlightening and encouraged me to ferret out many bugs that I might otherwise have let fester.  So, yay that!</p>
<p>In other, highly-related, news, I&#8217;ve release version 0.0.9 of Slay the Beast for your consumption.<br />
Since the last build I have:</p>
<ul>
<li>Fixed characters not flashing red on fatal blow</li>
<li>Knight will now fall in different directions depending on direction of fatal blow</li>
<li>Added blue glow at base of flame attacks</li>
<li>Added particle effects to fireball and slash impacts</li>
<li>Fixed race-condition crash going from menu to in-game </li>
<li>Archdemon can now turn-around by pressing RB (Right Bumper) / P on Keyboard</li>
<li>Fixed some garbage collection issues</li>
<li>Added particle effects on Knight and Archdemon death</li>
<li>Fixed Knight knockback logic to be framerate independent</li>
<li>Fireballs that land outside arena no longer spawn flames inside the arena</li>
<li>Added shadow under fireballs</li>
<li>Added breakable candles that release power-ups that can be used by heroes</li>
</ul>
<p>Hit the link to enjoy the chaos:<br />
<a href="http://www.indiedb.com/games/slay-the-beast/downloads/slay-the-beast-pre-alpha-009-windows" title="Download Slay the Beast PRE-ALPHA 0.0.9 (Windows) - Indie DB" target="_blank"><img src="http://button.indiedb.com/download/medium/60608.png" alt="Slay the Beast PRE-ALPHA 0.0.9 (Windows)" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=2004</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slay the Beast on YouTube (via @xtomass)</title>
		<link>https://gamedevwithoutacause.com/?p=1998</link>
		<comments>https://gamedevwithoutacause.com/?p=1998#comments</comments>
		<pubDate>Tue, 01 Oct 2013 13:35:51 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Slay the Beast]]></category>
		<category><![CDATA[XBLIG]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1998</guid>
		<description><![CDATA[Yes, I know I pretty much only talk about Slay the Beast lately on this blog. But hey, I&#8217;ve got stuff to say about it! Anyway, YouTuber and Twitterer (Tweeter?) @xtomass recently uploaded a video of his play-through of version &#8230; <a href="https://gamedevwithoutacause.com/?p=1998">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Yes, I know I pretty much only talk about Slay the Beast lately on this blog. But hey, I&#8217;ve got stuff to say about it!</p>
<p>Anyway, YouTuber and Twitterer (Tweeter?) @xtomass recently uploaded a video of his play-through of  version 0.0.6 of Slay the Beast and I would be remiss not to share it.</p>
<p>So, enjoy!<br />
<iframe width="584" height="438" src="http://www.youtube.com/embed/epfaMvVS1tQ?feature=oembed" frameborder="0" allowfullscreen></iframe></p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1998</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slay the Beast 0.0.3 for Windows is Now Available on Indie DB</title>
		<link>https://gamedevwithoutacause.com/?p=1988</link>
		<comments>https://gamedevwithoutacause.com/?p=1988#comments</comments>
		<pubDate>Sat, 07 Sep 2013 13:15:45 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Slay the Beast]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1988</guid>
		<description><![CDATA[A new version of my latest indie game, Slay the Beast, is now available on IndieDB. This build fixes several bugs and adds new Knight abilities. New features / fixes in this build: Made Demon spit attack slightly faster Added &#8230; <a href="https://gamedevwithoutacause.com/?p=1988">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/09/BeastSS007.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/09/BeastSS007-1024x576.png" alt="BeastSS007" width="584" height="328" class="aligncenter size-large wp-image-1989" /></a></p>
<p>A new version of my latest indie game, Slay the Beast, is now available on IndieDB. This build fixes several bugs and adds new Knight abilities.</p>
<p>New features / fixes in this build:</p>
<ul>
<li>Made Demon spit attack slightly faster</li>
<li>Added Dash / Air-Dash ability to Knight</li>
<li>Fixed bug where demon could get stuck in a waiting-to-respawn state</li>
<li>Fixed animations and particles persisting between rounds</li>
<li>Added Slash Projectile when Knight attacks with full HP</li>
<li>Made life bars dual-layered so it&#8217;s easier to see recent damage inflicted</li>
<li>Fixed intermittent boot crash</li>
</ul>
<p>Just hit the button below to download version 0.0.3:<br />
<a href="http://www.indiedb.com/games/slay-the-beast/downloads/slay-the-beast-pre-alpha-003-windows" title="Download Slay the Beast PRE-ALPHA 0.0.3 (Windows) - Indie DB" target="_blank"><img src="http://button.indiedb.com/download/medium/59345.png" alt="Slay the Beast PRE-ALPHA 0.0.3 (Windows)" /></a></p>
<p>Click this banner to visit Slay the Beast on IndieDB:<br />
<a href="http://www.indiedb.com/games/slay-the-beast" title="View Slay the Beast on Indie DB" target="_blank"><img src="http://button.indiedb.com/popularity/medium/games/25790.png" alt="Slay the Beast" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1988</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Slay the Beast PRE-ALPHA Windows Build 0.0.1 Now Available on IndieDB!</title>
		<link>https://gamedevwithoutacause.com/?p=1975</link>
		<comments>https://gamedevwithoutacause.com/?p=1975#comments</comments>
		<pubDate>Mon, 02 Sep 2013 15:23:25 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Slay the Beast]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1975</guid>
		<description><![CDATA[The first build of Slay the Beast is now available on IndieDB for you to download and play. This is an early PRE-ALPHA version of the game. This means that it is very far from feature complete. It is not &#8230; <a href="https://gamedevwithoutacause.com/?p=1975">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/09/Title_v0_0_1.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/09/Title_v0_0_1-1024x576.png" alt="Title_v0_0_1" width="584" height="328" class="aligncenter size-large wp-image-1976" /></a><br />
The first build of Slay the Beast is now available on <a href="http://www.indiedb.com/games/slay-the-beast" target="_blank">IndieDB </a>for you to download and play.</p>
<p>This is an early PRE-ALPHA version of the game.  This means that it is very far from feature complete.  It is not representative of the final product. As development continues, this game will continue to be updated and have new features added regularly.</p>
<p>This version of Slay the Beast is for 2 players to compete in a 2-round match between a heroic Knight and a powerful Archdemon.</p>
<p>Just hit the button below to download the build (Version 0.0.1):<br />
<a href="http://www.indiedb.com/games/slay-the-beast/downloads/slay-the-beast-pre-alpha-001-windows" title="Download Slay the Beast PRE-ALPHA 0.0.1 (Windows) - Indie DB" target="_blank"><img src="http://button.indiedb.com/download/medium/59150.png" alt="Slay the Beast PRE-ALPHA 0.0.1 (Windows)" /></a></p>
<p><b>UPDATE:</b><br />
Version 0.0.2 now available:<br />
<a href="http://www.indiedb.com/games/slay-the-beast/downloads/slay-the-beast-pre-alpha-002-windows" title="Download Slay the Beast PRE-ALPHA 0.0.2 (Windows) - Indie DB" target="_blank"><img src="http://button.indiedb.com/download/medium/59231.png" alt="Slay the Beast PRE-ALPHA 0.0.2 (Windows)" /></a></p>
<p>Or click below to visit Slay the Beast on IndieDB:<br />
<a href="http://www.indiedb.com/games/slay-the-beast" title="View Slay the Beast on Indie DB" target="_blank"><img src="http://button.indiedb.com/popularity/medium/games/25790.png" alt="Slay the Beast" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1975</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New Project, New Screenshot &#8211; Slay the Beast</title>
		<link>https://gamedevwithoutacause.com/?p=1959</link>
		<comments>https://gamedevwithoutacause.com/?p=1959#comments</comments>
		<pubDate>Thu, 29 Aug 2013 03:10:04 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Game Design]]></category>
		<category><![CDATA[Game Development]]></category>
		<category><![CDATA[Slay the Beast]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1959</guid>
		<description><![CDATA[While I may not be updating my blog very often lately, I assure you that I&#8217;ve been staying busy. As proof, here&#8217;s a (very) early work-in-progress screenshot of my current indie game project, Slay the Beast: Slay the Beast is &#8230; <a href="https://gamedevwithoutacause.com/?p=1959">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>While I may not be updating my blog very often lately, I assure you that I&#8217;ve been staying busy.</p>
<p>As proof, here&#8217;s a (very) early work-in-progress screenshot of my current indie game project, Slay the Beast:<br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS001.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS001-1024x520.png" alt="BeastSS001" width="584" height="296" class="aligncenter size-large wp-image-1961" /></a></p>
<p>Slay the Beast is a versus fighting game where one player controls a huge boss-level monster. While the other player controls a puny (but respawning) hero. The sprites are from <a href="http://oryxdesignlab.com/" target="_blank">Oryx Design Lab</a>&#8216;s Hifi Gothic Set and animation is done with Spine, from <a href="http://esotericsoftware.com/" target="_blank">Esoteric Software</a>.</p>
<p>The game is still at an early stage of development. Heck, I just started this project a few weeks ago! However, I plan on making WIP builds available soon. Stay tuned for more news.<br />
<span id="more-1959"></span><br />
<b>EDIT:</b><br />
Here are some more screenshots for your viewing pleasure:<br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS002.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS002-1024x576.png" alt="BeastSS002" width="584" height="328" class="aligncenter size-large wp-image-1968" /></a><br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS003.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS003-1024x576.png" alt="BeastSS003" width="584" height="328" class="aligncenter size-large wp-image-1969" /></a><br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS004.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastSS004-1024x576.png" alt="BeastSS004" width="584" height="328" class="aligncenter size-large wp-image-1971" /></a></p>
<p>And one more for people who&#8217;d like to see how characters look in-editor:<br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastTools001.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/08/BeastTools001-1024x607.png" alt="BeastTools001" width="584" height="346" class="aligncenter size-large wp-image-1973" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1959</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Itano Alpha Flight Out Now on Xbox Live Indie Games</title>
		<link>https://gamedevwithoutacause.com/?p=1933</link>
		<comments>https://gamedevwithoutacause.com/?p=1933#comments</comments>
		<pubDate>Mon, 22 Apr 2013 14:27:07 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[XBLIG]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1933</guid>
		<description><![CDATA[That is a whole lot of missiles! I can&#8217;t think of any more appropriate back-of-the-box quote than that for Itano Alpha Flight, my latest game on Xbox Live Indie Games. This game is all about missiles, yours and your enemies. &#8230; <a href="https://gamedevwithoutacause.com/?p=1933">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/584x700.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/584x700.jpg" alt="584x700" width="584" height="700" class="aligncenter size-full wp-image-1934" /></a></p>
<blockquote><p>That is a whole lot of missiles!</p></blockquote>
<p>I can&#8217;t think of any more appropriate back-of-the-box quote than that for <a href="http://marketplace.xbox.com/en-US/Product/Itano-Alpha-Flight/66acd000-77fe-1000-9115-d80258550d01" target="_blank">Itano Alpha Flight</a>, my latest game on Xbox Live Indie Games. This game is all about missiles, yours and your enemies. It&#8217;s a little bit of Afterburner, a little bit of Macross, and a whole lot of action.</p>
<p>You can see screenshots of the game below:<br />
<span id="more-1933"></span><br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot01.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot01-300x168.jpg" alt="Screenshot01" width="300" height="168" class="aligncenter size-medium wp-image-1937" /></a></p>
<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot02.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot02-300x168.jpg" alt="Screenshot02" width="300" height="168" class="aligncenter size-medium wp-image-1938" /></a></p>
<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot03.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot03-300x168.jpg" alt="Screenshot03" width="300" height="168" class="aligncenter size-medium wp-image-1939" /></a></p>
<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot04.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/04/Screenshot04-300x168.jpg" alt="Screenshot04" width="300" height="168" class="aligncenter size-medium wp-image-1940" /></a></p>
<p>Grab the game <a href="http://marketplace.xbox.com/en-US/Product/Itano-Alpha-Flight/66acd000-77fe-1000-9115-d80258550d01" target="_blank">here</a> or on your Xbox 360 for 80 Microsoft Points ($1 US).</p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1933</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#OneGameAMonth Update: Itano Alpha Flight</title>
		<link>https://gamedevwithoutacause.com/?p=1876</link>
		<comments>https://gamedevwithoutacause.com/?p=1876#comments</comments>
		<pubDate>Tue, 12 Mar 2013 14:37:57 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Game Development]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1876</guid>
		<description><![CDATA[Okay, okay. I&#8217;m about two weeks late but I finally finished up my February #OneGameAMonth entry. In my defense, I did have a confluence of life and work events knock into my schedule. But, that&#8217;s neither here nor there. I &#8230; <a href="https://gamedevwithoutacause.com/?p=1876">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoTitle.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoTitle-1024x576.jpg" alt="ItanoTitle" width="584" height="328" class="aligncenter size-large wp-image-1878" /></a></p>
<p>Okay, okay.  I&#8217;m about two weeks late but I finally finished up my February <a href="http://www.onegameamonth.com/" target="_blank">#OneGameAMonth</a> entry.  In my defense, I did have a confluence of life and work events knock into my schedule.  But, that&#8217;s neither here nor there.  I said One Game a Month.</p>
<p>As I mentioned <a href="http://gamedevwithoutacause.com/?p=1818" title="#OneGameAMonth Status Report" target="_blank">previously</a>, my goal for February&#8217;s game was to capture some of that <a href="http://tvtropes.org/pmwiki/pmwiki.php/Main/MacrossMissileMassacre" target="_blank">Itano Circus</a> feel.  With that in mind, I even went so far as to name the game &#8220;Itano Alpha Flight&#8221;.  And now the game is available for you to play.<br />
<span id="more-1876"></span></p>
<p>Itano Alpha Flight is an action game written in XNA and running on Windows.  The goal of the game is to destroy enemies in rapid succession with your lock-on missiles while avoiding their projectiles. You can control the game with either the keyboard or with an Xbox Controller.</p>
<p>To play, you just need to <a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoAlphaFlight.zip">download this file</a>, unzip it, and run Itano.exe.<br />
I&#8217;m just one guy, so I can&#8217;t really make an guarantees about the suitability of this game for any purpose but I expect it should run reasonably well on most Windows machines.</p>
<p>You can also see how the game turned out in these screenshots:<br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoSS1.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoSS1-1024x576.jpg" alt="ItanoSS1" width="584" height="328" class="aligncenter size-large wp-image-1879" /></a></p>
<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoSS2.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoSS2-1024x576.jpg" alt="ItanoSS2" width="584" height="328" class="aligncenter size-large wp-image-1880" /></a></p>
<p>So, if you have a chance, give Itano Alpha Flight <a href="http://gamedevwithoutacause.com/wp-content/uploads/2013/03/ItanoAlphaFlight.zip">a try</a> and let me know what you think.  In the meantime, I&#8217;ll be plugging away on my next project.</p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1876</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>An Easy Way to Break Your Save Data in XNA</title>
		<link>https://gamedevwithoutacause.com/?p=1675</link>
		<comments>https://gamedevwithoutacause.com/?p=1675#comments</comments>
		<pubDate>Tue, 25 Dec 2012 14:33:44 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Robot Legions]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1675</guid>
		<description><![CDATA[Late last week, I finally managed to pass an update for Robot Legions out onto the Xbox Live Marketplace. I wasn&#8217;t originally planning to release an update this early (I have some other features in-the-works for the &#8220;real&#8221; next update), &#8230; <a href="https://gamedevwithoutacause.com/?p=1675">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2012/12/broken-hard-disk.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2012/12/broken-hard-disk.jpg" alt="broken-hard-disk" width="449" height="300" class="aligncenter size-full wp-image-1679" /></a><br />
Late last week, I finally managed to pass an update for <a href="http://marketplace.xbox.com/en-US/Product/Robot-Legions/66acd000-77fe-1000-9115-d80258550c46" target="_blank">Robot Legions</a> out onto the Xbox Live Marketplace. I wasn&#8217;t originally planning to release an update this early (I have some other features in-the-works for the &#8220;real&#8221; next update), but&#8230; I had a bug.  A nasty save data killing bug.</p>
<p>Yuck.</p>
<p>So, in the interest of helping other XNA devs out there, let me tell you about what I screwed up and how I fixed it.<span id="more-1675"></span></p>
<p>So, let&#8217;s get to the meat.  Let me show you how I screwed up my save data handling.</p>
<p>First, this is how I read my save data:</p>
<pre class="brush: c#">
// Deserialization
XmlSerializer s = new XmlSerializer(typeof(T));
if (container.FileExists(filename))
{
    TextReader r = new StreamReader(container.OpenFile(filename, FileMode.Open));
    saveDataItem = (T)s.Deserialize(r);
    r.Close();
}
container.Dispose();

</pre>
<p>And this is how I wrote it:</p>
<pre class="brush: c#">
// Serialization
XmlSerializer s = new XmlSerializer(saveDataItem.GetType());
TextWriter w = new StreamWriter(container.OpenFile(filename, FileMode.OpenOrCreate));
s.Serialize(w, saveDataItem);
w.Close();
</pre>
<p>See the bug?  Yeah, well, neither did I.  You see, there was this little problem with how I wrote my save data.  The code above would work in most cases, but if I wrote data that was shorter than the previous file&#8217;s save data, the old save data would only be partially overwritten.  Any bytes of the old save data not explicitly overwritten by the new save data would remain appended to the end of the new save data. Thus potentially turning data like this:</p>
<pre class="brush: xml">
&lt;RobotSaveData&gt;&lt;Cash&gt;12345&lt;/Cash&gt;&lt;/RobotSaveData&gt;
</pre>
<p>Into data like this:</p>
<pre class="brush: xml">
&lt;RobotSaveData&gt;&lt;Cash&gt;123&lt;/Cash&gt;&lt;/RobotSaveData&gt;a&gt;
</pre>
<p>And totally confounding the XML deserializer.  Voila! Broken save data and unhappy customers.  To top it off, as far as I can tell, this behavior doesn&#8217;t replicate on Windows, only on the Xbox 360.  You can imagine my consternation.</p>
<p>Enough about what went wrong.  Here&#8217;s how I went about fixing it.  I changed the way I opened a file for writing my save data:</p>
<pre class="brush: c#">
// Serialization
XmlSerializer s = new XmlSerializer(saveDataItem.GetType());
TextWriter w = new StreamWriter(
    container.FileExists(filename) ?
    container.OpenFile(filename, FileMode.Truncate) :
    container.OpenFile(filename, FileMode.Create)
);
s.Serialize(w, saveDataItem);
w.Close();
</pre>
<p>This big difference here is that I use FileMode.Truncate when opening the file for writing save data.  By doing this, I&#8217;m able to dispose of the old contents and completely overwrite them with my new save data.</p>
<p><strong>EDIT:</strong> I was recently informed by one of the fine members of the XBLIG community that simply using FileMode.Create when I open a file is sufficient for my purposes since it&#8217;s behavior when a file exists is the same as FileMode.Truncate.</p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1675</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>More Fun with SpriteFonts</title>
		<link>https://gamedevwithoutacause.com/?p=1605</link>
		<comments>https://gamedevwithoutacause.com/?p=1605#comments</comments>
		<pubDate>Tue, 27 Nov 2012 14:07:55 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1605</guid>
		<description><![CDATA[A while ago, I posted about pre-rendering text to improve runtime performance when using XNA SpriteFonts. Since then, I&#8217;ve managed to complete a game (Robot Legions, currently up for peer review) using my XNA codebase and got to try out &#8230; <a href="https://gamedevwithoutacause.com/?p=1605">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/41603DS65RL._SL500_AA300_.jpeg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/41603DS65RL._SL500_AA300_.jpeg" alt="" title="41603DS65RL._SL500_AA300_" width="300" height="300" class="aligncenter size-full wp-image-1608" /></a><br />
A while ago, I posted about pre-rendering text to improve runtime performance when using XNA SpriteFonts.  Since then, I&#8217;ve managed to complete a game (Robot Legions, currently up for <a href="http://catalog.create.msdn.com/en-US/GameDetails.aspx?catalogEntryId=f9ea114c-b564-4586-84eb-f984e62b408b&#038;type=1" target="_blank">peer review</a>) using my XNA codebase and got to try out my text pre-rendering solution in a real project.  It worked out pretty well, but there were a few features that I wished I had implemented ahead of time.  Well, while Robot Legions was being play-tested, I went ahead and implemented some of those features.  Now I&#8217;ll describe those features and share a bit of (hopefully) helpful code that will let you use them in your own games.<span id="more-1605"></span></p>
<p>The core functionality of my text pre-rendering solution is drawing a given string to a texture using a given font.  I&#8217;m then able to use that text texture anywhere in my game as I would any normal texture.  This allows me to avoid the overhead of calling DrawString() for text in my game that doesn&#8217;t have to change often.  </p>
<pre class="brush: c#">
SpriteFont demoFont = Game.Content.Load&lt;SpriteFont&gt;(&quot;TextRenderingDemo/DemoFont&quot;);
Texture2D textTexture = textWriter.CreateTextSpriteTexture(demoFont, &quot;The quick, brown fox jumped over Richter Belmont&quot;);
</pre>
<p>In addition to the core functionality, I added the following features:</p>
<p><strong>Button Guides</strong><br />
The XBLIG Creator&#8217;s site <a href="http://xbox.create.msdn.com/en-US/education/catalog/utility/controller_buttons" target="_blank">provides</a> images of the Xbox Controller&#8217;s buttons compatible with XNA&#8217;s SpriteFont for providing on-screen control instructions.  While it&#8217;s possible to combine the button images with another sprite font image and use them as one SpriteFont, I prefer to combine the button images with fonts I choose at runtime.  To do this, I prepared a version of my string rendering function with extra parameters for rendering the button image and positioning it relative to the text of my choice.</p>
<pre class="brush: c#">
SpriteFont demoFont = Game.Content.Load&lt;SpriteFont&gt;(&quot;TextRenderingDemo/DemoFont&quot;);
SpriteFont buttonFont = Game.Content.Load&lt;SpriteFont&gt;(&quot;Fonts/xboxControllerSpriteFont&quot;);
Texture2D textTexture = textWriter.CreateButtonGuideTextSpriteTexture(demoFont, buttonFont, &quot;: Do Something&quot;, &quot;&#039;&quot;, 0.5f, new Vector2(0.0f, 0.0f));
</pre>
<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/textRendering011.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/textRendering011.png" alt="" title="textRendering01" width="949" height="531" class="aligncenter size-full wp-image-1616" /></a></p>
<p><strong>Drop Shadows</strong><br />
In a lot of cases, just rendering SpriteFonts as is tends to feel a little flat.  Drawing a darkened version of the same text offset by a couple pixels before drawing the text in question goes a long way to helping it stand out.  It&#8217;s a trick I use so often that I decided to bake drop shadows into my text pre-renderer.  With this functionality, a call like this:</p>
<pre class="brush: c#">
SpriteFont demoFont = Game.Content.Load&lt;SpriteFont&gt;(&quot;TextRenderingDemo/DemoFont&quot;);
List&lt;TextWriterDropShadow&gt; dropShadows = new List&lt;TextWriterDropShadow&gt;();
dropShadows.Add(new TextWriterDropShadow(new Vector2(2.0f, 2.0f), Color.Black));

Texture2D textTexture = textWriter.CreateTextSpriteTexture(demoFont, &quot;The quick, brown fox jumped over Richter Belmont&quot;, Color.White, dropShadows);
</pre>
<p>Can give me text that looks like this:<br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/textRendering02.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/textRendering02.png" alt="" title="textRendering02" width="877" height="540" class="aligncenter size-full wp-image-1618" /></a></p>
<p><strong>Text Borders</strong><br />
You&#8217;ll notice that I pass lists of drop shadows to my sprite pre-renderer.  It may seem like overkill, but being able to define a multiple drop shadows allows me to create various effects when rendering text.  For example, I can define a list of drop-shadows like this:</p>
<pre class="brush: c#">
SpriteFont demoFont = Game.Content.Load&lt;SpriteFont&gt;(&quot;TextRenderingDemo/DemoFont&quot;);
List&lt;TextWriterDropShadow&gt; dropShadows = new List&lt;TextWriterDropShadow&gt;();
dropShadows.Add(new TextWriterDropShadow(new Vector2(-1.0f, -1.0f), Color.Black));
dropShadows.Add(new TextWriterDropShadow(new Vector2(1.0f, -1.0f), Color.Black));
dropShadows.Add(new TextWriterDropShadow(new Vector2(-1.0f, 1.0f), Color.Black));
dropShadows.Add(new TextWriterDropShadow(new Vector2(1.0f, 1.0f), Color.Black));

dropShadows.Add(new TextWriterDropShadow(new Vector2(0.0f, -2.0f), Color.Black));
dropShadows.Add(new TextWriterDropShadow(new Vector2(0.0f, 2.0f), Color.Black));
dropShadows.Add(new TextWriterDropShadow(new Vector2(-2.0f, 0.0f), Color.Black));
dropShadows.Add(new TextWriterDropShadow(new Vector2(2.0f, 0.0f), Color.Black));

Texture2D textTexture = textWriter.CreateTextSpriteTexture(demoFont, &quot;The quick, brown fox jumped over Richter Belmont&quot;, Color.White, dropShadows);
</pre>
<p>To give me fancy bordered text like this:<br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/textRendering03.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/textRendering03.png" alt="" title="textRendering03" width="855" height="526" class="aligncenter size-full wp-image-1619" /></a></p>
<p>How&#8217;s that for pop?</p>
<p>Playing with the number of drop shadows, their offsets, and colors can allow you to produce a variety of decorations for your game&#8217;s text.  Give it a try if you&#8217;re interested. You can find the code for my text pre-renderer below:</p>
<pre class="brush: c#">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace EstrellaLib.Sprite
{
    public class TextWriterDropShadow
    {
        public Vector2 Offset;
        public Color Color;

        public TextWriterDropShadow(Vector2 offset, Color color)
        {
            Offset = offset;
            Color = color;
        }
    }

    public class TextTextureWriter
    {
        GraphicsDevice _graphics;
        SpriteBatch _spriteBatch;

        public TextTextureWriter(GraphicsDevice graphics)
        {
            _graphics = graphics;
            _spriteBatch = new SpriteBatch(graphics);            
        }

        public Texture2D CreateTextSpriteTexture(SpriteFont spriteFont, string textString)
        {
            return CreateTextSpriteTexture(spriteFont, textString, Color.White, null);
        }

        public Texture2D CreateTextSpriteTexture(SpriteFont spriteFont, string textString, Color textColor, List&lt;TextWriterDropShadow&gt; dropShadows)
        {
            return RenderTextTexture(spriteFont, textString, textColor, null, &quot;&quot;, 1.0f, Vector2.Zero, dropShadows);
        }

        public Texture2D CreateButtonGuideTextSpriteTexture(SpriteFont textSpriteFont, SpriteFont buttonGuideSpriteFont, string textString, string buttonGuideText, float buttonGuideScale, Vector2 buttonGuidePositionOffset)
        {
            return CreateButtonGuideTextSpriteTexture(textSpriteFont, buttonGuideSpriteFont, textString, buttonGuideText, buttonGuideScale, buttonGuidePositionOffset, Color.White, null);
        }

        public Texture2D CreateButtonGuideTextSpriteTexture(SpriteFont textSpriteFont, SpriteFont buttonGuideSpriteFont, string textString, string buttonGuideText, float buttonGuideScale, Vector2 buttonGuidePositionOffset, Color textColor, List&lt;TextWriterDropShadow&gt; dropShadows)
        {
            return RenderTextTexture(textSpriteFont, textString, textColor, buttonGuideSpriteFont, buttonGuideText, buttonGuideScale, buttonGuidePositionOffset, dropShadows);
        }

        private Texture2D RenderTextTexture(SpriteFont textSpriteFont, string textString, Color textColor, SpriteFont buttonGuideSpriteFont, string buttonGuideText, float buttonGuideScale, Vector2 buttonGuidePositionOffset, List&lt;TextWriterDropShadow&gt; dropShadows)
        {
            if (textSpriteFont != null)
            {
                Vector2 stringDimensions = textSpriteFont.MeasureString(textString);

                float buttonHorizontalShift = 0.0f;
                Vector2 buttonTextDimensions = Vector2.Zero;
                if (buttonGuideSpriteFont != null)
                {
                    buttonTextDimensions = buttonGuideSpriteFont.MeasureString(buttonGuideText);
                    buttonTextDimensions.X *= buttonGuideScale;

                    buttonTextDimensions.X += Math.Abs(buttonGuidePositionOffset.X);
                    if (buttonGuidePositionOffset.X &lt; 0.0f)
                    {
                        buttonHorizontalShift = -buttonGuidePositionOffset.X;
                    }

                    //Eliminate potential non-integral values that could result in lost pixels on texture render
                    buttonTextDimensions.X = (float)Math.Ceiling(buttonTextDimensions.X);
                }

                Vector2 dropShadowPositionAdjust = Vector2.Zero;
                Vector2 dropShadowSizeAdjust = Vector2.Zero;
                if (dropShadows != null)
                {
                    Vector2 lowestVals = Vector2.Zero;
                    Vector2 hightestVals = Vector2.Zero;
                    foreach (TextWriterDropShadow dropShadow in dropShadows)
                    {
                        if( dropShadow.Offset.X &lt; 0.0f )
                            lowestVals.X = Math.Min(lowestVals.X, dropShadow.Offset.X);

                        if (dropShadow.Offset.Y &lt; 0.0f)
                            lowestVals.Y = Math.Min(lowestVals.Y, dropShadow.Offset.Y);

                        if (dropShadow.Offset.X &gt; 0.0f)
                            hightestVals.X = Math.Max(hightestVals.X, dropShadow.Offset.X);

                        if (dropShadow.Offset.Y &gt; 0.0f)
                            hightestVals.Y = Math.Max(hightestVals.Y, dropShadow.Offset.Y);
                    }

                    dropShadowPositionAdjust.X = Math.Abs(lowestVals.X);
                    dropShadowPositionAdjust.Y = Math.Abs(lowestVals.Y);

                    dropShadowSizeAdjust.X = Math.Abs(lowestVals.X) + Math.Abs(hightestVals.X);
                    dropShadowSizeAdjust.Y = Math.Abs(lowestVals.Y) + Math.Abs(hightestVals.Y);
                }

                RenderTarget2D renderTarget = new RenderTarget2D(_graphics, (int)stringDimensions.X + (int)buttonTextDimensions.X + (int)dropShadowSizeAdjust.X, (int)stringDimensions.Y + (int)dropShadowSizeAdjust.Y);

                _graphics.SetRenderTarget(renderTarget);
                _graphics.Clear(Color.Transparent);
                _spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.PointClamp, null, null);
                
                if (buttonGuideSpriteFont != null)
                {
                    _spriteBatch.DrawString(buttonGuideSpriteFont, buttonGuideText, dropShadowPositionAdjust + new Vector2(buttonHorizontalShift, buttonTextDimensions.Y * -0.25f * buttonGuideScale) + buttonGuidePositionOffset, Color.White, 0.0f, Vector2.Zero, buttonGuideScale, SpriteEffects.None, 1.0f);
                }

                Vector2 textPosition = dropShadowPositionAdjust + new Vector2(buttonHorizontalShift + buttonTextDimensions.X, 0.0f);
                if (dropShadows != null)
                {
                    foreach (TextWriterDropShadow dropShadow in dropShadows)
                    {
                        _spriteBatch.DrawString(textSpriteFont, textString, textPosition + dropShadow.Offset, dropShadow.Color);
                    }
                }

                _spriteBatch.DrawString(textSpriteFont, textString, textPosition, textColor);
                
                _spriteBatch.End();
                _graphics.SetRenderTarget(null);

                return renderTarget;
            }
            return null;
        }
    }
}

/* Button Guide Mapping
Character	Image
Space       Left Thumbstick
!	        Directional Pad
&quot;	        Right Thumbstick
#	        BACK
$	        Guide
%	        START
&amp;	        X
&#039;	        A
(	        Y
)	        B
*	        Right Shoulder
+	        Right Trigger
,	        Left Trigger
-	        Left Shoulder
*/
</pre>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1605</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Using CLRProfiler to Take Out the Trash, Part 2</title>
		<link>https://gamedevwithoutacause.com/?p=1570</link>
		<comments>https://gamedevwithoutacause.com/?p=1570#comments</comments>
		<pubDate>Tue, 13 Nov 2012 14:22:39 +0000</pubDate>
		<dc:creator><![CDATA[Rob]]></dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Robot Legions]]></category>
		<category><![CDATA[XNA]]></category>

		<guid isPermaLink="false">http://gamedevwithoutacause.com/?p=1570</guid>
		<description><![CDATA[In last week&#8217;s post, I described how I used CLRProfiler to identify a couple parts of my code that were producing garbage every frame. One related to equality comparisons with my ActorState struct and another involving System.Objects being produced when &#8230; <a href="https://gamedevwithoutacause.com/?p=1570">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/M-O__character_of_WALL.E_.jpg"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/M-O__character_of_WALL.E_.jpg" alt="" title="M-O_(_character_of_WALL.E_)" width="341" height="512" class="aligncenter size-full wp-image-1575" /></a><br />
In last week&#8217;s post, I described how I used CLRProfiler to identify a couple parts of my code that were producing garbage every frame. One related to equality comparisons with my ActorState struct and another involving System.Objects being produced when I called RuntimePropertyInfo.SetValue().  This time, I&#8217;ll talk about what I did to fix those two problems.<span id="more-1570"></span></p>
<p><b>Fixing Problem #1: Structs as Dictionary Keys</b><br />
So, according to the CLRProfiler, I&#8217;m creating ActorStates via Generic.ObjectEqualityComparer::Equals() during my ChooseTargetNode() function. Looking at that code, it simple looks like I&#8217;m checking against a Dictionary that uses ActorState as a key. A quick Google search turns up this <a href="http://www.xnawiki.com/index.php?title=Enumerations_as_Dictionary_Keys" target="_blank">tidbit on XNA Wikia</a>.  The article talks about how Enums cause memory allocations when used as keys in Dictionaries.  It&#8217;s fair to assume that structs would have similar behavior and cause garbage to be created when used by the Dictionary&#8217;s internal comparison functions.  Luckily, the fix for this is easy.  If a struct implements IEquatable, Dictionary won&#8217;t allocate instances of that struct during comparisons.  Since my ActorState struct already implemented comparison functions, I just needed to add IEquatable as a part of its declaration.</p>
<pre class="brush: c#">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EstrellaLib.Actor
{
    public struct ActorState : IEquatable&lt;ActorState&gt;
    {
        string _stateName;

        public ActorState(string stateName)
        {
            _stateName = stateName.ToUpperInvariant();
        }

        public string StateName
        {
            get
            {
                return _stateName;
            }
            set
            {
                _stateName = value.ToUpperInvariant();
            }
        }

        public override bool Equals(object obj)
        {
            if (obj is ActorState)
            {
                return this.Equals((ActorState)obj);
            }
            return false;
        }

        public bool Equals(ActorState p)
        {
            return _stateName == p._stateName;
        }

        public override int GetHashCode()
        {
            return _stateName.GetHashCode();
        }

        public static bool operator ==(ActorState lhs, ActorState rhs)
        {
            return lhs.Equals(rhs);
        }

        public static bool operator !=(ActorState lhs, ActorState rhs)
        {
            return !(lhs.Equals(rhs));
        }

        public static ActorState None = new ActorState(&quot;NONE&quot;);
    }
}
</pre>
<p>Once I did that, ActorState disappeared from my allocation list on a second CLRProfiler run.</p>
<p><b>Fixing Problem #2: Value Type Boxing with PropertyInfos</b><br />
While the boxing problem caused by my code is relatively straight-forward:</p>
<pre class="brush: c#">
        public override void ApplyToActor(Actor targetActor)
        {
            if (_targetProperty == null)
            {
                _targetProperty = targetActor.GetType().GetProperty(_targetName);
                _targetActor = targetActor;
            }
            System.Diagnostics.Debug.Assert(_targetActor == targetActor);

            //PropertyInfo.SetValue(object obj, object value, object[] index)&#039;s second parameter
            // causes any value types I pass to it to be boxed in a temporary System.Object
            _targetProperty.SetValue(targetActor, _targetValue, null);
        }
</pre>
<p>Fixing it, is not quite as easy as simply implementing a particular interface.  I need to find a way to avoid calling SetValue().  Thankfully, PropertyInfo provides a way for me to get a delegate for setting the properties value that is typed to the value I&#8217;m trying to set.  This means that, if I go through the setter delegate, I can avoid implicitly casting my value type to a System.Object and creating garbage.  With a bit of work, I modify my code and end up with something like this:</p>
<pre class="brush: c#">
        public override void ApplyToActor(Actor targetActor)
        {
            if (_targetActor == null)
            {
                PropertyInfo targetProperty = targetActor.GetType().GetProperty(_targetName);
                _targetActor = targetActor;

                MethodInfo setter = targetProperty.GetSetMethod();
                System.Diagnostics.Debug.Assert(setter != null);
                _propertySetter = (Action&lt;T&gt;)Delegate.CreateDelegate(typeof(Action&lt;T&gt;), targetActor, setter);
            }
            System.Diagnostics.Debug.Assert(_targetActor == targetActor);
            System.Diagnostics.Debug.Assert(_propertySetter != null);
            _propertySetter(_targetValue);
        }
</pre>
<p>It&#8217;s not as easy to read as the version using SetValue, but it doesn&#8217;t produce any garbage.  For a function that will be called multiple times a frame, it&#8217;s totally worth it.</p>
<p><b>Enjoying the Fruits of my Labor</b><br />
With my code changes in place, I fire up CLRProfiler again to make sure I get the expected effect.  The GC Timeline ends up looking something like this.<br />
<a href="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/CLRPic08.png"><img src="http://gamedevwithoutacause.com/wp-content/uploads/2012/11/CLRPic08.png" alt="" title="CLRPic08" width="445" height="184" class="aligncenter size-full wp-image-1562" /></a></p>
<p>There we go!  A few GCs occurring when the game starts up, but once we get to the Title screen: nothing.  Just a flat plane of constant memory use.  My garbage collection problems are solved! At least in this part of the game.</p>
]]></content:encoded>
			<wfw:commentRss>https://gamedevwithoutacause.com/?feed=rss2&#038;p=1570</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
