<?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>luminance &#187; csharp</title>
	<atom:link href="http://www.luminance.org/tag/csharp/feed" rel="self" type="application/rss+xml" />
	<link>http://www.luminance.org/blog</link>
	<description>Programming and Game Development - Kevin Gadd&#039;s Blog</description>
	<lastBuildDate>Sun, 02 Oct 2011 00:15:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Performance Challenges in Compiling Code to JavaScript</title>
		<link>http://www.luminance.org/blog/code/2011/06/18/performance-challenges-in-compiling-code-to-javascript</link>
		<comments>http://www.luminance.org/blog/code/2011/06/18/performance-challenges-in-compiling-code-to-javascript#comments</comments>
		<pubDate>Sat, 18 Jun 2011 12:18:33 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[AltDevBlogADay]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[crippling regret]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jsil]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=1001</guid>
		<description><![CDATA[The following post is cross-posted from AltDevBlogADay. For the past few months, I&#8217;ve been working on a tool to compile .NET applications into JavaScript. While there&#8217;s a lot of work involved, a large chunk of that is caused by static language idioms that cannot easily be expressed in JavaScript. Even when coding by hand, some [...]]]></description>
			<content:encoded><![CDATA[<p><i>The following post is cross-posted from <a href="http://altdevblogaday.org/">AltDevBlogADay</a>.</i></p>
<p>For the past few months, I&#8217;ve been working on <a href="http://jsil.org/">a tool to compile .NET applications into JavaScript</a>. While there&#8217;s a lot of work involved, a large chunk of that is caused by static language idioms that cannot easily be expressed in JavaScript. Even when coding by hand, some of these patterns are difficult to turn into JS that performs well, works correctly, and is easy to understand. In this post, I&#8217;ll begin describing some of the challenges involved.</p>
<h2>Value Type Semantics</h2>
<p>Value type semantics are a common feature in static languages. Most static languages allow you to define custom types that inherit the semantics of the language&#8217;s built in primitive value types, so that your <tt>struct</tt> (or whatever your language happens to call it) behaves much like a single <tt>int</tt> or <tt>float</tt> would when being manipulated. This feature makes it possible for custom numeric types (like a fixed-point value, for example) or even composite types like vectors and matrices to follow the same rules. </p>
<p>At first glance, the lack of this feature might not seem significant &#8211; especially if you&#8217;re used to object oriented programming, it would seem like translating code dependent on these semantics is not an intractable problem. While it&#8217;s certainly not impossible, it has a number of downsides that surprised me, especially once I started profiling real-world code in modern JavaScript implementations:</p>
<h3>Algorithms designed for value types are slower without them</h3>
<p>Those of you who&#8217;ve worked with Java are probably familiar with this particular problem already: If you take an algorithm designed around the presence of value types and port it to a language without them, while you can easily preserve behavior by inserting copies in the correct places, you may find that your performance has gone through the floor. The reason for this is simple: In many runtime environments, the cost of an instance of a reference type is significantly larger than the cost of an instance of a value type. </p>
<p>The reasons for this cost tend to vary, but one common trait is that these algorithms produce tremendous amounts of garbage when run in a garbage-collected environment. Some of the more sophisticated garbage collectors provide mechanisms to improve performance for this kind of code, like generational collection and escape analysis, but the sad fact is that even the most sophisticated collectors available still suffer from visible pauses when the collector runs. These pauses not only impair the overall performance of your application, but in games, they cause painful framerate hitching and can even impair the playability of your title.</p>
<p>Another common source of higher costs for instances of reference types is inheritance. In particular, virtual inheritance. Virtual inheritance as implemented in most languages requires every object instance to have a few bytes devoted to identifying its type, via vtable pointers or the like. In some cases compilers can optimize this overhead out, but the overhead is usually there regardless of whether you use it, and in some languages, the default is to make everything virtual &#8211; so suddenly even your <tt>Vector3</tt> object has a vtable pointer.</p>
<p>A third source of overhead is indirection &#8211; reference types almost always live in the application heap, which means they are allocated in a chunk of space dedicated to that particular instance. Even if you allocate an array of your <tt>Vector3</tt>s, reference type semantics mean that it is probably necessary for the heap to contain an allocation for each one, so that if half of them are destroyed, those resources can be freed and reused by some other data types. Not only does this mean that the simple act of <i>creating</i> that array has become more expensive, but it means that <i>an array of values is no longer guaranteed to be contiguous in memory</i>. Sure, your <tt>Vector3[]</tt> is contiguous, but <i>all it contains is object references</i>. Hm, what&#8217;s that cache locality thing people were talking about again?</p>
<p><i>(Somewhat obvious pre-emptive nitpick: This last bit here doesn&#8217;t apply to C++. But you&#8217;re using C++, so you know this already, and you should probably go make sure MSVC hasn&#8217;t run out of memory while compiling that boost template instantiation. You know the one.)</i></p>
<h3>Algorithms based on value types are fragile using reference types</h3>
<p>Despite the above problems, Java developers are able to produce quality software (depending on who you ask, anyway). The same is true for JavaScript: These algorithms can, with effort, be made to work, and even work well. Unfortunately, there is a significant cost involved. You have to rework your code in order to reduce the amount of garbage it creates, and avoid patterns that naturally require the creation of garbage. For example, in a language like C++, your game probably relies on a math library, featuring structured value types with names like <tt>Vector3</tt> and <tt>Matrix</tt>. If you&#8217;re one of those people who likes operator overloading, you&#8217;ve probably overloaded various operators for those structures, so that you can write things like this:<br />
<script src="https://gist.github.com/1033043.js?file=1.cs"></script><br />
The above code is simple and self-explanatory to someone familiar with the basics of algebra (and those of you who abstain from operator overloading have probably written similar code using functions instead of operators). As mentioned above, the performance of such algorithms will suffer badly in a garbage collected environment, but that&#8217;s not the worst part. First of all, to correctly translate these algorithms, you must carefully locate all the <i>implied copies</i> contained within the code. As written, the above algorithm is correct even without value types. Let&#8217;s convert it to valid JavaScript:<br />
<script src="https://gist.github.com/1033043.js?file=2.js"></script><br />
Seems fine, right? But, the keen-eyed reader realizes that a copy is implied in the Add and Multiply operations, so for them to be correct, they must create and return new Vector3 instances. Let&#8217;s fix it so it doesn&#8217;t produce garbage.<br />
<script src="https://gist.github.com/1033043.js?file=3.js"></script><br />
Hm, we need a copy here. That sucks. We&#8217;ll just store an extra vector in the object so we don&#8217;t need to create garbage. All good, right?<br />
<script src="https://gist.github.com/1033043.js?file=4.js"></script><br />
A little ugly, perhaps, but not bad, right? The clarity suffers a little, but we could address that by naming variables more carefully, etc. Not horrible. But wait a second. We pulled the values <tt>position</tt> and <tt>velocity</tt> out of an object. If we just modified <tt>position</tt> and <tt>velocity</tt>, does that mean we&#8217;ve modified the state of the object it came from? Yes, yes it does. Well, we just need to emulate the semantics of value types, right?<br />
<script src="https://gist.github.com/1033043.js?file=5.js"></script><br />
Okay, there. It&#8217;s correct again now. But wait, garbage collection! Uh, crap. Okay, let&#8217;s remove the copies we don&#8217;t actually need&#8230; we&#8217;ll assume that the value of <tt>NextPosition</tt> isn&#8217;t being used, so we don&#8217;t need to copy it. And we&#8217;re not modifying <tt>Position</tt> so we don&#8217;t need that copy either&#8230;<br />
<script src="https://gist.github.com/1033043.js?file=6.js"></script><br />
Okay, life is good again. But a week later, you&#8217;re reading over commits (sneaky interns keep adding features behind your back, the <i>nerve</i>) and you see something that makes you spit up your coffee:<br />
<script src="https://gist.github.com/1033043.js?file=7.js"></script><br />
Luckily, as noted in the comment, the game isn&#8217;t using ZoomFactor yet, so it&#8217;s always 1. Nothing horrible has happened yet. But now you&#8217;re worried, and you&#8217;re starting to sweat a little: What other bugs has JDoe introduced that are just waiting to break your code once it hits production? Didn&#8217;t this guy develop payment processing systems at a bank? Are your savings in danger? Oh man, what if a bug in code he wrote allows Albanian hackers to steal that money you&#8217;ve been saving up for your little startup venture? You might be stuck working here for another 10 years!</p>
<h3>Quality algorithms designed without value types are hard to find</h3>
<p>So, let&#8217;s say you&#8217;ve calmed down a little bit after that panic attack earlier. JDoe&#8217;s not a bad guy, he&#8217;s just new at this. You&#8217;ll go through and review his code with him, make sure he understands what he did wrong, and then you&#8217;ll add another 5 pages to the company&#8217;s ever-growing coding standards document, right after you find a new bank. Life moves on, right?</p>
<p>While you&#8217;re doing the code review, though, you run across something that makes you pause. You notice that JDoe modified some code that was written by Chris Beardy, a wizardly programmer type who had already been working here for 8 years when you started out. Nobody really knows what happened to Beardy; one day he just stopped showing up. Until now, his code hadn&#8217;t been a problem, since most of it worked great, and the bits that stopped working you just threw out and rewrote (with variable names longer than two characters). </p>
<p>JDoe has done his best to modify the code, and while it seems to work, you realize you don&#8217;t know whether it&#8217;s correct. You could assume that JDoe messed up, but what if you&#8217;re wrong? How can you be sure the code is correct? You ask around the office to see if anyone has Beardy&#8217;s phone number, but nobody is even certain if he owned a phone. You try to contact his next of kin but all of their phone numbers bear international dialing codes and it&#8217;s 3am in Singapore. This is a problem.</p>
<p>After consulting with a respected colleague, you hit upon a solution: It may be true that neither of you know whether the code is correct, but you <i>know what it was supposed to do</i>. It turns out it&#8217;s based on some old academic paper, and the paper&#8217;s been cited a bunch of times, and other games use this same algorithm. You figure you can just read a couple of those papers and implement the algorithm yourself &#8211; hell, maybe you can find a good implementation out there on the internet that&#8217;s fit to use!</p>
<p>Soon after you begin reading the papers, panic begins to set in once again. You&#8217;re starting to wonder if that literature major was such a good idea, and trying to remember the stuff you learned in the few math classes you <i>did</i> take. You&#8217;re not entirely convinced that these symbols used for variable names exist in any alphabet, and not even your coworkers know what it means when the author writes them upside down. You abandon your paper-reading expedition, reminding yourself that code reuse is better anyway, and as a good engineer you should avoid Not Invented Here syndrome by adopting someone else&#8217;s battle-tested implementation&#8230;</p>
<p>Now the horror begins. You narrow down the few available implementations for your programming language, rule out the ones that depend on libraries you can&#8217;t possibly bundle in, and check with Legal to figure out which specific open-source licenses don&#8217;t cause them to flee in terror. You scan over some documentation and things don&#8217;t seem too bad. This one is enterprise ready, and you can get a support contract! This one is written using Inversion of Control and Dependency Injection, whatever those are &#8211; you think you might have heard someone say something good about them once. You&#8217;re feeling pretty okay about things until you pop open the source code. Why are half of the comments in Japanese? This class name is 50 characters long and you&#8217;re pretty sure all it&#8217;s responsible for is adding numbers. The constructor for one of the key objects creates no less than 8 abstract factories, and two of <i>those</i> only exist to create <i>other</i> abstract factories&#8230;</p>
<p>While you start updating your resume, you start to wonder whether you should consider another line of work&#8230;</p>
<p>(<i>Now, let&#8217;s be completely fair: This one applies to pretty much any programming language, value types or not. But I&#8217;ve never been the type of person to let reality interrupt a good rant, so the disclaimer sits here at the end.</i>)</p>
<h2>In Conclusion</h2>
<p>Now, if you&#8217;ve read all this you might be thinking, &#8216;hey, I&#8217;m really offended by that comment about Albanians. What&#8217;s wrong with this guy?&#8217;. And you&#8217;re right, that was kind of offensive. I&#8217;m sorry.</p>
<p>You also might be thinking: &#8216;Wow, this is a really negative perspective on things. Can life really be that bad writing JavaScript? I wrote a webpage once, and it was pretty okay. Google writes whole applications in it and they seem to be making tons of money&#8217;. You&#8217;re also right! Maybe not as right as that other guy, but hey. I said I&#8217;m sorry.</p>
<p>These problems are not insurmountable. In my particular case, since I&#8217;m writing a compiler, instead of porting by hand or writing JS from scratch, I can solve these problems using verifiable code, instead of trying to get it right in my head. Despite this, fixing some of these problems involves writing some pretty hairy code &#8211; and if you&#8217;re like me and your Computer Science background is a little &#8211; <i>let&#8217;s be generous here and call it &#8216;weak&#8217;</i> &#8211; you may find things like performing escape analysis on functions containing <tt>goto</tt> statements a tiny bit daunting. </p>
<p>When I finally got my translator working on some real-world game demos after a month or two of hacking, I was really excited; the framerate was bad, but I hadn&#8217;t done any optimization, so that was to be expected. When I finally ran a demo through a profiler, though, my heart sank a little: Wait, I&#8217;m spending 35% of my CPU time in the <i>garbage collector</i>? And another 20% running <i>the constructor for <tt>Vector3</tt>?</i> I realized that while I had anticipated the challenges in translating working code into another language, I had not anticipated the challenges involved in translating <i>performant code</i> from one language into <i>performant code in another language</i>. So, I hope that these few examples I&#8217;ve provided might give you a little insight.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/code/2011/06/18/performance-challenges-in-compiling-code-to-javascript/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Compiler-assisted Data Binding with LINQ</title>
		<link>http://www.luminance.org/blog/code/2010/04/27/compiler-assisted-data-binding-with-linq</link>
		<comments>http://www.luminance.org/blog/code/2010/04/27/compiler-assisted-data-binding-with-linq#comments</comments>
		<pubDate>Wed, 28 Apr 2010 07:33:05 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[JSON]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=866</guid>
		<description><![CDATA[When trying to write reliable, maintainable software, it&#8217;s important to try and minimize duplication. When you find yourself writing the same magic number in multiple places, you move it into a named constant to eliminate the duplication. When you find yourself writing the same expression multiple times, you move it into a named function, or [...]]]></description>
			<content:encoded><![CDATA[<p>When trying to write reliable, maintainable software, it&#8217;s important to try and minimize duplication. When you find yourself writing the same magic number in multiple places, you move it into a named constant to eliminate the duplication. When you find yourself writing the same expression multiple times, you move it into a named function, or perhaps a property. Sometimes, you find yourself dealing with higher level duplication &#8211; entire concepts and patterns that you find yourself writing again and again. Many modern languages provide tools to help you eliminate this kind of duplication: class inheritance allows you to share common logic between classes by inheriting that logic from a parent class, and generic types allow you to apply a generic pattern to multiple individual types. Both of these tools work with the aid of the compiler, so they interact well with debugging tools and allow you to catch most errors at compile time. Sometimes, though, you run into duplication that can&#8217;t easily be eliminated, even with the aid of the compiler.</p>
<p>In many graphical applications, a common pattern is the need to remember user preferences or inputs. Modern languages provide useful tools that can make this task simpler &#8211; for example, both Java and C# provide ways to automatically serialize an entire data structure into XML, which eliminates the need to manually read/write your preference values. Unfortunately, even with the aid of these features, you still find yourself with a lot of duplication &#8211; even if the runtime can automatically serialize your data structure, you still have to fill the structure out with your preferences, or read them back in manually. I&#8217;m going to demonstrate how you can use a little-known aspect of the new LINQ feature in C# 3.5 to eliminate duplication with the aid of the compiler.</p>
<p><a rel="attachment wp-att-869" href="http://www.luminance.org/wp-content/uploads/2010/04/PreferencesExample1.png"><img class="aligncenter size-full wp-image-869" title="Preferences Example Screenshot" src="http://www.luminance.org/wp-content/uploads/2010/04/PreferencesExample1.png" alt="" width="329" height="274" /></a></p>
<p>As an example, we&#8217;ll be using the simple application shown above. It&#8217;s a Windows Forms dialog box, with a few different controls, set up to remember user inputs between sessions. You can download the source code for this application below:</p>
<p><a href="http://luminance.org/articles/PreferencesExample1.zip">Preferences Example (v1)</a></p>
<p>If you run the application, input some values, and click OK, you&#8217;ll find that it stores your inputs in a JSON file in the %AppData%\PreferencesExample folder. If you run it again, you&#8217;ll see that it pulls your inputs back out of the JSON file to populate the UI.</p>
<p><span id="more-866"></span></p>
<p>Let&#8217;s take a look at the relevant parts of the source code:</p>
<pre>public void LoadPreferences () {
  if (!File.Exists(GetPrefsPath()))
    return;

  var serializer = new JavaScriptSerializer();
  var preferences = serializer.Deserialize&lt;Dictionary&lt;string, object&gt;&gt;(File.ReadAllText(GetPrefsPath()));

  checkBox1.Checked = (bool)preferences["checkBox1"];
  radioButton1.Checked = (bool)preferences["radioButton1"];
  radioButton2.Checked = (bool)preferences["radioButton2"];

  listBox1.SelectedIndices.Clear();
  var indices = preferences["listBox1"] as ArrayList;
  foreach (var index in indices)
    listBox1.SelectedIndices.Add((int)index);

  textBox1.Text = (string)preferences["textBox1"];
  dateTimePicker1.Value = (DateTime)preferences["dateTimePicker1"];
}

public void SavePreferences () {
  var preferences = new Dictionary&lt;string, object&gt;();

  preferences["checkBox1"] = checkBox1.Checked;
  preferences["radioButton1"] = radioButton1.Checked;
  preferences["radioButton2"] = radioButton2.Checked;
  preferences["listBox1"] = listBox1.SelectedIndices.Cast&lt;int&gt;().ToArray();
  preferences["textBox1"] = textBox1.Text;
  preferences["dateTimePicker1"] = dateTimePicker1.Value;

  if (!Directory.Exists(Path.GetDirectoryName(GetPrefsPath())))
    Directory.CreateDirectory(Path.GetDirectoryName(GetPrefsPath()));

  var serializer = new JavaScriptSerializer();
  File.WriteAllText(GetPrefsPath(), serializer.Serialize(preferences));
}
</pre>
<p>This application is relatively small &#8211; in particular, the JavaScriptSerializer handles a lot of the work involved in storing preferences for us. But regardless, we find ourselves having to list out all the control names multiple times, and some of those references to the controls are strings. Since they&#8217;re strings, that means that automatic refactoring tools, like the Rename tool in Visual Studio, won&#8217;t find them. As a result, this sort of code becomes difficult to maintain, especially in a larger codebase &#8211; changes are extremely error-prone and require careful, manual work.</p>
<p>What we want is a way to eliminate this duplication &#8211; a way to pull the list of controls and values out and store them in one place, so that we don&#8217;t have to specify them multiple times. Unfortunately, there&#8217;s no obvious way to do this in either Java or C#. While you can add the controls to a list quite easily, and walk over the list to get control names &#8211; eliminating part of the duplication &#8211; there&#8217;s no clean way to specify the particular fields/properties you wish to store.</p>
<p>Those of you familiar with reflection techniques may realize that you can eliminate the duplication by using reflection. By specifying a control and the name of the field we care about, we can use reflection to find that field and fetch its value. This technique will work, and other than the performance overhead of reflection, it will work well enough to ship in an application. However, it still suffers from the downside of breaking automated refactoring tools, and it&#8217;s somewhat error-prone due to the complexity involved in finding fields/properties via reflection.</p>
<p>One of the new features in C# 3.5 is support for &#8216;<a href="http://msdn.microsoft.com/en-us/library/bb397951.aspx" target="_blank">Expression Trees</a>&#8216;. Expression trees allow you to convert a C# expression into a tree of objects that describe the expression and allow you to evaluate it. This feature is used to support LINQ &#8211; for example, when you write &#8216;where i &lt; 5&#8242; in a LINQ query, the &#8216;i &lt; 5&#8242; portion of the query is turned into an expression tree, that LINQ can then use to run the query &#8211; for example, by turning it into SQL. As it happens, we can use this feature to solve our problem!</p>
<p>In C# 3.5, virtually any expression we can write can be converted into a delegate using lambda syntax, like so:</p>
<pre>Func&lt;int, int&gt; func = (x) =&gt; x * 5;</pre>
<p>And, as part of the Expression Tree feature, we can convert that lambda into an expression tree, at compile time:</p>
<pre>Expression&lt;Func&lt;int, int&gt;&gt; expr = (x) =&gt; x * 5;</pre>
<p>The compiler provides us all the information we need to evaluate an expression within the expression tree &#8211; if the expression references a field, the expression tree will contain the object containing the field, along with the FieldInfo object representing the field. Using this knowledge, we can eliminate the duplication from our sample application: By using a single expression to represent each preference we want to store, we can list all of our preferences in a single place in our application, and use that list of expressions to both load and save preference values. Best of all, because the compiler gives us full information on the expressions, we know the exact data types involved, and we can find out the name of the field being stored, and even the name of the object containing the field &#8211; eliminating the need to name each preference manually.</p>
<p>Using this knowledge, we can write a simple helper class that represents a field or property reference, and construct instances of that class by passing it an expression. You can find the source code to the class here:<br />
<a href="http://code.google.com/p/fracture/source/browse/trunk/Squared/Util/Bind.cs">http://code.google.com/p/fracture/source/browse/trunk/Squared/Util/Bind.cs</a><br />
And we&#8217;ll be using it to eliminate the duplication from our sample application. The code is relatively small &#8211; a couple hundred lines &#8211; so by reading it you can easily see how to apply this technique for your own purposes, even if you don&#8217;t end up using my code.</p>
<p>The first step is to use expressions to build a list of all the values we want to store. We&#8217;ll do this by creating an array of bound members in the dialog box&#8217;s constructor:</p>
<pre>IBoundMember[] BoundMembers;

public MainDialog () {
  InitializeComponent();

  BoundMembers = new IBoundMember[] {
    BoundMember.New(() =&gt; checkBox1.Checked),
    BoundMember.New(() =&gt; radioButton1.Checked),
    BoundMember.New(() =&gt; radioButton2.Checked),
    BoundMember.New(() =&gt; listBox1.SelectedIndices),
    BoundMember.New(() =&gt; textBox1.Text),
    BoundMember.New(() =&gt; dateTimePicker1.Value)
  };
}
</pre>
<p>Note that all we have to do is create an expression that evaluates to the value we wish to store. The C# compiler will convert it into an expression tree that tells us which object contains the value, and the FieldInfo or PropertyInfo we can use to fetch the value.</p>
<p>To eliminate the need to specify the name of each preference, we can combine the name of the field/property along with the name of the control containing the field/property, like so:</p>
<pre>string GetMemberName (IBoundMember member) {
  return String.Format("{0}.{1}", ((Control)member.Target).Name, member.Name);
}
</pre>
<p>If we specify the Checked property of a RadioButton named radioButton2, this function will evaluate to &#8216;radioButton2.Checked&#8217;.</p>
<p>With these two pieces of functionality, we can now eliminate all the duplication from the old LoadPreferences and SavePreferences functions:</p>
<pre>public void LoadPreferences () {
  if (!File.Exists(GetPrefsPath()))
    return;

  var serializer = new JavaScriptSerializer();
  var preferences = serializer.Deserialize&lt;Dictionary&lt;string, object&gt;&gt;(File.ReadAllText(GetPrefsPath()));

  foreach (var bm in BoundMembers)
    bm.Value = preferences[GetMemberName(bm)];
}

public void SavePreferences () {
  var preferences = new Dictionary&lt;string, object&gt;();

  foreach (var bm in BoundMembers)
    preferences[GetMemberName(bm)] = bm.Value;

  if (!Directory.Exists(Path.GetDirectoryName(GetPrefsPath())))
    Directory.CreateDirectory(Path.GetDirectoryName(GetPrefsPath()));

  var serializer = new JavaScriptSerializer();
  File.WriteAllText(GetPrefsPath(), serializer.Serialize(preferences));
}</pre>
<p>Another thing you&#8217;ll notice is that the type casting from the original version is gone &#8211; since we have type information, we can automatically cast preference values to the appropriate type &#8211; and if we were using a strongly typed datastore, instead of JSON, we could actually store preferences directly in their correct type, without having to do any boxing or type casting.</p>
<p>If you download the source code for the revised example:<br />
<a href="http://luminance.org/articles/PreferencesExample2.zip">Preferences Example (v2)</a><br />
You can run it and see that while it works the first time, and correctly saves preferences to JSON, it fails when loading preferences back from JSON. This turns out to be because of the JSON serializer: While listBox1.SelectedIndices is of type SelectedIndexCollection, the list we get back from the JSON serializer is of type ArrayList. The two types aren&#8217;t convertible, so the application fails.</p>
<p>Luckily, we can easily solve this problem. Since this technique works for any field or property, we can simply define a property that handles type conversion so that we don&#8217;t get an error when trying to load the preference value from JSON, like this:</p>
<pre>// This has to be ArrayList since that's what we get back from the JSON serializer
ArrayList ListBox1_SelectedIndices {
  get {
    var result = new ArrayList();
    foreach (var index in listBox1.SelectedIndices)
      result.Add(index);
    return result;
  }
  set {
    listBox1.SelectedIndices.Clear();
    foreach (var index in value)
      listBox1.SelectedIndices.Add((int)index);
  }
}</pre>
<p>If we change the list in the dialog box constructor to reference this new property instead of referencing the listbox directly, we can run the application and it will now successfully load and save preferences.<br />
<a href="http://luminance.org/articles/PreferencesExample3.zip">Preferences Example (v3)</a></p>
<p>With this technique, you can easily handle automatically loading and saving values from almost any datastore &#8211; and do so efficiently, without any unnecessary duplication, thanks to the information we&#8217;re given by the compiler. As an example, here&#8217;s a simple implementation of an object that loads and saves preferences from a database using this technique:<br />
<a href="http://code.google.com/p/fracture/source/browse/trunk/Squared/TaskLib/Data/PropertySerializer.cs">http://code.google.com/p/fracture/source/browse/trunk/Squared/TaskLib/Data/PropertySerializer.cs</a></p>
<p>I hope this post has shown you something useful! In the future I&#8217;ll be showing some other interesting applications of this technique.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/code/2010/04/27/compiler-assisted-data-binding-with-linq/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>A managed WebKit library: BerkeliumSharp</title>
		<link>http://www.luminance.org/blog/code/2010/02/21/a-managed-webkit-library-berkeliumsharp</link>
		<comments>http://www.luminance.org/blog/code/2010/02/21/a-managed-webkit-library-berkeliumsharp#comments</comments>
		<pubDate>Mon, 22 Feb 2010 03:54:46 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[berkelium]]></category>
		<category><![CDATA[berkeliumsharp]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[webkit]]></category>
		<category><![CDATA[windows forms]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=852</guid>
		<description><![CDATA[I spent the past day or so hacking together a managed wrapper for Sirikata&#8217;s Berkelium library. Berkelium allows you to easily embed a WebKit-based browser into games and other applications. It&#8217;s based on Chrome and it&#8217;s really easy to get up and running in a C++ application. Unfortunately, if you&#8217;re using C# or VB.net, you&#8217;re [...]]]></description>
			<content:encoded><![CDATA[<p>I spent the past day or so hacking together a managed wrapper for <a href="http://www.sirikata.com/blog/?p=115">Sirikata&#8217;s Berkelium library</a>. Berkelium allows you to easily embed a WebKit-based browser into games and other applications. It&#8217;s based on Chrome and it&#8217;s really easy to get up and running in a C++ application. Unfortunately, if you&#8217;re using C# or VB.net, you&#8217;re out of luck &#8211; no way to link directly against a C++ .lib file in those languages. The addition of my managed wrapper &#8211; <a href="http://code.google.com/p/berkelium-sharp/">BerkeliumSharp</a> &#8211; means that you can use the library in managed applications, and integrate it with Windows Forms, XNA, or even WPF.</p>
<p><a href="http://www.luminance.org/wp-content/uploads/2010/02/berkeliumtests.png" rel="attachment wp-att-853"><img src="http://www.luminance.org/wp-content/uploads/2010/02/berkeliumtests.png" alt="" title="berkelium test screenshots" width="633" height="494" class="aligncenter size-full wp-image-853" /></a></p>
<p>I&#8217;ve released the source under the BSD license (just like Berkelium) and included two simple examples (one for Windows Forms, one for XNA). It&#8217;s not a Chrome competitor but it&#8217;s surprisingly easy to get a lot of complicated things working &#8211; you can watch Hulu videos if you have Flash installed, and Flash games like Dino Run work in the Windows Forms example since it implements keyboard input.</p>
<p>You can <a href="http://berkelium-sharp.googlecode.com/files/BerkeliumSharpDemos.zip">download pre-built demos</a> to test it out, or <a href="http://code.google.com/p/berkelium-sharp/source/checkout">grab the source code</a> over at Google Code.</p>
<p>Have fun!</p>
<p><del datetime="2010-02-23T12:41:56+00:00">P.S. If you try out the examples, be aware that content that opens pop-up windows doesn&#8217;t seem to work. I think this is a bug in Berkelium.</del><br />
<b>Edit:</b> Figured out how to build Chromium and Berkelium myself and fixed the bug. Open source is awesome!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/code/2010/02/21/a-managed-webkit-library-berkeliumsharp/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Achievements and player data II</title>
		<link>http://www.luminance.org/blog/gruedorf/2009/09/03/achievements-and-player-data-ii</link>
		<comments>http://www.luminance.org/blog/gruedorf/2009/09/03/achievements-and-player-data-ii#comments</comments>
		<pubDate>Thu, 03 Sep 2009 12:51:37 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Gruedorf]]></category>
		<category><![CDATA[achievements]]></category>
		<category><![CDATA[analysis]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[heatmap]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=824</guid>
		<description><![CDATA[In my previous post I gave an introduction to achievements and player data collection. In this post, I&#8217;ll cover the remaining two significant pieces: Services and front-ends. Unfortunately neither of these will be quite as complete as the coverage in the previous post, since I haven&#8217;t completely finished implementing these parts of my achievement system. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.luminance.org/gruedorf/2009/08/28/achievements-and-player-data-i">In my previous post</a> I gave an introduction to achievements and player data collection. In this post, I&#8217;ll cover the remaining two significant pieces: Services and front-ends. Unfortunately neither of these will be quite as complete as the coverage in the previous post, since I haven&#8217;t completely finished implementing these parts of my achievement system. Whoops!</p>
<h2>Services</h2>
<p>Boy, that&#8217;s a generic heading. Anyway, so your game is collecting important data on gameplay events, and it&#8217;s reporting that data periodically to a web service on your server. Unfortunately, since you haven&#8217;t actually written that service yet, it doesn&#8217;t seem to be working. Odd how that goes, isn&#8217;t it?</p>
<p>The primary issue you have to deal with when building a service to recieve collected data from your game is storing the data. There are other incidental issues &#8211; security, performance, serialization, etc &#8211; but none of them are of any significance if you can&#8217;t find a way to reliably store and access the data. This isn&#8217;t a simple problem, but there are ways to handle it.</p>
<p>Essentially, the biggest issue you have to confront here is that you are going to have a lot of data. You may not have a lot of data now, but you will eventually. On one hand, you could spend weeks and weeks trying to design the perfect solution for storing all of this data &#8211; but doing that doesn&#8217;t actually get your game any closer to shipping, and doesn&#8217;t actually guarantee that you won&#8217;t have scalability issues down the road. On the other hand, if you completely ignore the problem, you risk losing some of the data you&#8217;ve already gathered by discovering significant design issues after you ship. In practice, you probably want to prioritize shipping over the longevity of your data, since (assuming you ship and your game isn&#8217;t terrible) you can always get more data.</p>
<p>As a starting point, I decided to build my services on Google App Engine, since it was relatively easy to get up and running and provides fairly generous quotas for free.</p>
<p><span id="more-824"></span></p>
<p>I built my services in Python, using the provided datastore and JSON modules to handle most of the work. For those unfamiliar with how App Engine works, essentially your process is this:</p>
<ul>
<li>Modify your app.yaml file to specify the URLs of your services and the python scripts that implement them.</li>
<li>Create one or more Python classes to be used for storing your data in the GAE datastore.</li>
<li>Implement your services by creating python WSGI modules to process incoming requests and store the resulting data in the datastore.</li>
</ul>
<p>For those more familiar with traditional databases, working with the App Engine datastore can be a challenge &#8211; its write performance borders on terrible, and the documentation is somewhat sparse. However, the actual API is very easy to use and since you&#8217;re using Python, most of the problems you&#8217;re dealing with are easy to solve. It helps that most of Django is included with the GAE APIs, since that means you have access to all sorts of useful tools like their HTML template module.</p>
<p>So, for the event format I showed in my previous post, the Python class looks like this:</p>
<pre>class Event(db.Expando):
  playerId = db.IntegerProperty()
  sessionId = db.IntegerProperty()
  timeMs = db.IntegerProperty(indexed=False)
  eventType = db.StringProperty()</pre>
<p>Fairly straightforward. Note that I&#8217;m deriving from <strong>Expando</strong> and not <strong>Model</strong> &#8211; to get an idea of what this means you&#8217;ll need to read the GAE documentation, but essentially this lets me add additional, unindexed fields to my instances as necessary. Since I only plan to do most queries based on event type and player ID, this is perfect.</p>
<p>Given that class definition, in my service, I can simply unpack the JSON I recieve from a game client and convert it into one or more Event instances, ready to send to the datastore:</p>
<pre>      playerId = int(body["PlayerId"])
      sessionId = int(body["SessionId"])
      events = body["Events"]

      put_list = []

      for event in events:
        eventData = event["Data"]
        extraArgs = {}

        while eventData:
          if isinstance(eventData, types.DictType):
            d = eventData
            eventData = None
            for k in d.iterkeys():
              value = d[k]
              if k == "Data":
                eventData = value
              elif isinstance(value, types.DictType):
                continue
              else:
                key = ("%s" % (k,)).encode("ascii")
                extraArgs[key] = value
          else:
            extraArgs["eventData"] = eventData
            eventData = None

        evt = Event(
          playerId=playerId,
          sessionId=sessionId,
          timeMs=event["Time"],
          eventType=event["Type"],
          **extraArgs
        )
        put_list.append(evt)

      db.put(put_list)</pre>
<p>The resulting data format doesn&#8217;t allow you to answer every question you could possibly have, but does leave you with a relatively easy to query volume of data in the google datastore. It&#8217;s also very simple, which makes it relatively straightforward to debug failures and make changes.</p>
<p>As mentioned before, the datastore&#8217;s write performance borders on terrible. If you attempt to perform a <strong>put</strong> on multiple objects in sequence, its write performance goes from bad to earth-shatteringly horrible. However, the datastore API allows you to hand it a list of objects, and it will attempt to put them all at once, which significantly improves your performance so that it&#8217;s at least tolerable. If I were using a relational database like MySQL this would be somewhat equivalent to trying to insert all my rows in a single multi-line query to reduce round-trip time.</p>
<p>Also of note are the somewhat ridiculous contortions I do here to convert event data into fields for the Event instance. Essentially, if the incoming event&#8217;s Data field is just one value, I shove it into a single field inside the Event &#8211; but if it&#8217;s a dictionary, I dig through it looking for values and store them into corresponding fields on the Event instance. This ensures that all the values attached to the event end up with corresponding columns in the datastore.</p>
<p>This also illustrates some slightly interesting design decisions: Events don&#8217;t have any global timestamp, nor do they have a sequence number &#8211; all they have is a player ID, session ID, and timestamp relative to the beginning of the session *in game time*. This is mostly a pragmatic decision; I could provide a global timestamp and get some benefits out of it, but the costs associated with that are quite significant, since accurate timestamps interact badly with batching and the general problem of internet latency.</p>
<p>One particularly nasty sticking point is that GAE has fairly rigid limits on how much CPU and &#8216;API CPU&#8217; time you can consume in a given request, or in a given minute, or in a given hour, or in a given day. These limits are <strong>extremely</strong> easy to hit if you are using the datastore in the manner I am &#8211; so it&#8217;s important to make sure that your game isn&#8217;t sending large batches, or your requests will time out and google will become very angry with you for wasting precious CPU milliseconds. In practice, I&#8217;ve found that batch sizes between 6 and 12 reduce network traffic without hitting the built-in GAE limits. Your mileage may vary based on the nature of your data.</p>
<p>It&#8217;s also worth pointing out that the HistoryBlock approach I described in the previous approach is a bit problematic here: You&#8217;re basically forced to store all those position values within a single event, because turning them into multiple events would absolutely destroy the datastore. Unfortunately, it appears that storing a long list of values within a single event <strong>also</strong> absolutely destroys the datastore. Oh well, what can you do? (Other than switch to another hosting provider)</p>
<p>Also note that this doesn&#8217;t account for security, which means you probably can&#8217;t deploy it in production, because people like breaking your services. Oh well!</p>
<p>Now that we&#8217;re all familiar with how frustrating web service development is, let&#8217;s venture into the comforting realm of data analysis:</p>
<h2>Presenting Your Data (Front-ends)</h2>
<p>Mmm, much better.</p>
<p>Now that you&#8217;ve got all this data sitting around in the GAE datastore, what are you going to do with it?</p>
<p>Among the many things you can do, here are a few good ideas:</p>
<ul>
<li>You can perform high level queries against your event data to generate general &#8216;gameplay statistics&#8217; for player profiles.</li>
<li>You can perform statistical analysis of your event data to detect patterns in usage and player behavior.</li>
<li>You can take the position values attached to your event data, and use it to generate heatmaps representing certain events or behaviors &#8211; player movement, player death, creature death, etc.</li>
</ul>
<p>Since I&#8217;m uneducated, I&#8217;m going to skip the statistical analysis and describe the other two.</p>
<p>Creating gameplay statistics from your data is actually relatively easy, as long as you&#8217;re not worried about performance (and right now, you probably shouldn&#8217;t be). Even if performance is an issue, you can often solve this easily by track counters and statistics in a summary table, either by maintaining a count in your service when storing events, or by writing a <a href="http://en.wikipedia.org/wiki/Cron">cron job</a> to periodically update your summaries from the most recently stored events. Doing this will allow you to maintain statistics without having to query your entire event history.</p>
<p>For example, given my event format, I can determine how many times a given player has killed the Drowned Queen by querying the datastore like so:</p>
<pre>player_events = db.Query(Event).filter(
  'playerId =', playerId
)
drowned_queen_kill_events = player_events.filter(
  'eventType =', 'PlayerKilledCreature'
).filter(
  'CreatureName =', 'DrownedQueen'
)
drowned_queen_kill_count = drowned_queen_kill_events.count()</pre>
<p>Essentially, what I&#8217;m doing here is taking my entire event data set, and iteratively filtering it down &#8211; first I start with the player ID, then I filter by the event type. Both of these columns are indexed, and each of these filters will eliminate a huge number of rows. After this I can filter by CreatureName; as long as I don&#8217;t have thousands of PlayerKilledCreature events this will be relatively cheap to do. After that it&#8217;s simple to ask the datastore how many events match my filter.</p>
<p>Given statistics like these, if you choose you can then come up with achievements and other information to display on a player&#8217;s profile page. Players tend to love these things, even though they&#8217;re not directly integral to a game experience. They give players a way to gauge their own skill at a game versus others, and also provide them with interesting &#8216;carrots&#8217; to run after, whether it&#8217;s finding all the secrets in a game or defeating a boss without taking any damage.</p>
<p>So! Now for <a href="http://en.wikipedia.org/wiki/Heat_map">heat maps</a>. If you&#8217;re not familiar with them, you might want to glance at the linked Wikipedia page, but they&#8217;re fairly easy to understand, at least conceptually. You essentially take a large volume of data (in our case, events) and use it to generate a bitmap that you can overlay on an image of a space that you care about. To give a real-world example, if you had a list of recent car accidents, you could generate a heat map from that list and overlay it on a map of your neighborhood, and possibly see clusters around particularly dangerous intersections. You can&#8217;t always rely on a heat map for drawing conclusions, but they make it much easier to spot patterns and trends because our brains are great at analyzing data when it&#8217;s presented in this format.</p>
<p>In my case, I want to take all that HistoryBlock data and convert it into a heat map, so I can figure out where players are spending most of their time. To do this, first I needed to get images of all my levels &#8211; this took some work, since I hadn&#8217;t previously done any offline rendering of my game content. In some cases you can do this sort of thing offline during your build process, but in my case since my renderer relies on Direct3D and XNA, I simply start up an instance of the game engine in a &#8216;batch processing mode&#8217;, and it scans through a level, using the 3D card to generate screen-size &#8217;tiles&#8217; of the level, one at a time, and save them out to disk. After that I scan through the tiles and scale them down to create a &#8216;minimap&#8217; that represents the level at a given magnification.</p>
<p>Once I&#8217;ve got images for each of the levels, I can begin to generate a heat map for them. First, I query a service that pulls down all of the HistoryBlock events from the server and returns them as JSON. This sort of thing is likely to have scalability issues, so in practice you might want to only pull down a subset of your events &#8211; the most recent ones, or a random sampling &#8211; and use them instead. Right now my dataset is small enough that this isn&#8217;t a problem.</p>
<p>Once I&#8217;ve got the list of positions, I can scan over them and create the heat map. Essentially, what you want to do is create a 2D bitmap that is roughly the same size as your minimap, or some even multiple of it. Then, you can through all your positions and map them to points within that bitmap. Every time you successfully map a position to a point, you increment the value at that point, so that the most frequently reported locations have higher values.</p>
<p>Once you&#8217;ve done that, you can compute a minimum, maximum, etc. for the heat map, and use that to translate those &#8216;heat&#8217; values into colors at each point. Then, all you have to do layer the resulting color bitmap onto your mini map, and you have a heat map. Here&#8217;s a few ones I just generated, based on the events I&#8217;ve been recording while testing out my services and achievement system. You may need to click on them to view them at full size:</p>
<p style="text-align: center;"><a href="http://www.luminance.org/wp-content/uploads/2009/09/troupe.png"><img class="aligncenter size-full wp-image-831" title="troupe" src="http://www.luminance.org/wp-content/uploads/2009/09/troupe.png" alt="troupe" width="778" height="185" /></a></p>
<p style="text-align: center;">This heat map was generated from a dozen or so play-throughs of the first level in the Level Up 2009 demo.</p>
<p style="text-align: left;">There are a few interesting conclusions you can draw from this heatmap &#8211; for example, you can easily spot the locations of switches/cranks, because those points are orange or red (from the player tending to stand in front of them to manipulate the object). Because of the short number of playthroughs, you can actually see faint traces of me dying by falling into the water.</p>
<p style="text-align: left;">The data also gives you a general idea of typical paths through the level, and shows you where players spend more time &#8211; for example, the ledge on the right side of the water is much brighter, because the player tends to stand there for a while fighting the monsters that are spawned there.</p>
<p style="text-align: left;">This presents some good opportunities to improve the flow of the level, address difficult platforming challenges, or make it easier for the player to find objectives (keen-eyed observers will note that there&#8217;s a secret passage in this level that I did not enter in any of my playthroughs. (: )</p>
<p style="text-align: center;"><a href="http://www.luminance.org/wp-content/uploads/2009/09/drowned_queen_arena.png"><img class="aligncenter size-full wp-image-830" title="drowned_queen_arena" src="http://www.luminance.org/wp-content/uploads/2009/09/drowned_queen_arena.png" alt="drowned_queen_arena" width="332" height="332" /></a></p>
<p style="text-align: left;">This one was generated from the small arena in which the player fights the boss from the demo, the Drowned Queen.</p>
<p style="text-align: left;">Even a quick glance at this heat map reveals some interesting patterns, despite the fact that it is based on a small amount of data.</p>
<p style="text-align: left;">I rarely died from falling into the water below, which indicates that the water is not particularly effective as a hazard (or that I&#8217;m particularly adept at avoiding it).</p>
<p style="text-align: left;">The extremely bright clusters to the left side indicate that I rarely moved around the arena while fighting the Queen, tending to instead dart back and forth within the same area. This might indicate problems with the design of the level or the boss, since you would usually expect players to be running around in an arena like this while fighting a well-designed foe.</p>
<p style="text-align: left;">The big bright red point up in the top left is aligned perfectly with one of the arena&#8217;s grip plates. While you&#8217;re supposed to use the grip plates to avoid one of the Queen&#8217;s special attacks, the huge amount of time spent there suggests that the boss&#8217;s AI is leading me to remain on the plate for a long period of time, looking for a safe opportunity to drop down, instead of actively fighting her and having a good time.</p>
<p style="text-align: left;">Keen-eyed viewers who&#8217;ve played the demo will also note that there are yellowish regions at each of the locations where a dialogue sequence occurs. This indicates that I tend to stand still while progressing through the dialogue sequence, despite the fact that the player is allowed to move freely. Interesting!</p>
<p style="text-align: center;"><a href="http://www.luminance.org/wp-content/uploads/2009/09/aqueduct.png"><img class="aligncenter size-full wp-image-829" title="aqueduct" src="http://www.luminance.org/wp-content/uploads/2009/09/aqueduct.png" alt="aqueduct" width="695" height="302" /></a></p>
<p style="text-align: center;">This final one is generated from the second level in the demo, the aqueducts.</p>
<p style="text-align: left;">Rather embarassingly, this demonstrates the perils of trying to draw conclusions from player data: Almost all the points in this heatmap are barely visible.</p>
<p style="text-align: left;">Why? Well, most likely, I left the game running with the player standing in that position for a long time, which resulted in that point being far, far brighter than the rest of the level.</p>
<p style="text-align: left;">Of course, there are ways to address these sorts of problems with your data &#8211; but if you&#8217;re not careful, they may influence your conclusions without you even realizing it. In this case I would probably want to discard or ignore any points that have values vastly out of whack compared to the rest of the heat map, so that the heat map will demonstrate general trends instead of only showing outliers.</p>
<p style="text-align: left;">
<p style="text-align: left;">I hope these posts have given you an idea of how you can go about gathering player data in your games, and how you can put that data to work &#8211; both towards improving your game, and giving your players access to data they want.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/gruedorf/2009/09/03/achievements-and-player-data-ii/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Achievements and player data I</title>
		<link>http://www.luminance.org/blog/gruedorf/2009/08/28/achievements-and-player-data-i</link>
		<comments>http://www.luminance.org/blog/gruedorf/2009/08/28/achievements-and-player-data-i#comments</comments>
		<pubDate>Fri, 28 Aug 2009 09:35:37 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gruedorf]]></category>
		<category><![CDATA[achievements]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[data]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=814</guid>
		<description><![CDATA[One of the things I&#8217;ve been working on lately is a way to collect and store data on play sessions, so I can track achievements for players and track where players spend the most time in a level, or where they die the most. There are lots of details to get right for a system [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things I&#8217;ve been working on lately is a way to collect and store data on play sessions, so I can track achievements for players and track where players spend the most time in a level, or where they die the most. There are lots of details to get right for a system like this, but I&#8217;ve at least gotten a prototype working and started experimenting with ways to visualize the data.</p>
<p>For a system like this you have a few important pieces:</p>
<ul>
<li>Your game needs to collect data during play sessions &#8211; in my case, I track important events like player/creature death, and periodically sample the player&#8217;s position to get a general idea of where players are in a given level during their session.</li>
<li>You need a way for your game to periodically report collected data to a remote server. You have to handle lots of edge cases here &#8211; for example, it&#8217;s likely some people will play without an active internet connection or suffer temporary loss of connection, so you need to batch up events to report later in this case &#8211; you definitely don&#8217;t want the game to fall over and choke without access to the internet, and if possible you want to avoid losing data too.</li>
<li>You need to build a set of services to collect data from the game. This typically means you also need services to handle things like uniquely identifying individual play sessions and computers, so that you can track achievements for individual players and perform analysis on individual sessions instead of only on a player&#8217;s entire play history.</li>
<li>You need to build an in-game frontend, to expose collected data to a player. This means turning your event data into user-friendly statistics &#8211; like a kill counter, or an achievement for killing a particular boss. One interesting challenge here is that you probably want to expose this information online, too, so that players can share their profiles and achievements.</li>
</ul>
<p>In this post, I&#8217;m going to cover the first two.</p>
<p><span id="more-814"></span></p>
<h2>Collecting Data</h2>
<p>So, first, you need a way to collect important player data. For it to be useful, you need to collect it in as consistent a format as possible; you don&#8217;t want every piece of data to have a unique set of parameters attached to it, for example, because that would make it impossible to perform any generic analysis of your data. Likewise, you want to try and keep your data &#8216;denormalized&#8217;, by storing as much relevant data together as possible. If you achieve both of these goals, you end up with a stream of &#8216;events&#8217; that represent the things you care about in a form that lets you inspect them individually or analyze them in large groups.</p>
<p>In my case, this step was actually quite straightforward. I already had a simple &#8216;event bus&#8217; integrated into the game, that I was previously using to synchronize animation and sound effects with gameplay. Given this, it was simple to create a data collector that attaches to the event bus and listens for events that it wants to collect.</p>
<p>I did, however, have to make some changes &#8211; many of my events didn&#8217;t expose the information necessary to be useful; for example, the event representing a player death didn&#8217;t contain any information to tell you who (or what) killed the player, so I had to tweak the game code to attach that to the event. Likewise, many other events didn&#8217;t include position information, which made it hard to get meaningful information about them &#8211; knowing that the player grabbed onto a ledge isn&#8217;t particularly useful if you don&#8217;t know *where* or *which ledge*. In some cases, the data collector attached important parameters into the events so that game objects wouldn&#8217;t have to; for example any event coming from the Player automatically has PlayerX and PlayerY parameters attached to it (since the Player is the source of the event, it is simple to extract a position and attach it to the event).</p>
<p>One thing that required some special treatment as well was recording the player&#8217;s position over time &#8211; while attaching position information to events gives you a general idea of the player&#8217;s location, it&#8217;s not very useful for figuring out where players are getting stuck or confused. To address this, I built a simple class that periodically samples the player&#8217;s position and adds it to a list. Every time the list reaches a certain size, its contents are batched up into a single event &#8211; a &#8216;HistoryBatch&#8217; &#8211; and sent to the data collector. This allows me to get fairly high-resolution position data without having to report hundreds of individual events every minute (which would have contained lots and lots of redundant information).</p>
<h2>Reporting Data</h2>
<p>Once you have your player data, you need to report it to your server (and probably store some of it locally, too). I honestly haven&#8217;t tackled the latter part yet, but here&#8217;s how I handled the former:</p>
<p>To handle periodically reporting events, I created a simple &#8216;Event Reporter&#8217; class that collaborates with the data collector. Essentially, the event reporter maintains a queue of pending events, and runs a thread that is responsible for sending batches of events to the remote server once the queue gets large enough. It automatically waits a certain amount of time between requests, and attempts to batch events into groups instead of reporting them one at a time as they occur. This allows me to get relatively low latency (if I want it) but still remain relatively efficient in my use of the network. Whenever the data collector gets an event, it adds it to the event reporter&#8217;s queue.</p>
<p>Once I have a batch of events ready to send to the server, I pack them together into a class that&#8217;s laid out optimally for network transmission. I then use .NET 3.5&#8242;s built in JSON serializer to convert the batch into a blob of JSON data ready to send to my remote server. A typical blob looks like this:</p>
<pre>{
  "PlayerId":xxxx,
  "SessionId":yyyy,
  "Events":[
    {"Type":"ActiveControllerChanged","Time":0,"Data":{
      "IsKeyboard":true,
      "ConnectedGamepads":0,
      "ActiveController":0
    }},
    {"Type":"LevelLoaded","Time":5436,"Data":"troupe"},
    {"Type":"HistoryBlock","Time":7788,"Data":{
      "LevelName":"troupe",
      "PlayerX":[-136,-74,35,192,209,209],
      "PlayerY":[588,875,920,920,920,920]
    }}
  ]
}</pre>
<p>As you can see, events are small when possible &#8211; they simply store the event type and the timestamp at which the event occurred, along with their associated information. In cases where an event has lots of information attached, I send a dictionary, but in some cases I can just send a single value. In the case of a history block, I make sure to send the X and Y coordinates as individual lists, so that I don&#8217;t have to waste time encoding &#8216;PlayerX&#8217; and &#8216;PlayerY&#8217; along with every individual coordinate. A batch of events has a player ID and a session ID attached, which allows me to analyze individual play sessions and track achievements. (Note that both of these IDs are randomly generated on the server, so they&#8217;re anonymous.)</p>
<p>The reporter starts an HTTP POST to send the JSON to the server, and goes to sleep until it&#8217;s finished. If the send fails, the events are left on the queue and the thread sleeps for a while so it can retry sending them later. Once a send completes, the reporter checks to see if the queue is empty &#8211; if the queue is now empty, it goes to sleep until the queue contains items again. If the queue still contains items, it sleeps for a short while and prepares to send another batch &#8211; this allows the event reporter to spend the majority of its time asleep, but still handle large bursts of events without sending a huge blob of events at the server in one POST (since that would be very likely to fail or time out.)</p>
<p>One important detail is that the reporter needs to be able to correctly report events even if the player quits. In my case, the player can quit at any time, and I can end up with a very large number of events in the queue at the time. To deal with this, once the game has finished tearing down, the event reporter is given around 30 seconds to report any remaining events to the server. This usually allows events to get through, but prevents the game from hanging indefinitely on exit (in the event that there&#8217;s some sort of network failure, or the event queue is <strong>really</strong> full). Since this occurs after teardown, the game window is gone so the player doesn&#8217;t get the impression that the game has hung, and since the reporter spends most of its time sleeping, they won&#8217;t see any significant CPU usage either.</p>
<p>The reporter also runs in its own isolated thread and uses its own task scheduler, instead of sharing resources with the game. This increases the likelihood that the game will be able to successfully report events in the case of a bug or crash, and also means that if the reporter fails for some reason &#8211; probably a network outage &#8211; it won&#8217;t take the game down with it.</p>
<p>In my next post, I&#8217;ll cover the remaining two items and show you some of the things you can do once you&#8217;ve gathered player data. In the interim, you can <a href="http://inferus-data.luminance.org/player/view?id=1115">take a look at my player profile</a>!</p>
<hr />
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/gruedorf/2009/08/28/achievements-and-player-data-i/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Updating Onscreen Objects / Profiling</title>
		<link>http://www.luminance.org/blog/gruedorf/2009/08/20/updating-onscreen-objects-profiling</link>
		<comments>http://www.luminance.org/blog/gruedorf/2009/08/20/updating-onscreen-objects-profiling#comments</comments>
		<pubDate>Fri, 21 Aug 2009 04:24:39 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gruedorf]]></category>
		<category><![CDATA[360]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[profiler]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=742</guid>
		<description><![CDATA[One of the problems I started to run into while polishing things up for my contest entry builds was that as my levels grew larger, the game&#8217;s CPU utilization on the 360 steadily grew with them. While PC builds of my game ran smooth on basically all the machines I had access to, on the [...]]]></description>
			<content:encoded><![CDATA[<p>One of the problems I started to run into while polishing things up for my contest entry builds was that as my levels grew larger, the game&#8217;s CPU utilization on the 360 steadily grew with them. While PC builds of my game ran smooth on basically all the machines I had access to, on the 360 the cost of updating all the level&#8217;s objects and entities became quite significant &#8211; most likely due to the 360&#8242;s feeble floating-point performance and lack of out-of-order execution.</p>
<p>The solution to this was, at least to me, relatively obvious: My levels were much larger than the camera, so it didn&#8217;t really make sense to update the entire level every frame.</p>
<p>The first thing I tried to verify this theory was simply hacking it in: Do a check before updating each object to see if it was onscreen. Interestingly, this didn&#8217;t make the game any faster on the 360. Depending on your point of view, this either confirmed or denied my hypothesis: If the problem was simply the cost of all the floating point operations, the cost of doing the onscreen check for each object (since the camera and object bounds were both expressed in floating-point) could have been making the problem worse. Clearly, I didn&#8217;t have enough data to be sure about the right choice to make.</p>
<p>So, I spent a day or so rigging up the necessary infrastructure to be able to profile my game on the 360. Since you can&#8217;t use tools like CLR Profiler or NProf on the 360, I ended up building a very simple frame timing system, and adding an overlay to the game that would show timing data. This let me get a good idea of how much time each subsystem in the game was using, and then I could compare the costs of individual subsystems, and try making changes and seeing how the profile data changed.</p>
<p>Once I had the profiler up and running on the 360, a clear pattern emerged.</p>
<p><a href="http://www.luminance.org/wp-content/uploads/2009/08/01.png"><img class="aligncenter size-full wp-image-745" title="01" src="http://www.luminance.org/wp-content/uploads/2009/08/01.png" alt="01" width="500" height="550" /></a></p>
<p>Updates were consuming a huge amount of CPU time on the 360. While on my desktop, updates basically accounted for no more than 1% of CPU time, on the 360 they actually accounted for more CPU time than rendering &#8211; this was actually a bit of a surprise to me since rendering was definitely the bottleneck at one point on the 360. It seems that at some point along the way, I solved my rendering performance issues on the 360, but didn&#8217;t notice because I had made updates so much more expensive &#8211; one mistake I plan not to repeat was that I went a week or two without testing the game on the 360, since my 360 was not hooked up at the time. During that span of time I made a lot of changes that drastically altered the game&#8217;s performance characteristics, so it was hard to tell what had caused things to degrade.</p>
<p><span id="more-742"></span></p>
<p>Now that I knew updates were expensive, I decided to try and narrow down which object types were the problem. I added profiling markers around specific types of objects, to try and figure out which ones cost the most CPU time to update. After doing that and deploying a few builds to the 360, I found one of my culprits: Water.</p>
<p><a href="http://www.luminance.org/wp-content/uploads/2009/08/04.png"></a><a href="http://www.luminance.org/wp-content/uploads/2009/08/05.png"><img class="aligncenter size-full wp-image-749" title="05" src="http://www.luminance.org/wp-content/uploads/2009/08/05.png" alt="05" width="500" height="550" /></a></p>
<p>While I had suspected that water might be a problem, I was still somewhat surprised by the results; A similar piece of in-game geometry, zones, used similar update code but turned out to have virtually zero update cost at runtime, while water cost a tremendous amount of CPU for very little gameplay impact. The problem turned out to be a subtle difference in how they were implemented.</p>
<p>Zones were inefficient in that every frame, each zone did an obstruction test to see if any entities were inside &#8211; in most cases a zone would be empty, so this was wasted effort. This would have been better implemented by having every entity check for nearby zones, since there are typically far less entities than there are zones. However, in practice this didn&#8217;t turn out to be the problem. The problem was that water built on this logic, and then used it to perform additional work: It did an obstruction test to determine how far the water should fall, and then did another obstruction test to locate any entities inside the water and apply &#8216;flow force&#8217; to them so that the flowing water would push them in a given direction. These two obstruction tests each ended up accounting for a significant portion of the time spent updating the level.</p>
<p>To solve this, I took two steps. First, I reworked zones and water so that they both operated the way I described &#8211; each entity does a check to locate all the zones it&#8217;s within, in a single obstruction test. This reduced the number of obstruction tests I was running every frame by a large amount, and helped reduce CPU usage for water. However, that still wasn&#8217;t enough.</p>
<p>The biggest improvement came from reworking things so that only onscreen objects get updated every frame. Instead of performing a test against every object to see if it&#8217;s onscreen, I decided to build on the partitioning scheme I use for rendering to get a list of onscreen objects, and use that as my list of objects to update. Once I had that working, my performance improved drastically and the game easily ran at 60fps in every part of my levels with CPU to spare.</p>
<p>Of course, doing this introduced bugs. One of the biggest issues is that often you will have important objects just outside the edge of the screen that need to keep updating, like moving platforms or enemies. To solve this, I added two mechanisms:</p>
<p>First, I added a margin around the screen within which objects still continued to update. This meant that an object just barely offscreen would keep updating, and solved the problem of a moving platform or enemy getting left behind as soon as he dropped offscreen.</p>
<p>Second, I built a simple &#8216;update manager&#8217; that maintains a list of all the objects that are currently onscreen. When an object leaves the screen, instead of removing it immediately, the update manager instead sets a timeout, which causes the object to become &#8216;asleep&#8217; within a certain number of frames. As a result, once an object leaves the screen it has a second or two to return to the screen before it falls asleep, which helps with things like moving platforms that are going to move on and off the screen regularly &#8211; since they don&#8217;t spend very long offscreen, they never have a chance to fall asleep.</p>
<p>The update manager also gives me the ability to exclude some objects from updates entirely, by flagging them as &#8216;unable to wake&#8217;, so the update manager knows to never remove them from sleep status. Likewise, it gives me the option to flag objects as &#8216;unable to sleep&#8217; so that they always stay active &#8211; for example, I do this to the player character and his companion to avoid any unintentional bugs that might result from the player remaining offscreen too long (say, during a cinematic).</p>
<p>The update manager has some other benefits, too. Here&#8217;s what it looks like:</p>
<pre>    public class UpdateManager&lt;T&gt;
        where T : class, IUpdateable, IHasBounds {

        public struct Entry {
            public readonly T Object;
            public int WakeCounter;

            public Entry (T obj, int wakeCounter) {
                Object = obj;
                WakeCounter = wakeCounter;
            }
        }

        protected Dictionary&lt;T, bool&gt; _VisibleObjects = new Dictionary&lt;T, bool&gt;(new ReferenceComparer&lt;T&gt;());
        protected UnorderedList&lt;Entry&gt; _Entries = new UnorderedList&lt;Entry&gt;();

        public int SleepTimeout = 30;
        public readonly SpatialCollection&lt;T&gt; Collection;

        public UpdateManager (SpatialCollection&lt;T&gt; collection) {
            Collection = collection;
        }

        public void Update (Bounds liveRegion) {
            using (var e = Collection.GetItemsFromBounds(liveRegion, true))
            while (e.MoveNext()) {
                _VisibleObjects[e.Current.Item] = false;
            }

            Entry currentItem;

            using (var e = _Entries.GetEnumerator())
            while (e.GetNext(out currentItem)) {
                if (!_VisibleObjects.Remove(currentItem.Object)) {
                    // Object not visible

                    if (!currentItem.Object.AllowSleep) {
                        // Object cannot fall asleep
                    } else if (--currentItem.WakeCounter == 0) {
                        // Object fell asleep
                        e.RemoveCurrent();
                        continue;
                    } else {
                        // Object still awake
                        e.SetCurrent(ref currentItem);
                    }
                } else {
                    // Object visible

                    currentItem.WakeCounter = SleepTimeout;
                    e.SetCurrent(ref currentItem);
                }

                currentItem.Object.Update();
            }

            foreach (var newObject in _VisibleObjects.Keys) {
                if (newObject.AllowWake) {
                    _Entries.Add(new Entry(newObject, SleepTimeout));

                    newObject.Update();
                }
            }

            _VisibleObjects.Clear();
        }
    }</pre>
<p>One of the nice things it does in addition to improving performance is that it simplifies my game code &#8211; previously, I had hand-written logic to step through the various object lists (geometry, entities, etc) and update them every frame, and that code differed in subtle ways. The update manager unifies all that, so it kills a lot of duplicated code. Also, by maintaining a unique &#8216;awake objects&#8217; list, it allows me to remove objects from the geometry/entity lists while performing an update, instead of having to wait until the end of the frame, which simplifies some of my entity code as well.</p>
<p>And despite the amount of problems it solves, it ends up actually being quite simple and easy to use. All I have to do to rig up an update manager is point it at a collection of objects and hand it the current camera boundaries every frame.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/gruedorf/2009/08/20/updating-onscreen-objects-profiling/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Supporting alternate keyboard layouts in XNA games</title>
		<link>http://www.luminance.org/blog/gruedorf/2009/08/14/supporting-alternate-keyboard-layouts-in-xna-games</link>
		<comments>http://www.luminance.org/blog/gruedorf/2009/08/14/supporting-alternate-keyboard-layouts-in-xna-games#comments</comments>
		<pubDate>Fri, 14 Aug 2009 20:00:59 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gruedorf]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[input]]></category>
		<category><![CDATA[keyboard]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=733</guid>
		<description><![CDATA[If you support keyboard input in your XNA game, one issue you need to be aware of is alternate keyboard layouts. Due to the way the XNA Framework handles keyboard input, if you create your game while using the QWERTY keyboard layout, and a customer runs your game while using the DVORAK keyboard layout, he [...]]]></description>
			<content:encoded><![CDATA[<p>If you support keyboard input in your XNA game, one issue you need to be aware of is <a href="http://msdn.microsoft.com/en-us/goglobal/bb964651.aspx">alternate keyboard layouts</a>. Due to the way the XNA Framework handles keyboard input, if you create your game while using the QWERTY keyboard layout, and a customer runs your game while using the DVORAK keyboard layout, he will have to press different keys on his keyboard. At first, this might seem logical &#8211; but consider the typical case:</p>
<p>A customer downloads and installs your game. He&#8217;s running it on a Windows PC. He has his keyboard layout set to DVORAK, because he heard it helps reduce wrist strain. His keyboard still has QWERTY labels printed on it, so he presses &#8216;S&#8217; to type an &#8216;O&#8217;.</p>
<p>He starts your game up, and let&#8217;s say the splash screen says &#8216;Press S to continue&#8217;. He presses S on his keyboard.</p>
<p>Nothing happens.</p>
<p>This is because the OS is remapping the S keystroke into an O. For your XNA game to see an S keystroke, he will have to press the semicolon key (;:) instead.</p>
<p>While users with alternate keyboard layouts are a comparative minority compared to people using the QWERTY keyboard layout, that&#8217;s no excuse for ignoring them. As it turns out, the solution to this problem is pretty straightforward.</p>
<p>What you need to do is find a way to map a keystroke in <strong>your</strong> keyboard layout &#8211; let&#8217;s say QWERTY &#8211; to whatever keyboard layout your customer is running at the time. The Win32 API actually makes this quite simple, so as long as you&#8217;re willing to include some P/Invoke code in windows builds of your game, you can accomplish this in a couple dozen lines of code.</p>
<p>To accomplish this, I use the following helper struct:</p>
<pre>uusing System;
using Microsoft.Xna.Framework.Input;
using System.Runtime.InteropServices;

namespace Labyrinth.Framework {
    public struct LocalizedKeyboardState {
        internal enum MAPVK : uint {
            VK_TO_VSC = 0,
            VSC_TO_VK = 1,
            VK_TO_CHAR = 2
        }

        [DllImport("user32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto, SetLastError = true)]
        internal extern static uint MapVirtualKeyEx (uint key, MAPVK mappingType, IntPtr keyboardLayout);
        [DllImport("user32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto, SetLastError = true)]
        internal extern static IntPtr LoadKeyboardLayout (string keyboardLayoutID, uint flags);
        [DllImport("user32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto, SetLastError = true)]
        internal extern static bool UnloadKeyboardLayout (IntPtr handle);
        [DllImport("user32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Auto, SetLastError = true)]
        internal extern static IntPtr GetKeyboardLayout (IntPtr threadId);

        internal const uint KLF_NOTELLSHELL = 0x00000080;

        public struct KeyboardLayout : IDisposable {
            public readonly IntPtr Handle;

            public KeyboardLayout (IntPtr handle) : this() {
                Handle = handle;
            }

            public KeyboardLayout (string keyboardLayoutID)
                : this(LoadKeyboardLayout(keyboardLayoutID, KLF_NOTELLSHELL)) {
            }

            public bool IsDisposed {
                get;
                private set;
            }

            public void Dispose () {
                if (IsDisposed)
                    return;

                UnloadKeyboardLayout(Handle);
                IsDisposed = true;
            }

            public static KeyboardLayout US_English = new KeyboardLayout("00000409");

            public static KeyboardLayout Active {
                get {
                    return new KeyboardLayout(GetKeyboardLayout(IntPtr.Zero));
                }
            }
        }

        public readonly KeyboardState Native;

        public LocalizedKeyboardState (KeyboardState keyboardState) {
            Native = keyboardState;
        }

        public bool IsKeyDown (Keys key, bool isLocalKey) {
            if (!isLocalKey)
                key = USEnglishToLocal(key);

            return Native.IsKeyDown(key);
        }

        public bool IsKeyUp (Keys key, bool isLocalKey) {
            if (!isLocalKey)
                key = USEnglishToLocal(key);

            return Native.IsKeyDown(key);
        }

        public bool IsKeyDown (Keys key) {
            return IsKeyDown(key, false);
        }

        public bool IsKeyUp (Keys key) {
            return IsKeyDown(key, false);
        }

        // Maps a localized character like 'S' to the virtual scan code
        //  for that key on the user's keyboard ('O' in dvorak, for example)
        public static Keys USEnglishToLocal (Keys key) {
            var activeScanCode = MapVirtualKeyEx((uint)key, MAPVK.VK_TO_VSC, KeyboardLayout.US_English.Handle);
            var nativeVirtualCode = MapVirtualKeyEx(activeScanCode, MAPVK.VSC_TO_VK, KeyboardLayout.Active.Handle);

            return (Keys)nativeVirtualCode;
        }
    }
}</pre>
<p>Here&#8217;s how it works: First, at startup, we ask the Win32 API to load up a specific keyboard layout; US English QWERTY. From then on, we can ask the Win32 API to convert a &#8216;virtual key&#8217; from that keyboard layout into a scan code. Once we have a scan code, we can then ask the Win32 API to convert that scan code into the equivalent virtual key for the end-user&#8217;s keyboard layout. Since the XNA Framework uses virtual keys (the Keys enumeration contains virtual key values), this allows us to apply this technique to existing keyboard input code without any significant changes.</p>
<p>So, with this helper struct, you can add support for alternate keyboard layouts like DVORAK with only a couple changes:</p>
<ul>
<li>First, add the helper struct to your game code somewhere so you have access to it.</li>
<li>Replace any uses of the XNA KeyboardState struct with the LocalizedKeyboardState helper struct. If you use some of the more obscure KeyboardState helper methods, you may need to do some work to add them to LocalizedKeyboardState; it only provides IsKeyUp and IsKeyDown.</li>
<li>Figure out whether any of the keys you&#8217;re using should not be remapped based on the current keyboard layout. For example, it&#8217;s common practice for some kinds of games to expose a &#8216;console&#8217; that allows the user to view log messages and enter commands. In a lot of games, you press the tilde (<strong>~</strong>) key to open the console. This is a convenient key since it&#8217;s near the top left corner of a QWERTY keyboard. However, if you allow the keystroke to be remapped to the current layout, non-QWERTY typists will find they have to press some random key on their keyboard to open the console. In this case, you&#8217;ll want to pass a value of <strong><tt>true</tt></strong> for the second, optional parameter to the IsKeyDown/IsKeyUp helper methods:</li>
</ul>
<pre>if (ks.IsKeyDown(Keys.OemTilde, true))
    ShowConsole();</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/gruedorf/2009/08/14/supporting-alternate-keyboard-layouts-in-xna-games/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Constant Binding</title>
		<link>http://www.luminance.org/blog/gruedorf/2009/08/13/constant-binding</link>
		<comments>http://www.luminance.org/blog/gruedorf/2009/08/13/constant-binding#comments</comments>
		<pubDate>Thu, 13 Aug 2009 10:31:28 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gruedorf]]></category>
		<category><![CDATA[constants]]></category>
		<category><![CDATA[csharp]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=729</guid>
		<description><![CDATA[One of the changes I made in the weeks leading up to my contest deadlines was to pull some of the player-specific combat logic, like that for attack chains, combos, and flinching, out into their own objects. Doing this let me apply that same combat logic to monsters and other entities in the game world, [...]]]></description>
			<content:encoded><![CDATA[<p>One of the changes I made in the weeks leading up to my contest deadlines was to pull some of the player-specific combat logic, like that for attack chains, combos, and flinching, out into their own objects. Doing this let me apply that same combat logic to monsters and other entities in the game world, which cut down on duplication considerably.</p>
<p>However, doing this made it clear that I had some architectural issues to tackle: All of these mechanics were heavily dependent on the <a href="http://www.luminance.org/gruedorf/2009/03/30/changing-constants-at-runtime">tunable constants</a> for the creature in question, which meant I couldn&#8217;t just pull methods and variables out of my entity classes into classes of their own.</p>
<p>To solve the problem of accessing an object&#8217;s constants, I came up with a solution based on reflection. I can define a helper object designed to handle an aspect of an entity&#8217;s mechanics &#8211; for example, a HealthPool object to manage the creature&#8217;s health, along with associated aspects like regeneration. The helper object can define instance variables for the constants it needs access to, like so:</p>
<pre>public class HealthPool {
    public Constant&lt;float&gt; HealthMax = null;
    public Constant&lt;float&gt; HealthPassiveRegen = null;
    public Constant&lt;float&gt; HealthRegenDelayTime = null;
    public Constant&lt;float&gt; HealthRegenRampTime = null;
    public Constant&lt;float&gt; FlinchThreshold = null;
    public Constant&lt;float&gt; FlinchThresholdDecay = null;

    public readonly RuntimeEntity Entity;
    public readonly ITimeProvider TimeProvider;
    public float Health = 0.0f;</pre>
<p>Note that these variables are the same name and type as the actual <a href="http://www.luminance.org/gruedorf/2009/03/30/changing-constants-at-runtime">tunable constants</a> &#8211; the difference is that instead of being static, they&#8217;re instance variables. Doing this allows me to pull a function out of an entity&#8217;s source code without needing to change the way it references particular constants, since the constants have the exact same names as before.</p>
<p>Of course, since these variables default to null, we need some way to fill them in with references to the actual tunable constants we want to use. To do that, we apply reflection:</p>
<pre>public static void BindConstants (object destination, params Type[] sourceTypes) {
    var genericConstant = typeof(Constant&lt;&gt;);
    var destinationType = destination.GetType();
    var destinationFields = new Dictionary&lt;string, FieldInfo&gt;();

    foreach (var field in
        destinationType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.FlattenHierarchy)
    ) {
        var fieldName = field.Name;
        var fieldType = field.FieldType;

        if (!fieldType.IsGenericType || fieldType.GetGenericTypeDefinition() != genericConstant)
            continue;

        destinationFields[fieldName] = field;
    }

    foreach (var sourceType in sourceTypes) {
        foreach (var field in
            sourceType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy)
        ) {
            var fieldName = field.Name;
            var fieldType = field.FieldType;

            if (!fieldType.IsGenericType || fieldType.GetGenericTypeDefinition() != genericConstant)
                continue;

            FieldInfo destinationField = null;
            if (destinationFields.TryGetValue(fieldName, out destinationField)) {
                destinationField.SetValue(destination, field.GetValue(null));
                destinationFields.Remove(fieldName);
            }
        }
    }

    if (destinationFields.Count &gt; 0) {
        var constants = String.Join(", ", (from key in destinationFields.Keys select key).ToArray());
        var types = String.Join(", ", (from type in sourceTypes select type.Name).ToArray());

        throw new InvalidDataException(String.Format("Type(s) {0} do not declare the following constants:\n{1}", types, constants));
    }
}</pre>
<p>What we&#8217;re doing here is pretty simple: We accept a reference to an object that has constants requiring binding, and a list of source types to retrieve constants from. The function operates in two stages: First, we enumerate all the instance variables defined in the target object, and build a list of all the tunable constants it has that need to be bound. After that, we enumerate all the static fields of the provided source types, looking for constants that have names matching those of the instance variables on the target object, binding them where appropriate. After this, we can simply check to see if our list of constants is empty or not &#8211; if it&#8217;s empty, we successfully bound all our constants, and if it&#8217;s not, we know that one or more of the desired constants was missing.</p>
<p>We get a few useful things out of this: First, accepting a list of types allows us to do simple inheritance of constants. If we first check the most-derived type and then the base type of an entity, that allows us to define a &#8216;default value&#8217; for a particular constant, like &#8216;Maximum Health&#8217;, in a base class, and then define a new constant with the same name in the derived type. This also allows us to create &#8216;global defaults&#8217; for a given constant &#8211; for example, if we always put Game at the end of the type list, we can have global game-wide constants for things like physics parameters, and only override them in specific classes if necessary.</p>
<p>Finally, to wire things up, we just need to do a little work in the constructor for our helper object:</p>
<pre>    public HealthPool (RuntimeEntity entity, ITimeProvider timeProvider) {
        Entity = entity;
        TimeProvider = timeProvider;

        ConstantManager.BindConstants(this, entity.GetType(), entity.Game.GetType());

        Health = HealthMax;
    }</pre>
<p>In this case, we&#8217;re initializing the HealthPool using the constants defined in the entity, and falling back to any constants defined in the Game when the entity doesn&#8217;t specify them. If a necessary constant is missing, we&#8217;ll get an exception thrown when constructing our helper object. Once we&#8217;ve bound the constants, we can just use them like we would otherwise &#8211; in this case, the HealthPool automatically initializes itself based on the HealthMax constant.</p>
<p>This is definitely preferable to the approach I used to use for exposing an entity&#8217;s constants &#8211; previously, for important constants like an entity&#8217;s bounding box size, I&#8217;d define an abstract property in a base class, and override it in each derived type to return the value of the constant. Now, I don&#8217;t need to use any abstract members or interfaces; I can just bind to the constants once when I initialize my helper objects.</p>
<p>One thing of note is that since this technique uses reflection, you might run into performance issues if you&#8217;re binding constants repeatedly. This is pretty trivial to solve, however; you can just cache the results of a constant binding operation based on the destination and source types, since those aren&#8217;t going to change at runtime.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/gruedorf/2009/08/13/constant-binding/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Home stretch</title>
		<link>http://www.luminance.org/blog/gruedorf/2009/07/30/home-stretch</link>
		<comments>http://www.luminance.org/blog/gruedorf/2009/07/30/home-stretch#comments</comments>
		<pubDate>Fri, 31 Jul 2009 06:21:50 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Gruedorf]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=645</guid>
		<description><![CDATA[In the next two weeks I have deadlines for two different contests coming up, so things are getting pretty hectic. Lots of things changed in the ~100 or so commits since the last blog post, so I&#8217;ll pick a few to describe. Combo System &#38; Attack Chains Instance Limiting Overhaul Active Controller Detection Combo System [...]]]></description>
			<content:encoded><![CDATA[<p>In the next two weeks I have deadlines for two different contests coming up, so things are getting pretty hectic. Lots of things changed in the ~100 or so commits since the last blog post, so I&#8217;ll pick a few to describe.</p>
<ul>
<li><a href="http://www.luminance.org/gruedorf/2009/07/30/home-stretch#section1">Combo System &amp; Attack Chains</a></li>
<li><a href="http://www.luminance.org/gruedorf/2009/07/30/home-stretch#section2">Instance Limiting Overhaul</a></li>
<li><a href="http://www.luminance.org/gruedorf/2009/07/30/home-stretch#section3">Active Controller Detection</a></li>
</ul>
<div class="video"><object width="720" height="430" style="width:720px;"><param name="movie" value="http://www.youtube-nocookie.com/v/8UJ6-5EHRsw&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x2b405b&#038;color2=0x6b8ab6&#038;hd=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/8UJ6-5EHRsw&#038;hl=en&#038;fs=1&#038;rel=0&#038;color1=0x2b405b&#038;color2=0x6b8ab6&#038;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="720" height="430" style="width:720px;"></embed></object></div>
<p><span id="more-645"></span></p>
<p><a name="section1"></a><br />
<h2>Combo System &amp; Attack Chains</h2>
<p>Previously, combat basically consisted of hitting the punch button over and over to kill monsters. This sucked.</p>
<p>I took a few major steps to address this:</p>
<p>First, I added a second attack type bound to the button I was previously going to use for the grappling hook. This attack is slower and hits heavier, with a wider attack arc, and gives you a nice alternative to the fast, lighter-hitting punch attack.</p>
<p>After the addition of the second attack type, I built on that to add &#8216;combo&#8217; variations of each attack (punch combo, slash combo). The player can combo these attacks onto a previous attack by properly timing another button press near the end of the previous attack animation. Missing the timing (either by pressing too early or too late) &#8216;botches&#8217; the combo and causes the delay before they can perform another attack to be longer than it would be otherwise. The size of the time window in which you can successfully combo an attack decreases every time you combo, so over time it gets harder. This means that simply attacking once will be slow and inefficient, but you are also prevented from comboing attacks indefinitely, which strikes a good balance. The fact that a failed combo has a longer delay than a normal attack means that a player won&#8217;t be punished for choosing to simply combo once or twice and then attack again, since the effectiveness ends up being nearly the same.</p>
<p>Finally, I added a &#8216;attack chain&#8217; system that tracks the number of hits you land on a foe in rapid succession. This allows me to delay the &#8216;flinching&#8217; animation normally played when a creature recieves damage, so that the creature stays within reach of your attacks, allowing you to combo. Each successive hit extends the chain for a short period of time, allowing you to continue landing blows, and when the chain &#8216;breaks&#8217;, all the hits you landed deal their damage to the creature at once, knocking it back and possibly killing it. Chains can span across multiple creatures as well, allowing you to keep multiple enemies &#8216;locked&#8217; by your chain at once. Right now it&#8217;s a bit overpowered, but I think some careful tuning will maintain most of the positive aspects without making the game too easy.</p>
<p><a name="section2"></a><br />
<h2>Instance Limiting Overhaul</h2>
<p>Recently, while working on audio improvements, Troupe ran across a bug in XACT. PC builds of the game ran perfectly without any significant CPU usage problems, and the audio sounded great &#8211; but on the 360, as soon as enough channels of audio started playing, the game&#8217;s framerate tanked to around 15FPS and stayed there indefinitely. This was despite the fact that the game already issues most of its audio calls on a background thread to work around the prohibitively high cost of XACT&#8217;s API calls.</p>
<p>The problem turned out to be that despite the fact I was using XACT&#8217;s built in instance limiting support to control the number of instances playing at once, XACT was struggling to handle the number of cues I was asking it to start at once. Essentially, I was starting all the ambient loop cues for my level at once &#8211; around 30 &#8211; and expecting it to pick the 8 loudest ones to play at any given time based on the instance limit. On PC this worked perfectly without any performance issues, but for whatever reason, not so on the 360.</p>
<p>As a result I basically tore out all the existing code that relied on XACT instance limiting, and reimplemented limiting inside my engine. Luckily this only required changes to about 500 lines of code, but it was still rather frustrating to have to reimplement it when it worked perfectly on PC. On the bright side, now I have more control over how instance limiting behaves, so I at least got something out of it.</p>
<p><a name="section3"></a><br />
<h2>Active Controller Detection</h2>
<p>While doing some testing on my 360 I realized that my approach to handling the 360 controller was incorrect. While I assumed that the player might want to play with any of their four connected controllers, I neglected to notice that most of the XNA Guide APIs (storage device selection, etc) are designed to only respond to input from a single controller. This meant that I needed to detect which controller the player was currently using and make sure to only show XNA dialog boxes using that controller, and that I also needed to detect if that controller became unplugged so that I wouldn&#8217;t attempt to show a dialog box the player was unable to close.</p>
<p>I ended up spending a while changing my input framework so that it would automatically detect disconnected controllers, and inform the game code when a controller had been reconnected. I also did some work to automatically track the active controller, while still handling keyboard input correctly on the PC.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/gruedorf/2009/07/30/home-stretch/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Event-driven audio</title>
		<link>http://www.luminance.org/blog/gruedorf/2009/07/24/event-driven-audio</link>
		<comments>http://www.luminance.org/blog/gruedorf/2009/07/24/event-driven-audio#comments</comments>
		<pubDate>Fri, 24 Jul 2009 19:49:39 +0000</pubDate>
		<dc:creator>Kael</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[Gruedorf]]></category>
		<category><![CDATA[audio]]></category>
		<category><![CDATA[content pipeline]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[xact]]></category>
		<category><![CDATA[xna]]></category>

		<guid isPermaLink="false">http://www.luminance.org/?p=625</guid>
		<description><![CDATA[One of the older items on my to-do list was to give my sound designer a way to change the game&#8217;s audio without having to recompile the game in Visual Studio and start it up. Based on some of the improvements I made recently, I was finally able to knock that item off my to-do [...]]]></description>
			<content:encoded><![CDATA[<p>One of the older items on my to-do list was to give my sound designer a way to change the game&#8217;s audio without having to recompile the game in Visual Studio and start it up. Based on some of the improvements I made recently, I was finally able to knock that item off my to-do list.</p>
<p>Below, you can see a short annotated video walkthrough where I demonstrate the technique and show how it integrates with XACT.</p>
<div class="video"><object width="720" height="480" data="http://www.youtube-nocookie.com/v/faHdvcz45lU&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6&amp;hd=1;hq=1" type="application/x-shockwave-flash" style="width: 720px"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/faHdvcz45lU&amp;hl=en&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6&amp;hd=1;hq=1" /><param name="allowfullscreen" value="true" /></object></div>
<hr />
<p>There are a few key pieces necessary for this to work.</p>
<p><span id="more-625"></span></p>
<p>First, I need a way to get updated audio into the game. It turns out this is pretty simple &#8211; if you change the settings in your XACT project, you can get it to build output files into a folder of your choice. At that point, all you need to do is change your game&#8217;s XACT code to be able to load from that location.</p>
<p>Second, I need a way to pull information out of the XACT datafiles that I can use to attach cues to events. Since the XACT API provided by the XNA Framework is basically useless for this purpose, I ended up solving this problem by loading up the raw datafiles and pulling the names of my cues out of the datafiles. Yes, it&#8217;s disgusting. But it works! Luckily, the cue names are right at the end of the data files, and they&#8217;re null-terminated, so it&#8217;s not difficult to read them. It&#8217;s beyond my understanding why the framework developers opted not to provide the information.</p>
<p>Third, I needed a way to broadcast events from objects in my game world. The solution I ended up building for this was essentially an improved version of the event framework that I previously used for handling input events, like button presses. The framework allows me to &#8216;subscribe&#8217; to various types of events, either for a specific object, or for all objects that can broadcast that event. The ability to subscribe to all objects inexpensively gives me a straightforward way to say things like &#8216;whenever any creature gets hit by a rocket, play an explosion sound&#8217;, which is important.</p>
<p>Fourth, I needed a way to expose event information in an understandable manner, so that it would be easy to figure out what events are occurring in-game and how to attach sounds to them. I solved this by creating a simple &#8216;event overlay&#8217; that shows a list of the most recently fired events, and highlights objects when they broadcast events. This allows you to simply play the game with the overlay open and look for things that are missing sound effects &#8211; once you find something, just look at the log to find out the name of the event.</p>
<hr />
<p>If you&#8217;re interested, you can check out the source code and automated tests for the event system <a href="http://code.google.com/p/fracture/source/browse/trunk/Squared/Util/EventBus.cs">here, on Google Code</a>. In the future I will be releasing the rest of my audio framework as open-source for people to use. Please don&#8217;t hesitate to leave a comment if you have any questions; I&#8217;d be glad to help explain more about how this technique works.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.luminance.org/blog/gruedorf/2009/07/24/event-driven-audio/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

