<?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>#AltDevBlogADay &#187; Richard Sim</title>
	<atom:link href="http://www.altdevblogaday.com/author/richard-sim/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.altdevblogaday.com</link>
	<description>Each day a little more #gamedev love</description>
	<lastBuildDate>Wed, 22 May 2013 11:16:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Experimental gameplay with experimental hardware</title>
		<link>http://www.altdevblogaday.com/2011/09/19/experimental-gameplay-with-experimental-hardware/</link>
		<comments>http://www.altdevblogaday.com/2011/09/19/experimental-gameplay-with-experimental-hardware/#comments</comments>
		<pubDate>Mon, 19 Sep 2011 07:21:40 +0000</pubDate>
		<dc:creator>Richard Sim</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://altdevblogaday.com/?p=16603</guid>
		<description><![CDATA[<p>Just as middleware and open source software have been having radical affects on how we develop games, the availability of pre-designed, pre-fabricated circuit boards have greatly simplified the development of hardware. Amongst the biggest drivers of these changes has been what is often referred to as the Maker movement, and the advent of open source hardware (which is conceptually very similar to that of open source software). What is perhaps the biggest advantage of this is that, for what could potentially be completely incompatible, a surprising amount of open source hardware is usable together, or even designed to work together from the start.<br />
This post will serve as a brief overview and introduction to hardware development leveraging these pre-designed pieces, and I hope will inspire you to learn more and try out your ideas for cool new controllers, haptic feedback, and other such things that can provide richness to the gamers experience. I&#8217;ve submitted a proposal on this for GDC 2012, and with a little luck it&#8217;ll get the go ahead soon to move on to the second round!</p>
<p><a href="http://www.altdevblogaday.com/2011/09/19/experimental-gameplay-with-experimental-hardware/" class="more-link">Read more on Experimental gameplay with experimental hardware&#8230;</a></p>
]]></description>
				<content:encoded><![CDATA[<p>Just as middleware and open source software have been having radical affects on how we develop games, the availability of pre-designed, pre-fabricated circuit boards have greatly simplified the development of hardware. Amongst the biggest drivers of these changes has been what is often referred to as the Maker movement, and the advent of open source hardware (which is conceptually very similar to that of open source software). What is perhaps the biggest advantage of this is that, for what could potentially be completely incompatible, a surprising amount of open source hardware is usable together, or even designed to work together from the start.<br />
This post will serve as a brief overview and introduction to hardware development leveraging these pre-designed pieces, and I hope will inspire you to learn more and try out your ideas for cool new controllers, haptic feedback, and other such things that can provide richness to the gamers experience. I&#8217;ve submitted a proposal on this for GDC 2012, and with a little luck it&#8217;ll get the go ahead soon to move on to the second round!</p>
<p>Perhaps the best known open source hardware is <a href="http://www.arduino.cc/" target="_blank">Arduino</a>, who make a number of small development boards based on the AVR microcontrollers (and have just announced last week new boards based on the more powerful AVR32 and ARM Cortex M3 microcontrollers), and a complete development environment for them &#8211; all free of course. The Arduino&#8217;s are aimed at people with little to no experience in electronics (or even programming); designers, artists, and anyone else who wants to tinker. Under the hood their development environment compiles C/C++ code, but the specifics of the language are hidden from users; but there&#8217;s nothing stopping advanced users going right to the compiler.<br />
There&#8217;s nothing in itself extraordinary about the Arduino, but what sets it apart from the competition is the hardware that others have made available to interface with it, both open and closed source. Arduino boards have standardized footprints, that allow for daughter boards (&#8216;shields&#8217; in Arduino terminology) to connect up easily. What this means for the user is they can get an Arduino board, a few shields for things like Bluetooth connectivity, motor control, or even the ability to make or receive phone calls through a cellular network. Of course you are also free to develop your own shields, or anything else &#8211; it doesn&#8217;t have to fit the standard footprints at all, just have the ability to connect to the Arduino board&#8217;s exposed headers (connectors).<br />
Open source hardware isn&#8217;t limited to the Arduino and the shields that go with it, and you can pretty much find any kind of sensor available on an open source interface board for ease of use and prototyping. This is very useful since the vast majority of modern sensors and other devices that you may be interested in trying out are very, very small and hard to work with without proper equipment. While it&#8217;s not impossible, it&#8217;s definitely a barrier that a lot of beginners find daunting, so having something easier to get started with is a big help in getting stuff done.</p>
<p>The Arduino is so well received that Google even chose it as the base for its reference design for the <a href="http://developer.android.com/guide/topics/usb/adk.html" target="_blank">Android Open Accessory Development Kit</a>. This opens the Android system up to being able to interface with nearly any kind of sensor or feedback mechanism around, so the possibilities for what can be done with input (or output) from an Android game are endless! There are two gotcha&#8217;s with the Accessory Development Kit however; unfortunately it&#8217;s limited to Android 2.3.4+, and the accessory must be a USB host. The last point especially limits the portability of any potential accessories due to the requirement of all USB hosts to provide 5V and 500mA. While this isn&#8217;t impossible to do in a portable accessory, it will add considerable bulk to any device for the battery capacity required to get any kind of acceptable battery life. The former point has a solution at least, not to use the ADK! SparkFun make a board called the <a title="IOIO" href="http://www.sparkfun.com/products/10748" target="_blank">IOIO</a>, which similarly to the ADK works via acting as a USB host device, that will work with Android devices running Android 1.5 or above (though they admit it could be incompatible with some devices, since they haven&#8217;t tested it with a huge variety).</p>
<p>So, the Arduino is what you need &#8211; now what? The great thing about experimenting with hardware is that it can be really simple, and fun! The very first hardware I remember making as a kid (I can&#8217;t have been more than 10, and was probably a lot younger) was a pressure pad &#8211; and all it consisted of was a couple of bits of cardboard with aluminium foil on, separated by a ring of foam core. You pressed on the top and the two pieces of aluminium foil made contact inside to close the circuit (i.e. the switch was &#8216;turned on&#8217;). Of course, this was long before you could order cool arcade buttons and joysticks over the Internet, so you may want to forgo the cardboard and glue and go straight for real buttons these days. While not as fun, you sure can&#8217;t beat their reliability!</p>
<p>If this all sounds cool but you&#8217;re not sure where to start, <a href="http://www.instructables.com/" target="_blank">Instructables</a> can be a great source for inspiration, ideas, and plans. How about <a href="http://www.instructables.com/id/Hooking-Up-A-Treadmill-to-PC-Game/?ALLSTEPS" target="_blank">Hooking up a treadmill to a PC game</a>, a <a href="http://www.instructables.com/id/MEGA-DPDT-Switch-Tank-Style-1/?ALLSTEPS" target="_blank">Mega DPDT tank-style switch</a>, a <a href="http://www.instructables.com/id/Rave-Rover-Mobile-Dance-Stage/?ALLSTEPS" target="_blank">Mobile dance stage</a>, <a href="http://www.instructables.com/id/How-to-hack-EEG-toys-with-arduino/?ALLSTEPS" target="_blank">Hacking EEG toys</a>, <a href="http://www.instructables.com/id/Duino-Tagger/?ALLSTEPS" target="_blank">Laser tag</a>, <a href="http://www.instructables.com/id/Zsnes-emulator-controller/?ALLSTEPS" target="_blank">Making your own SNES controller</a>, or an <a href="http://www.instructables.com/id/DIY-Android-Ball-Maze-An-Introduction-to-the-And/?ALLSTEPS" target="_blank">Android-controlled ball maze</a>? And those don&#8217;t even touch on applications of some of the cool sensors you can get. What fun can you have with a game based around an <a href="http://www.seeedstudio.com/depot/twig-alcohol-sensor-p-764.html?cPath=144_151" target="_blank">alcohol sensor</a> at your next party?</p>
<p>Here are a few of my favourite suppliers to get you started:</p>
<ul>
<li><a href="http://www.sparkfun.com/" target="_blank">SparkFun</a></li>
<li><a href="http://adafruit.com/" target="_blank">Adafruit</a></li>
<li><a href="http://www.seeedstudio.com/depot/" target="_blank">Seeed Studio</a></li>
<li><a href="http://www.makershed.com/">Maker SHED</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/09/19/experimental-gameplay-with-experimental-hardware/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Survey of Fast Compression Algorithms (Part 1)</title>
		<link>http://www.altdevblogaday.com/2011/04/22/survey-of-fast-compression-algorithms-part-1/</link>
		<comments>http://www.altdevblogaday.com/2011/04/22/survey-of-fast-compression-algorithms-part-1/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 11:21:21 +0000</pubDate>
		<dc:creator>Richard Sim</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/04/22/survey-of-fast-compression-algorithms-part-1/</guid>
		<description><![CDATA[<p>Recently the subject of compression algorithms was raised on Twitter, and a number of new additions to the field were mentioned in the ensuing discussion. As I’m currently working on improving load times for a project, these newcomers piqued my interest and I set out to do some evaluation of them with “game-ish” assets.</p>
<p><a href="http://www.altdevblogaday.com/2011/04/22/survey-of-fast-compression-algorithms-part-1/" class="more-link">Read more on Survey of Fast Compression Algorithms (Part 1)&#8230;</a></p>
]]></description>
				<content:encoded><![CDATA[<p>Recently the subject of compression algorithms was raised on Twitter, and a number of new additions to the field were mentioned in the ensuing discussion. As I’m currently working on improving load times for a project, these newcomers piqued my interest and I set out to do some evaluation of them with “game-ish” assets.</p>
<p>This was originally posted on <a title="http://www.technofumbles.com/weblog/2011/04/22/survey-of-fast-compression-algorithms-part-1/" href="http://www.technofumbles.com/weblog/2011/04/22/survey-of-fast-compression-algorithms-part-1/">Technofumbles</a>, which may have better formatting for the tables; if the layout is too messed up here, try the original post.</p>
<p>I haven’t been able to test every algorithm I wanted to get to yet (new and old), and only have PC results to show so far – but am releasing the source so it can be extended as people desire. See the end of the post for a download link. Future algorithms on my list to add to the test suite are ZLib, lzham, LZMA, and a few variants there of.</p>
<p><em><strong>UPDATE April 24, 2011:</strong> LZ4 has been open-sourced, so I’ve added it to the test suite and updated the results. Charts have also been added to make comparison easier.</em></p>
<p>The test data I chose came mainly from the DirectX SDK samples, with a few files that were kicking around my hard drive for good measure. Highly scientific! I hope to do more realistic tests soon!</p>
<p>Tests were performed on a low-end Core2 Duo laptop. Without further delays, here’s the numbers.</p>
<p>Summary Results:<br />
<img src="http://technofumbles.com/images/CompressionCharts/SummaryCompressionRatio.gif" /><br />
<img src="http://technofumbles.com/images/CompressionCharts/SummaryCompressionTime.gif" /><br />
<img src="http://technofumbles.com/images/CompressionCharts/SummaryDecompressionTime.gif" /></p>
<p>Compression Ratio (click to enlarge):<br />
<a href="http://technofumbles.com/images/CompressionCharts/CompressionRatio.gif"><img src="http://technofumbles.com/images/CompressionCharts/CompressionRatio.gif" width="240" height="120" /></a></p>
<p>Compression Time (click to enlarge):<br />
<a href="http://technofumbles.com/images/CompressionCharts/CompressionTime.gif"><img src="http://technofumbles.com/images/CompressionCharts/CompressionTime.gif" width="240" height="120" /></a></p>
<p>Compression Time, Zoomed (click to enlarge):<br />
<a href="http://technofumbles.com/images/CompressionCharts/CompressionTimeZoom.gif"><img src="http://technofumbles.com/images/CompressionCharts/CompressionTimeZoom.gif" width="240" height="120" /></a></p>
<p>Decompression Time (click to enlarge):<br />
<a href="http://technofumbles.com/images/CompressionCharts/DecompressionTime.gif"><img src="http://technofumbles.com/images/CompressionCharts/DecompressionTime.gif" width="240" height="120" /></a></p>
<p>Decompression Time, Zoomed (click to enlarge):<br />
<a href="http://technofumbles.com/images/CompressionCharts/DecompressionTimeZoom.gif"><img src="http://technofumbles.com/images/CompressionCharts/DecompressionTimeZoom.gif" width="240" height="120" /></a></p>
<p>Summary Results:</p>
<table border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td valign="top" width="100"><strong>Algorithm</strong></td>
<td valign="top" width="100">
<p align="center"><strong>% (Average)</strong></p>
</td>
<td valign="top" width="100">
<p align="center"><strong>Compression Time (Total)</strong></p>
</td>
<td valign="top" width="100">
<p align="center"><strong>Decompression Time (Total)</strong></p>
</td>
</tr>
<tr>
<td valign="top" width="100">Doboz</td>
<td valign="top" width="100">66.609</td>
<td valign="top" width="100">38.26463</td>
<td valign="top" width="100">0.24643</td>
</tr>
<tr>
<td valign="top" width="100">Yappy</td>
<td valign="top" width="100">76.616</td>
<td valign="top" width="100">1.83406</td>
<td valign="top" width="100">0.10750</td>
</tr>
<tr>
<td valign="top" width="100">Snappy</td>
<td valign="top" width="100">73.838</td>
<td valign="top" width="100">0.51189</td>
<td valign="top" width="100">0.20106</td>
</tr>
<tr>
<td valign="top" width="100">LZF</td>
<td valign="top" width="100">72.293</td>
<td valign="top" width="100">0.73531</td>
<td valign="top" width="100">0.20450</td>
</tr>
<tr>
<td valign="top" width="100">FastLZ</td>
<td valign="top" width="100">73.105</td>
<td valign="top" width="100">0.89960</td>
<td valign="top" width="100">0.25096</td>
</tr>
<tr>
<td valign="top" width="100">QuickLZ</td>
<td valign="top" width="100">73.373</td>
<td valign="top" width="100">0.44819</td>
<td valign="top" width="100">0.29023</td>
</tr>
<tr>
<td valign="top" width="100">LZ4</td>
<td valign="top" width="100">71.743</td>
<td valign="top" width="100">0.52270</td>
<td valign="top" width="100">0.13279</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Compression Details:</p>
<table border="1" cellspacing="0" cellpadding="2" width="573">
<tbody>
<tr>
<td valign="top" width="131">&#160;</td>
<td valign="top" width="118" colspan="2"><strong>Doboz</strong></td>
<td valign="top" width="104" colspan="2"><strong>Yappy</strong></td>
</tr>
<tr>
<td valign="top" width="150"><strong>File Type</strong></td>
<td valign="top" width="133"><strong>%</strong></td>
<td valign="top" width="132"><strong>S</strong></td>
<td valign="top" width="117"><strong>%</strong></td>
<td valign="top" width="111"><strong>S</strong></td>
</tr>
<tr>
<td valign="top" width="150">BMP</td>
<td valign="top" width="136">76.859</td>
<td valign="top" width="137">0.28196</td>
<td valign="top" width="123">100.511</td>
<td valign="top" width="118">0.01840</td>
</tr>
<tr>
<td valign="top" width="146">BMP</td>
<td valign="top" width="135">15.771</td>
<td valign="top" width="138">2.04379</td>
<td valign="top" width="126">39.693</td>
<td valign="top" width="122">0.08194</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="134">92.847</td>
<td valign="top" width="138">2.71034</td>
<td valign="top" width="127">98.261</td>
<td valign="top" width="124">0.13022</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="134">100.000</td>
<td valign="top" width="137">1.15703</td>
<td valign="top" width="127">102.474</td>
<td valign="top" width="125">0.06402</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="133">30.457</td>
<td valign="top" width="137">0.38021</td>
<td valign="top" width="127">37.101</td>
<td valign="top" width="126">0.01224</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">58.066</td>
<td valign="top" width="137">1.63392</td>
<td valign="top" width="127">78.431</td>
<td valign="top" width="126">0.07035</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">77.604</td>
<td valign="top" width="137">0.21672</td>
<td valign="top" width="127">85.799</td>
<td valign="top" width="126">0.01651</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">38.272</td>
<td valign="top" width="137">0.32217</td>
<td valign="top" width="127">45.296</td>
<td valign="top" width="126">0.01378</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">75.037</td>
<td valign="top" width="137">2.75669</td>
<td valign="top" width="127">98.596</td>
<td valign="top" width="126">0.09562</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">50.520</td>
<td valign="top" width="137">2.97517</td>
<td valign="top" width="127">81.242</td>
<td valign="top" width="126">0.09691</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">38.885</td>
<td valign="top" width="137">0.07744</td>
<td valign="top" width="127">46.294</td>
<td valign="top" width="126">0.00358</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">98.550</td>
<td valign="top" width="137">0.04572</td>
<td valign="top" width="127">100.713</td>
<td valign="top" width="126">0.00609</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">46.584</td>
<td valign="top" width="137">7.37891</td>
<td valign="top" width="127">72.888</td>
<td valign="top" width="126">0.28009</td>
</tr>
<tr>
<td valign="top" width="143">X</td>
<td valign="top" width="133">17.017</td>
<td valign="top" width="137">0.05599</td>
<td valign="top" width="127">28.431</td>
<td valign="top" width="126">0.00297</td>
</tr>
<tr>
<td valign="top" width="143">JPG</td>
<td valign="top" width="133">100.001</td>
<td valign="top" width="137">0.15212</td>
<td valign="top" width="127">101.159</td>
<td valign="top" width="126">0.02035</td>
</tr>
<tr>
<td valign="top" width="143">PDF</td>
<td valign="top" width="133">100.000</td>
<td valign="top" width="137">0.61228</td>
<td valign="top" width="127">102.308</td>
<td valign="top" width="126">0.06216</td>
</tr>
<tr>
<td valign="top" width="143">PDF</td>
<td valign="top" width="133">100.000</td>
<td valign="top" width="137">5.26727</td>
<td valign="top" width="127">98.232</td>
<td valign="top" width="126">0.36000</td>
</tr>
<tr>
<td valign="top" width="143">PNG</td>
<td valign="top" width="133">100.032</td>
<td valign="top" width="137">0.00551</td>
<td valign="top" width="127">101.561</td>
<td valign="top" width="126">0.00038</td>
</tr>
<tr>
<td valign="top" width="143">PNG</td>
<td valign="top" width="133">100.018</td>
<td valign="top" width="137">0.00658</td>
<td valign="top" width="127">101.584</td>
<td valign="top" width="126">0.00065</td>
</tr>
<tr>
<td valign="top" width="143">MESH</td>
<td valign="top" width="133">30.941</td>
<td valign="top" width="137">0.16696</td>
<td valign="top" width="127">47.942</td>
<td valign="top" width="126">0.01962</td>
</tr>
<tr>
<td valign="top" width="143">ANIM</td>
<td valign="top" width="133">20.349</td>
<td valign="top" width="137">0.08969</td>
<td valign="top" width="127">23.585</td>
<td valign="top" width="126">0.00349</td>
</tr>
<tr>
<td valign="top" width="143">SMD</td>
<td valign="top" width="133">8.705</td>
<td valign="top" width="137">0.81705</td>
<td valign="top" width="127">28.595</td>
<td valign="top" width="126">0.02770</td>
</tr>
<tr>
<td valign="top" width="143">TXT</td>
<td valign="top" width="133">36.946</td>
<td valign="top" width="137">0.01829</td>
<td valign="top" width="127">54.240</td>
<td valign="top" width="126">0.00270</td>
</tr>
<tr>
<td valign="top" width="143">TXT</td>
<td valign="top" width="133">36.000</td>
<td valign="top" width="137">0.00952</td>
<td valign="top" width="127">49.461</td>
<td valign="top" width="126">0.00078</td>
</tr>
<tr>
<td valign="top" width="143">HDR</td>
<td valign="top" width="133">85.190</td>
<td valign="top" width="137">3.04351</td>
<td valign="top" width="127">97.053</td>
<td valign="top" width="126">0.11724</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">100.000</td>
<td valign="top" width="137">1.34706</td>
<td valign="top" width="127">95.849</td>
<td valign="top" width="126">0.09014</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">100.000</td>
<td valign="top" width="137">0.98768</td>
<td valign="top" width="127">99.833</td>
<td valign="top" width="126">0.07076</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">97.022</td>
<td valign="top" width="137">2.64150</td>
<td valign="top" width="127">102.726</td>
<td valign="top" width="126">0.10698</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">100.000</td>
<td valign="top" width="137">0.83595</td>
<td valign="top" width="127">102.019</td>
<td valign="top" width="126">0.06339</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="2" width="573">
<tbody>
<tr>
<td valign="top" width="131">&#160;</td>
<td valign="top" width="118" colspan="2"><strong>Snappy</strong></td>
<td valign="top" width="104" colspan="2"><strong>LZF</strong></td>
</tr>
<tr>
<td valign="top" width="150"><strong>File Type</strong></td>
<td valign="top" width="133"><strong>%</strong></td>
<td valign="top" width="132"><strong>S</strong></td>
<td valign="top" width="117"><strong>%</strong></td>
<td valign="top" width="111"><strong>S</strong></td>
</tr>
<tr>
<td valign="top" width="150">BMP</td>
<td valign="top" width="136">98.494</td>
<td valign="top" width="137">0.00494</td>
<td valign="top" width="123">86.235</td>
<td valign="top" width="118">0.00886</td>
</tr>
<tr>
<td valign="top" width="146">BMP</td>
<td valign="top" width="135">34.023</td>
<td valign="top" width="138">0.02537</td>
<td valign="top" width="126">42.279</td>
<td valign="top" width="122">0.01739</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="134">97.980</td>
<td valign="top" width="138">0.04788</td>
<td valign="top" width="127">95.804</td>
<td valign="top" width="124">0.06335</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="134">99.956</td>
<td valign="top" width="137">0.00500</td>
<td valign="top" width="127">100.229</td>
<td valign="top" width="125">0.02882</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="133">36.008</td>
<td valign="top" width="137">0.00356</td>
<td valign="top" width="127">33.066</td>
<td valign="top" width="126">0.00441</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">76.513</td>
<td valign="top" width="137">0.04170</td>
<td valign="top" width="127">70.303</td>
<td valign="top" width="126">0.02679</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">86.051</td>
<td valign="top" width="137">0.00662</td>
<td valign="top" width="127">82.233</td>
<td valign="top" width="126">0.00726</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">44.553</td>
<td valign="top" width="137">0.00433</td>
<td valign="top" width="127">42.180</td>
<td valign="top" width="126">0.00441</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">96.407</td>
<td valign="top" width="137">0.03740</td>
<td valign="top" width="127">86.483</td>
<td valign="top" width="126">0.04520</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">76.097</td>
<td valign="top" width="137">0.05383</td>
<td valign="top" width="127">68.093</td>
<td valign="top" width="126">0.03548</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">45.953</td>
<td valign="top" width="137">0.00131</td>
<td valign="top" width="127">43.822</td>
<td valign="top" width="126">0.00149</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">98.711</td>
<td valign="top" width="137">0.00064</td>
<td valign="top" width="127">97.998</td>
<td valign="top" width="126">0.00281</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">68.686</td>
<td valign="top" width="137">0.15584</td>
<td valign="top" width="127">62.146</td>
<td valign="top" width="126">0.09891</td>
</tr>
<tr>
<td valign="top" width="143">X</td>
<td valign="top" width="133">25.919</td>
<td valign="top" width="137">0.00096</td>
<td valign="top" width="127">26.458</td>
<td valign="top" width="126">0.00067</td>
</tr>
<tr>
<td valign="top" width="143">JPG</td>
<td valign="top" width="133">97.265</td>
<td valign="top" width="137">0.00130</td>
<td valign="top" width="127">100.833</td>
<td valign="top" width="126">0.00837</td>
</tr>
<tr>
<td valign="top" width="143">PDF</td>
<td valign="top" width="133">98.477</td>
<td valign="top" width="137">0.00447</td>
<td valign="top" width="127">101.311</td>
<td valign="top" width="126">0.02401</td>
</tr>
<tr>
<td valign="top" width="143">PDF</td>
<td valign="top" width="133">95.421</td>
<td valign="top" width="137">0.03683</td>
<td valign="top" width="127">97.329</td>
<td valign="top" width="126">0.14390</td>
</tr>
<tr>
<td valign="top" width="143">PNG</td>
<td valign="top" width="133">99.440</td>
<td valign="top" width="137">0.00006</td>
<td valign="top" width="127">101.189</td>
<td valign="top" width="126">0.00036</td>
</tr>
<tr>
<td valign="top" width="143">PNG</td>
<td valign="top" width="133">99.958</td>
<td valign="top" width="137">0.00005</td>
<td valign="top" width="127">100.406</td>
<td valign="top" width="126">0.00037</td>
</tr>
<tr>
<td valign="top" width="143">MESH</td>
<td valign="top" width="133">41.180</td>
<td valign="top" width="137">0.00460</td>
<td valign="top" width="127">40.191</td>
<td valign="top" width="126">0.00450</td>
</tr>
<tr>
<td valign="top" width="143">ANIM</td>
<td valign="top" width="133">22.804</td>
<td valign="top" width="137">0.00068</td>
<td valign="top" width="127">21.442</td>
<td valign="top" width="126">0.00069</td>
</tr>
<tr>
<td valign="top" width="143">SMD</td>
<td valign="top" width="133">19.854</td>
<td valign="top" width="137">0.00573</td>
<td valign="top" width="127">15.934</td>
<td valign="top" width="126">0.00462</td>
</tr>
<tr>
<td valign="top" width="143">TXT</td>
<td valign="top" width="133">51.544</td>
<td valign="top" width="137">0.00083</td>
<td valign="top" width="127">49.048</td>
<td valign="top" width="126">0.00067</td>
</tr>
<tr>
<td valign="top" width="143">TXT</td>
<td valign="top" width="133">45.939</td>
<td valign="top" width="137">0.00033</td>
<td valign="top" width="127">45.320</td>
<td valign="top" width="126">0.00032</td>
</tr>
<tr>
<td valign="top" width="143">HDR</td>
<td valign="top" width="133">94.695</td>
<td valign="top" width="137">0.03526</td>
<td valign="top" width="127">91.182</td>
<td valign="top" width="126">0.05647</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">93.265</td>
<td valign="top" width="137">0.01055</td>
<td valign="top" width="127">94.968</td>
<td valign="top" width="126">0.04045</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">97.076</td>
<td valign="top" width="137">0.00619</td>
<td valign="top" width="127">99.201</td>
<td valign="top" width="126">0.02845</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">99.861</td>
<td valign="top" width="137">0.00718</td>
<td valign="top" width="127">99.541</td>
<td valign="top" width="126">0.04940</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">99.176</td>
<td valign="top" width="137">0.00445</td>
<td valign="top" width="127">101.271</td>
<td valign="top" width="126">0.02595</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="2" width="573">
<tbody>
<tr>
<td valign="top" width="131">&#160;</td>
<td valign="top" width="118" colspan="2"><strong>FastLZ</strong></td>
<td valign="top" width="104" colspan="2"><strong>QuickLZ</strong></td>
</tr>
<tr>
<td valign="top" width="150"><strong>File Type</strong></td>
<td valign="top" width="133"><strong>%</strong></td>
<td valign="top" width="132"><strong>S</strong></td>
<td valign="top" width="117"><strong>%</strong></td>
<td valign="top" width="111"><strong>S</strong></td>
</tr>
<tr>
<td valign="top" width="150">BMP</td>
<td valign="top" width="136">90.305</td>
<td valign="top" width="137">0.01170</td>
<td valign="top" width="123">91.482</td>
<td valign="top" width="118">0.00714</td>
</tr>
<tr>
<td valign="top" width="146">BMP</td>
<td valign="top" width="135">41.562</td>
<td valign="top" width="138">0.02124</td>
<td valign="top" width="126">49.502</td>
<td valign="top" width="122">0.01913</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="134">97.465</td>
<td valign="top" width="138">0.08657</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="124">0.02873</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="134">101.011</td>
<td valign="top" width="137">0.03795</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="125">0.01411</td>
</tr>
<tr>
<td valign="top" width="144">DDS</td>
<td valign="top" width="133">33.720</td>
<td valign="top" width="137">0.00467</td>
<td valign="top" width="127">33.060</td>
<td valign="top" width="126">0.00449</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">74.448</td>
<td valign="top" width="137">0.03656</td>
<td valign="top" width="127">69.147</td>
<td valign="top" width="126">0.02293</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">85.192</td>
<td valign="top" width="137">0.01019</td>
<td valign="top" width="127">87.021</td>
<td valign="top" width="126">0.00553</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">43.315</td>
<td valign="top" width="137">0.00570</td>
<td valign="top" width="127">42.407</td>
<td valign="top" width="126">0.00355</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">89.005</td>
<td valign="top" width="137">0.05589</td>
<td valign="top" width="127">86.723</td>
<td valign="top" width="126">0.03342</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">70.850</td>
<td valign="top" width="137">0.04215</td>
<td valign="top" width="127">69.727</td>
<td valign="top" width="126">0.02931</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">45.153</td>
<td valign="top" width="137">0.00162</td>
<td valign="top" width="127">43.871</td>
<td valign="top" width="126">0.00100</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">98.450</td>
<td valign="top" width="137">0.00313</td>
<td valign="top" width="127">100.003</td>
<td valign="top" width="126">0.00219</td>
</tr>
<tr>
<td valign="top" width="143">DDS</td>
<td valign="top" width="133">67.313</td>
<td valign="top" width="137">0.11819</td>
<td valign="top" width="127">64.563</td>
<td valign="top" width="126">0.07868</td>
</tr>
<tr>
<td valign="top" width="143">X</td>
<td valign="top" width="133">25.687</td>
<td valign="top" width="137">0.00079</td>
<td valign="top" width="127">24.202</td>
<td valign="top" width="126">0.00057</td>
</tr>
<tr>
<td valign="top" width="143">JPG</td>
<td valign="top" width="133">99.935</td>
<td valign="top" width="137">0.00988</td>
<td valign="top" width="127">100.001</td>
<td valign="top" width="126">0.00424</td>
</tr>
<tr>
<td valign="top" width="143">PDF</td>
<td valign="top" width="133">101.166</td>
<td valign="top" width="137">0.02915</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="126">0.01258</td>
</tr>
<tr>
<td valign="top" width="143">PDF</td>
<td valign="top" width="133">97.352</td>
<td valign="top" width="137">0.17365</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="126">0.07601</td>
</tr>
<tr>
<td valign="top" width="143">PNG</td>
<td valign="top" width="133">101.303</td>
<td valign="top" width="137">0.00018</td>
<td valign="top" width="127">100.057</td>
<td valign="top" width="126">0.00008</td>
</tr>
<tr>
<td valign="top" width="143">PNG</td>
<td valign="top" width="133">100.720</td>
<td valign="top" width="137">0.00032</td>
<td valign="top" width="127">100.032</td>
<td valign="top" width="126">0.00013</td>
</tr>
<tr>
<td valign="top" width="143">MESH</td>
<td valign="top" width="133">36.532</td>
<td valign="top" width="137">0.00609</td>
<td valign="top" width="127">37.332</td>
<td valign="top" width="126">0.00426</td>
</tr>
<tr>
<td valign="top" width="143">ANIM</td>
<td valign="top" width="133">20.880</td>
<td valign="top" width="137">0.00087</td>
<td valign="top" width="127">21.235</td>
<td valign="top" width="126">0.00069</td>
</tr>
<tr>
<td valign="top" width="143">SMD</td>
<td valign="top" width="133">14.640</td>
<td valign="top" width="137">0.00526</td>
<td valign="top" width="127">14.675</td>
<td valign="top" width="126">0.00456</td>
</tr>
<tr>
<td valign="top" width="143">TXT</td>
<td valign="top" width="133">49.004</td>
<td valign="top" width="137">0.00062</td>
<td valign="top" width="127">47.658</td>
<td valign="top" width="126">0.00044</td>
</tr>
<tr>
<td valign="top" width="143">TXT</td>
<td valign="top" width="133">45.977</td>
<td valign="top" width="137">0.00024</td>
<td valign="top" width="127">45.105</td>
<td valign="top" width="126">0.00019</td>
</tr>
<tr>
<td valign="top" width="143">HDR</td>
<td valign="top" width="133">93.522</td>
<td valign="top" width="137">0.06468</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="126">0.02546</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">95.033</td>
<td valign="top" width="137">0.04300</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="126">0.01853</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">99.288</td>
<td valign="top" width="137">0.03458</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="126">0.01526</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">99.819</td>
<td valign="top" width="137">0.05917</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="126">0.02266</td>
</tr>
<tr>
<td valign="top" width="143">WAV</td>
<td valign="top" width="133">101.391</td>
<td valign="top" width="137">0.03263</td>
<td valign="top" width="127">100.000</td>
<td valign="top" width="126">0.01352</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="2" width="240">
<tbody>
<tr>
<td valign="top" width="80">&#160;</td>
<td valign="top" width="80" colspan="2"><strong>LZ4</strong></td>
</tr>
<tr>
<td valign="top" width="80"><strong>File Type</strong></td>
<td valign="top" width="80"><strong>%</strong></td>
<td valign="top" width="80"><strong>S</strong></td>
</tr>
<tr>
<td valign="top" width="80">BMP</td>
<td valign="top" width="80">92.720</td>
<td valign="top" width="80">0.01104</td>
</tr>
<tr>
<td valign="top" width="80">BMP</td>
<td valign="top" width="80">36.492</td>
<td valign="top" width="80">0.01010</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">93.103</td>
<td valign="top" width="80">0.07531</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">98.942</td>
<td valign="top" width="80">0.02954</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">31.981</td>
<td valign="top" width="80">0.00348</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">69.793</td>
<td valign="top" width="80">0.02250</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">79.072</td>
<td valign="top" width="80">0.00957</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">40.509</td>
<td valign="top" width="80">0.00522</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">86.819</td>
<td valign="top" width="80">0.04902</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">73.269</td>
<td valign="top" width="80">0.02903</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">42.889</td>
<td valign="top" width="80">0.00134</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">97.659</td>
<td valign="top" width="80">0.00189</td>
</tr>
<tr>
<td valign="top" width="80">DDS</td>
<td valign="top" width="80">66.108</td>
<td valign="top" width="80">0.06883</td>
</tr>
<tr>
<td valign="top" width="80">X</td>
<td valign="top" width="80">26.743</td>
<td valign="top" width="80">0.00113</td>
</tr>
<tr>
<td valign="top" width="80">JPG</td>
<td valign="top" width="80">97.413</td>
<td valign="top" width="80">0.00170</td>
</tr>
<tr>
<td valign="top" width="80">PDF</td>
<td valign="top" width="80">98.492</td>
<td valign="top" width="80">0.00430</td>
</tr>
<tr>
<td valign="top" width="80">PDF</td>
<td valign="top" width="80">95.267</td>
<td valign="top" width="80">0.03972</td>
</tr>
<tr>
<td valign="top" width="80">PNG</td>
<td valign="top" width="80">99.276</td>
<td valign="top" width="80">0.00040</td>
</tr>
<tr>
<td valign="top" width="80">PNG</td>
<td valign="top" width="80">99.086</td>
<td valign="top" width="80">0.00063</td>
</tr>
<tr>
<td valign="top" width="80">MESH</td>
<td valign="top" width="80">38.591</td>
<td valign="top" width="80">0.00512</td>
</tr>
<tr>
<td valign="top" width="80">ANIM</td>
<td valign="top" width="80">20.849</td>
<td valign="top" width="80">0.00152</td>
</tr>
<tr>
<td valign="top" width="80">SMD</td>
<td valign="top" width="80">15.971</td>
<td valign="top" width="80">0.00518</td>
</tr>
<tr>
<td valign="top" width="80">TXT</td>
<td valign="top" width="80">51.581</td>
<td valign="top" width="80">0.00079</td>
</tr>
<tr>
<td valign="top" width="80">TXT</td>
<td valign="top" width="80">49.976</td>
<td valign="top" width="80">0.00052</td>
</tr>
<tr>
<td valign="top" width="80">HDR</td>
<td valign="top" width="80">89.331</td>
<td valign="top" width="80">0.06100</td>
</tr>
<tr>
<td valign="top" width="80">WAV</td>
<td valign="top" width="80">93.001</td>
<td valign="top" width="80">0.01503</td>
</tr>
<tr>
<td valign="top" width="80">WAV</td>
<td valign="top" width="80">97.113</td>
<td valign="top" width="80">0.00956</td>
</tr>
<tr>
<td valign="top" width="80">WAV</td>
<td valign="top" width="80">99.146</td>
<td valign="top" width="80">0.05368</td>
</tr>
<tr>
<td valign="top" width="80">WAV</td>
<td valign="top" width="80">99.346</td>
<td valign="top" width="80">0.00570</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Decompression Details:</p>
<table border="1" cellspacing="0" cellpadding="2" width="370">
<tbody>
<tr>
<td valign="top" width="89">&nbsp;</td>
<td valign="top" width="94"><strong>Doboz</strong></td>
<td valign="top" width="89"><strong>Yappy</strong></td>
<td valign="top" width="96"><strong>Snappy</strong></td>
</tr>
<tr>
<td valign="top" width="92"><strong>File Type</strong></td>
<td valign="top" width="98"><strong>S</strong></td>
<td valign="top" width="93"><strong>S</strong></td>
<td valign="top" width="100"><strong>S</strong></td>
</tr>
<tr>
<td valign="top" width="91">BMP</td>
<td valign="top" width="99">0.00540</td>
<td valign="top" width="95">0.00067</td>
<td valign="top" width="101">0.00114</td>
</tr>
<tr>
<td valign="top" width="91">BMP</td>
<td valign="top" width="99">0.00757</td>
<td valign="top" width="95">0.00556</td>
<td valign="top" width="102">0.01270</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.02847</td>
<td valign="top" width="95">0.00675</td>
<td valign="top" width="103">0.01048</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.00452</td>
<td valign="top" width="95">0.00294</td>
<td valign="top" width="103">0.00359</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.00114</td>
<td valign="top" width="95">0.00053</td>
<td valign="top" width="103">0.00110</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.01542</td>
<td valign="top" width="95">0.00680</td>
<td valign="top" width="103">0.01513</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.00218</td>
<td valign="top" width="95">0.00075</td>
<td valign="top" width="103">0.00156</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.00132</td>
<td valign="top" width="95">0.00055</td>
<td valign="top" width="103">0.00124</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.02774</td>
<td valign="top" width="95">0.00535</td>
<td valign="top" width="103">0.01060</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.01797</td>
<td valign="top" width="95">0.00713</td>
<td valign="top" width="103">0.01974</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.00040</td>
<td valign="top" width="95">0.00017</td>
<td valign="top" width="103">0.00040</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.00074</td>
<td valign="top" width="95">0.00029</td>
<td valign="top" width="103">0.00021</td>
</tr>
<tr>
<td valign="top" width="90">DDS</td>
<td valign="top" width="98">0.04511</td>
<td valign="top" width="95">0.02750</td>
<td valign="top" width="103">0.05855</td>
</tr>
<tr>
<td valign="top" width="90">X</td>
<td valign="top" width="98">0.00023</td>
<td valign="top" width="95">0.00017</td>
<td valign="top" width="103">0.00034</td>
</tr>
<tr>
<td valign="top" width="90">JPG</td>
<td valign="top" width="98">0.00059</td>
<td valign="top" width="95">0.00054</td>
<td valign="top" width="103">0.00118</td>
</tr>
<tr>
<td valign="top" width="90">PDF</td>
<td valign="top" width="98">0.00260</td>
<td valign="top" width="95">0.00249</td>
<td valign="top" width="103">0.00308</td>
</tr>
<tr>
<td valign="top" width="90">PDF</td>
<td valign="top" width="98">0.02046</td>
<td valign="top" width="95">0.01731</td>
<td valign="top" width="103">0.02017</td>
</tr>
<tr>
<td valign="top" width="90">PNG</td>
<td valign="top" width="98">0.00001</td>
<td valign="top" width="95">0.00001</td>
<td valign="top" width="103">0.00001</td>
</tr>
<tr>
<td valign="top" width="90">PNG</td>
<td valign="top" width="98">0.00001</td>
<td valign="top" width="95">0.00001</td>
<td valign="top" width="103">0.00001</td>
</tr>
<tr>
<td valign="top" width="90">MESH</td>
<td valign="top" width="98">0.00197</td>
<td valign="top" width="95">0.00085</td>
<td valign="top" width="103">0.00284</td>
</tr>
<tr>
<td valign="top" width="90">ANIM</td>
<td valign="top" width="98">0.00019</td>
<td valign="top" width="95">0.00013</td>
<td valign="top" width="103">0.00129</td>
</tr>
<tr>
<td valign="top" width="90">SMD</td>
<td valign="top" width="98">0.00214</td>
<td valign="top" width="95">0.00180</td>
<td valign="top" width="103">0.00479</td>
</tr>
<tr>
<td valign="top" width="90">TXT</td>
<td valign="top" width="98">0.00020</td>
<td valign="top" width="95">0.00012</td>
<td valign="top" width="103">0.00029</td>
</tr>
<tr>
<td valign="top" width="90">TXT</td>
<td valign="top" width="98">0.00009</td>
<td valign="top" width="95">0.00005</td>
<td valign="top" width="103">0.00012</td>
</tr>
<tr>
<td valign="top" width="90">HDR</td>
<td valign="top" width="98">0.03745</td>
<td valign="top" width="95">0.00647</td>
<td valign="top" width="103">0.01246</td>
</tr>
<tr>
<td valign="top" width="90">WAV</td>
<td valign="top" width="98">0.00334</td>
<td valign="top" width="95">0.00302</td>
<td valign="top" width="103">0.00409</td>
</tr>
<tr>
<td valign="top" width="90">WAV</td>
<td valign="top" width="98">0.00269</td>
<td valign="top" width="95">0.00242</td>
<td valign="top" width="103">0.00431</td>
</tr>
<tr>
<td valign="top" width="90">WAV</td>
<td valign="top" width="98">0.02631</td>
<td valign="top" width="95">0.00529</td>
<td valign="top" width="103">0.00710</td>
</tr>
<tr>
<td valign="top" width="90">WAV</td>
<td valign="top" width="98">0.00233</td>
<td valign="top" width="95">0.00221</td>
<td valign="top" width="103">0.00455</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="2" width="370">
<tbody>
<tr>
<td valign="top" width="89">&nbsp;</td>
<td valign="top" width="94"><strong>LZF</strong></td>
<td valign="top" width="89"><strong>FastLZ</strong></td>
<td valign="top" width="96"><strong>QuickLZ</strong></td>
</tr>
<tr>
<td valign="top" width="92"><strong>File Type</strong></td>
<td valign="top" width="98"><strong>S</strong></td>
<td valign="top" width="93"><strong>S</strong></td>
<td valign="top" width="100">S</td>
</tr>
<tr>
<td valign="top" width="91">BMP</td>
<td valign="top" width="91">0.00276</td>
<td valign="top" width="91">0.00416</td>
<td valign="top" width="91">0.00679</td>
</tr>
<tr>
<td valign="top" width="91">BMP</td>
<td valign="top" width="91">0.01091</td>
<td valign="top" width="91">0.01349</td>
<td valign="top" width="91">0.01799</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.01478</td>
<td valign="top" width="91">0.01770</td>
<td valign="top" width="91">0.00538</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.00542</td>
<td valign="top" width="91">0.00613</td>
<td valign="top" width="91">0.00290</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.00107</td>
<td valign="top" width="91">0.00126</td>
<td valign="top" width="91">0.00243</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.01122</td>
<td valign="top" width="91">0.01429</td>
<td valign="top" width="91">0.02223</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.00187</td>
<td valign="top" width="91">0.00234</td>
<td valign="top" width="91">0.00536</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.00129</td>
<td valign="top" width="91">0.00157</td>
<td valign="top" width="91">0.00305</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.01678</td>
<td valign="top" width="91">0.02031</td>
<td valign="top" width="91">0.03722</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.01649</td>
<td valign="top" width="91">0.01970</td>
<td valign="top" width="91">0.03277</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.00041</td>
<td valign="top" width="91">0.00047</td>
<td valign="top" width="91">0.00082</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.00054</td>
<td valign="top" width="91">0.00067</td>
<td valign="top" width="91">0.00011</td>
</tr>
<tr>
<td valign="top" width="91">DDS</td>
<td valign="top" width="91">0.04369</td>
<td valign="top" width="91">0.05458</td>
<td valign="top" width="91">0.08630</td>
</tr>
<tr>
<td valign="top" width="91">X</td>
<td valign="top" width="91">0.00036</td>
<td valign="top" width="91">0.00040</td>
<td valign="top" width="91">0.00047</td>
</tr>
<tr>
<td valign="top" width="91">JPG</td>
<td valign="top" width="91">0.00092</td>
<td valign="top" width="91">0.00119</td>
<td valign="top" width="91">0.00057</td>
</tr>
<tr>
<td valign="top" width="91">PDF</td>
<td valign="top" width="91">0.00403</td>
<td valign="top" width="91">0.00379</td>
<td valign="top" width="91">0.00221</td>
</tr>
<tr>
<td valign="top" width="91">PDF</td>
<td valign="top" width="91">0.02469</td>
<td valign="top" width="91">0.02823</td>
<td valign="top" width="91">0.01733</td>
</tr>
<tr>
<td valign="top" width="91">PNG</td>
<td valign="top" width="91">0.00002</td>
<td valign="top" width="91">0.00002</td>
<td valign="top" width="91">0.00001</td>
</tr>
<tr>
<td valign="top" width="91">PNG</td>
<td valign="top" width="91">0.00003</td>
<td valign="top" width="91">0.00004</td>
<td valign="top" width="91">0.00001</td>
</tr>
<tr>
<td valign="top" width="91">MESH</td>
<td valign="top" width="91">0.00192</td>
<td valign="top" width="91">0.00213</td>
<td valign="top" width="91">0.00528</td>
</tr>
<tr>
<td valign="top" width="91">ANIM</td>
<td valign="top" width="91">0.00019</td>
<td valign="top" width="91">0.00021</td>
<td valign="top" width="91">0.00049</td>
</tr>
<tr>
<td valign="top" width="91">SMD</td>
<td valign="top" width="91">0.00292</td>
<td valign="top" width="91">0.00324</td>
<td valign="top" width="91">0.00441</td>
</tr>
<tr>
<td valign="top" width="91">TXT</td>
<td valign="top" width="91">0.00025</td>
<td valign="top" width="91">0.00134</td>
<td valign="top" width="91">0.00041</td>
</tr>
<tr>
<td valign="top" width="91">TXT</td>
<td valign="top" width="91">0.00032</td>
<td valign="top" width="91">0.00013</td>
<td valign="top" width="91">0.00017</td>
</tr>
<tr>
<td valign="top" width="91">HDR</td>
<td valign="top" width="91">0.01578</td>
<td valign="top" width="91">0.01920</td>
<td valign="top" width="91">0.00687</td>
</tr>
<tr>
<td valign="top" width="91">WAV</td>
<td valign="top" width="91">0.00485</td>
<td valign="top" width="91">0.00668</td>
<td valign="top" width="91">0.02031</td>
</tr>
<tr>
<td valign="top" width="91">WAV</td>
<td valign="top" width="91">0.00393</td>
<td valign="top" width="91">0.00441</td>
<td valign="top" width="91">0.00260</td>
</tr>
<tr>
<td valign="top" width="91">WAV</td>
<td valign="top" width="91">0.01349</td>
<td valign="top" width="91">0.02018</td>
<td valign="top" width="91">0.00550</td>
</tr>
<tr>
<td valign="top" width="91">WAV</td>
<td valign="top" width="91">0.00467</td>
<td valign="top" width="91">0.00572</td>
<td valign="top" width="91">0.00242</td>
</tr>
</tbody>
</table>
<table border="1" cellspacing="0" cellpadding="2" width="205">
<tbody>
<tr>
<td valign="top" width="126">&nbsp;</td>
<td valign="top" width="77"><strong>LZ4</strong></td>
</tr>
<tr>
<td valign="top" width="135"><strong>File Type</strong></td>
<td valign="top" width="85"><strong>S</strong></td>
</tr>
<tr>
<td valign="top" width="135">BMP</td>
<td valign="top" width="88">0.00145</td>
</tr>
<tr>
<td valign="top" width="134">BMP</td>
<td valign="top" width="89">0.00668</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00939</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00319</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00075</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00831</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00107</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00086</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.01101</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.01046</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00026</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.00021</td>
</tr>
<tr>
<td valign="top" width="133">DDS</td>
<td valign="top" width="90">0.03002</td>
</tr>
<tr>
<td valign="top" width="133">X</td>
<td valign="top" width="90">0.00026</td>
</tr>
<tr>
<td valign="top" width="133">JPG</td>
<td valign="top" width="90">0.00086</td>
</tr>
<tr>
<td valign="top" width="133">PDF</td>
<td valign="top" width="90">0.00276</td>
</tr>
<tr>
<td valign="top" width="133">PDF</td>
<td valign="top" width="90">0.01641</td>
</tr>
<tr>
<td valign="top" width="133">PNG</td>
<td valign="top" width="90">0.00001</td>
</tr>
<tr>
<td valign="top" width="133">PNG</td>
<td valign="top" width="90">0.00002</td>
</tr>
<tr>
<td valign="top" width="133">MESH</td>
<td valign="top" width="90">0.00128</td>
</tr>
<tr>
<td valign="top" width="133">ANIM</td>
<td valign="top" width="90">0.00013</td>
</tr>
<tr>
<td valign="top" width="133">SMD</td>
<td valign="top" width="90">0.00228</td>
</tr>
<tr>
<td valign="top" width="133">TXT</td>
<td valign="top" width="90">0.00017</td>
</tr>
<tr>
<td valign="top" width="133">TXT</td>
<td valign="top" width="90">0.00009</td>
</tr>
<tr>
<td valign="top" width="133">HDR</td>
<td valign="top" width="90">0.01020</td>
</tr>
<tr>
<td valign="top" width="133">WAV</td>
<td valign="top" width="90">0.00393</td>
</tr>
<tr>
<td valign="top" width="133">WAV</td>
<td valign="top" width="90">0.00239</td>
</tr>
<tr>
<td valign="top" width="133">WAV</td>
<td valign="top" width="90">0.00535</td>
</tr>
<tr>
<td valign="top" width="133">WAV</td>
<td valign="top" width="90">0.00250</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p>Current source can be grabbed here (mostly platform-agnostic test suite library with a C# GUI and C++/CLI for interop):<br />
GitHub: <a href="https://github.com/richard-sim/Compression-Test-Suite">https://github.com/richard-sim/Compression-Test-Suite</a><br />
Zipped: <a title="http://technofumbles.com/files/CompressionTest.zip" href="http://technofumbles.com/files/CompressionTest.zip">http://technofumbles.com/files/CompressionTest.zip</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/04/22/survey-of-fast-compression-algorithms-part-1/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Tips for High Performance Art</title>
		<link>http://www.altdevblogaday.com/2011/02/21/tips-for-high-performance-art/</link>
		<comments>http://www.altdevblogaday.com/2011/02/21/tips-for-high-performance-art/#comments</comments>
		<pubDate>Mon, 21 Feb 2011 07:04:48 +0000</pubDate>
		<dc:creator>Richard Sim</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/02/21/tips-for-high-performance-art/</guid>
		<description><![CDATA[<p>While performance is often thought of as a programmers problem, the truth is that even some simple changes to how art is authored can have a drastic affect on a games performance. Unfortunately programmers suck at divulging much of this information &#8211; something I hope to remedy somewhat in this post. As with anything performance related, this isn&#8217;t an absolute list of rules to live by &#8211; some will depend on the architecture of the engine you&#8217;re working with, others on the particular scene, and yet others on the artistic look and style of the game. It&#8217;s also by no means comprehensive; I think this will likely spill over into another blog post. It&#8217;s best to discuss with your rendering team how (and if) each of these impact your game.</p>
<p><a href="http://www.altdevblogaday.com/2011/02/21/tips-for-high-performance-art/" class="more-link">Read more on Tips for High Performance Art&#8230;</a></p>
]]></description>
				<content:encoded><![CDATA[<p>While performance is often thought of as a programmers problem, the truth is that even some simple changes to how art is authored can have a drastic affect on a games performance. Unfortunately programmers suck at divulging much of this information &#8211; something I hope to remedy somewhat in this post. As with anything performance related, this isn&#8217;t an absolute list of rules to live by &#8211; some will depend on the architecture of the engine you&#8217;re working with, others on the particular scene, and yet others on the artistic look and style of the game. It&#8217;s also by no means comprehensive; I think this will likely spill over into another blog post. It&#8217;s best to discuss with your rendering team how (and if) each of these impact your game.</p>
<h4>Pixel Quads and Pixie Dust</h4>
<p>A few days ago an artist asked me for information on specular behaviour for materials, to which I sent him a link to the post <a href="http://filmicgames.com/archives/547">Everything is Shiny</a> over on the excellent Filmic Games blog. While browsing the site, he came across the post <a href="http://filmicgames.com/archives/534">Where are my sub-pixel triangles???</a>, which discusses performance issues arising from small triangles in meshes. Amazed that he&#8217;d never heard of such issues he came back and asked me if it really was true &#8211; and it is. It&#8217;s just never really discussed beyond the programming tracks at GDC, Gamefest, and so on. By the time it gets to artists it probably has been reduced to &quot;make sure there are LODs&quot;, with not further details on what this means or why they need to exist. After all, LODs just reduce the vertex count &#8211; that couldn&#8217;t possibly affect the pixel shading performance! Right? It turns out that this is absolutely incorrect, and LODs have in fact a dramatic affect on pixel shading performance.</p>
<p>What. The. Hell. Yeah, it sounds odd. Your LOD is half the vertex count of the full-resolution mesh but still takes up exactly the same number of pixels on screen as the full mesh at the same distance from the camera, however the pixel shading performance of the full mesh is much lower than that of the LOD?! This is because there is a trade-off in the hardware between the size of triangles and pixel shader performance. The trade-off varies between hardware, and in some cases can be very extreme, but it never doesn&#8217;t exist.</p>
<p>Being a hardware trade-off this does mean that I have to explain a bit about how the hardware works when a triangle is rendered.</p>
<p>The process of rendering a mesh goes something like this:</p>
<p><strong>Vertex processing (vertex shader) -&gt; MAGIC –&gt; Pixel processing (pixel shader)</strong></p>
<p>What is the MAGIC step? That depends on the platform, but the general formula is that each triangle is broken into 2&#215;2 blocks of pixels called quads, and then some (potentially large) number of quads are run through the pixel shader at once. As the X360 has a lot of great documentation on this publicly available from Gamefest, let&#8217;s take that as an example (the PS3 isn&#8217;t all that different anyway).</p>
<p>Putting this together, we get:</p>
<p><strong>Vertex processing –&gt; Triangles –&gt; Quads -&gt; 16-Quads –&gt; Pixel processing</strong></p>
<p>This might start to ring alarm bells as to why small triangles are expensive. To take the worst-case that you have a single 1 pixel triangle, for that single pixel you might as well be executing the pixel shader 64 (2*2*16) times! If you have 64 single-pixel triangles so there are enough quads generated to fill a full pixel vector, you will still at best have 25% pixel shading efficiency due to the 2&#215;2 quads. To put this another way, the lighting, texture filtering, and all-round shiny-awesomeness of the pixels could be FOUR times as complex if we avoid these cases. There&#8217;s nothing that anybody but the artist creating the mesh can do about this either (other than a programmer running some ugly automatic decimation algorithm on the mesh in the pipeline, which I&#8217;ve never seen any artist happy about &#8211; for good reason). You won&#8217;t be able to make a perfect mesh, but it&#8217;s important to make a good one.</p>
<p>This can be distilled down to a simple ratio for easy comparison: vertex to pixel quad density. Ask a rendering programmer to show you how to figure this out for your art, or see the presentations listed in the References section at the end of this post.</p>
<p>A few other random stats pulled from various Gamefest presentations:</p>
<ul>
<li>Triangles that cover 2&#215;2 pixels waste 60% or more of the pixel shading performance </li>
<li>Going from 2&#215;2 pixel triangles to 4&#215;4 can increase the pixel shading performance by 33% </li>
</ul>
<h4>Overdraw Overload</h4>
<p>The cost of overdraw is proportional to the speed at which memory can be written to of the platform and the size of the screen. It may come as a surprise to many, but the PS2 actually performed better in this area than the X360 and PS3 (or even most modern PC graphics cards). As such, overdraw is actually quite significantly more expensive for this generation of consoles than it was for the previous (at least, on the PS2). We are saved somewhat by more flexible hardware with optimizations to fight the cost of overdraw, but those unfortunately don&#8217;t help when the overdraw consists of alpha-blended geometry (particles are obviously the worst for this).</p>
<p>So uh&#8230; that&#8217;s about it &#8211; overdraw is still a terrible problem for alpha-blended geometry, so try to reduce the number of layers of overdraw as much as possible.</p>
<h4>Light, Shadow and Their Dark Interactions</h4>
<p>Low-angle light directions are the enemy of efficient shadows, as they require far more objects to be classified as casting shadows for a frame than otherwise. The easiest way to look at this is that the length of the shadow that an object casts directly relates to how expensive it will be to be shadowed. This isn&#8217;t about the actual cost of calculating the shadow for the particular object, but about the cost to include it in the shadow calculations because the longer a shadow than an object can cast, the further outside of the current cameras view it must still be evaluated since it could be casting a shadow over something that is visible to the camera.</p>
<p>It doesn&#8217;t help that these low-angle light directions make for the most interesting lighting environments of course, so a compromise will probably have to be reached between the art and programming teams.</p>
<h4>Death by Draw Calls</h4>
<p>Everyone hates unnecessary bookkeeping; it&#8217;s red tape in the way of getting things done, and pulls you away from what you really want to be doing. Generally speaking, if you have different materials (shaders, textures, lighting values, etc.) applied to different parts of a mesh, it will have to be split up by the engine and each piece rendered individually. When you have multiple meshes on multiple objects split into multiple parts, you&#8217;re cutting down the amount of useful work that the GPU and engine can do as it&#8217;s having to do a lot of bookkeeping instead.</p>
<p>Try to use texture pages wherever possible, UV some parts of a mesh to a black part of the specular texture rather than a separate material with no specular, and weld together any meshes that can be.</p>
<h4>Summary</h4>
<p>This is about half of the items that I wanted to cover in this post, so it&#8217;ll definitely be covered further in my next blog post. But for now that should be plenty to chew on, and certainly covers a lot of the bigger issues affecting performance of art.</p>
<h4>References</h4>
<p><a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=9bb4302c-3519-4f1f-bda0-a5e582af34ce&amp;displaylang=en">Technical Art Reviews: Getting the Most Out of your Content</a>, Cameron Egbert, Gamefest 2010     <br /><a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=98a47b48-dae4-471c-a6a8-e75b287b8ee5&amp;displaylang=en">PIX for Artists</a>, Alan Murphy, Gamefest 2010     <br /><a href="http://www.microsoft.com/downloads/en/details.aspx?FamilyId=37F8B74D-F170-4B93-9122-0BFC581F9E99&amp;displaylang=en">Xbox Textures – Formats, Conversion, Fetching, and Performance</a>, David Cook and Jason Gould, Gamefest 2008     <br /><a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=0459dc4a-8c47-411e-b118-739a7b150deb&amp;displaylang=en">Xbox 360 Shaders and Performance: How Not to Upset the GPU</a>, Cody Pritchard, Gamefest 2010     <br /><a href="http://www.microsoft.com/downloads/en/details.aspx?familyid=94b62929-fd8b-4f94-80e7-539d857930de&amp;displaylang=en">Building an Über-Fast Crowd Renderer for Your Next Xbox 360 Engine</a>, Tomas Vykruta, Gamefest 2010     <br /><a href="http://www.microsoftgamefest.com/pastconferences.htm">Past Gamefest Presentations</a></p>
<p>&#160;</p>
<p><em>This was originally posted on my blog, </em><a href="http://www.technofumbles.com/weblog/2011/02/21/tips-for-high-performance-art/"><em>Technofumbles</em></a><em>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/02/21/tips-for-high-performance-art/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>The Importance of Personal Projects</title>
		<link>http://www.altdevblogaday.com/2011/02/06/the-importance-of-personal-projects/</link>
		<comments>http://www.altdevblogaday.com/2011/02/06/the-importance-of-personal-projects/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 02:31:00 +0000</pubDate>
		<dc:creator>Richard Sim</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/02/06/the-importance-of-personal-projects/</guid>
		<description><![CDATA[<p>Personal projects are an often overlooked part of a professional career – be  it games, embedded, or even web development. There’s only so much you will be  exposed to in an office environment, where you can lean on others for areas that  aren’t your specialty. But when it comes to personal projects, you have to be a  jack of all trades.</p>
<p><a href="http://www.altdevblogaday.com/2011/02/06/the-importance-of-personal-projects/" class="more-link">Read more on The Importance of Personal Projects&#8230;</a></p>
]]></description>
				<content:encoded><![CDATA[<p>Personal projects are an often overlooked part of a professional career – be  it games, embedded, or even web development. There’s only so much you will be  exposed to in an office environment, where you can lean on others for areas that  aren’t your specialty. But when it comes to personal projects, you have to be a  jack of all trades.</p>
<p>This is the reason I ask about hobbies and personal projects of those who I  interview and those for whom I interview with (interviews go both ways  remember!). It’s not something I ask because I want to know if you’ll be my  buddy, even though that is very important factor in selecting coworkers in my  opinion, but because it is one of the most clear indicators of a curious and  active mind – and that trait is very important. An engineering team with curious  and active minds is the cornerstone of a solid development process. They are the  ones who will be the most forward-looking, identifying the potential pitfalls  ahead and working to avoid them now, because <em>they’re thinking</em>. They  will be versatile, because <em>they’re used to it</em>. They will actively  improve the codebase, systems and procedures, because <em>they want to work  somewhere that they enjoy what they work with</em>.<br />
Great work is not  achieved by punching a clock, and someone who is curious will work on the  problem because they <em>want</em> to solve it. This isn’t to say that I like  curious coworkers because they do lots of overtime – my opinion on overtime is  not positive at all – quite the opposite in fact. I don’t really care the hours  you do if you’re doing a great job in that time and not slacking off. The  unfortunate reality of the games industry is that you will be doing overtime,  and that overtime will make up for any short days taken. If you’re making no  progress on a problem I’d much rather see my team take off early and relax than  sit around bored and frustrated – then when the solution finally comes you’ll be  fresh and happy to work hard on doing a <em>great</em> job rather than burnt out  and doing just a <em>good</em> job.</p>
<p>Of course that isn’t to say that if you don’t have any personal projects on  the go that you don’t have a curious and active mind, only that it’s an a clear  indicator in an interview; I know plenty of great engineers who don’t fit this  profile, and there’s nothing wrong with that. There will be things that you’ll  miss out on though, because often there isn’t time in the schedule to bring  someone up to speed on a new area, meaning that if you don’t already know it,  you won’t get the opportunity to learn. This isn’t for any malicious reason;  it’s simply the reality of schedules.</p>
<p>There’s no reason that a personal project has to be directly related to your  daily work. If it was, that’d be little more than homework. Not much fun there  if that’s all you do. For instance, my personal projects are usually a mix of  embedded (electronics and low-level programming), Android (mobile programming  and OpenGL), and the occasional work-related R&amp;D. What counts is that you’re  pushing yourself to learn, and having fun doing it.</p>
<p><em>Originally posted to <a href="http://www.technofumbles.com/weblog/2011/02/05/the-importance-of-personal-projects/">Technofumbles</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/02/06/the-importance-of-personal-projects/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Intuition for Gamma Correct Rendering</title>
		<link>http://www.altdevblogaday.com/2011/01/22/intuition-for-gamma-correct-rendering/</link>
		<comments>http://www.altdevblogaday.com/2011/01/22/intuition-for-gamma-correct-rendering/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 06:39:00 +0000</pubDate>
		<dc:creator>Richard Sim</dc:creator>
		
		<guid isPermaLink="false">http://altdevblogaday.org/2011/01/22/intuition-for-gamma-correct-rendering/</guid>
		<description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">I want to start out by&#160;apologising&#160;for a lack of pretty graphics in here, which is a little odd for a post about visual quality. It&#8217;s a simple answer as to why this is though &#8211; I&#8217;m currently typing this on my laptop, watching as the Windows 7 system recovery progress bar loops on the screen of my main PC (uh&#8230; yeah, it&#8217;s behaving a little odd. But that&#8217;s another topic entirely).</p>
<p><a href="http://www.altdevblogaday.com/2011/01/22/intuition-for-gamma-correct-rendering/" class="more-link">Read more on Intuition for Gamma Correct Rendering&#8230;</a></p>
]]></description>
				<content:encoded><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">I want to start out by&nbsp;apologising&nbsp;for a lack of pretty graphics in here, which is a little odd for a post about visual quality. It&rsquo;s a simple answer as to why this is though &ndash; I&rsquo;m currently typing this on my laptop, watching as the Windows 7 system recovery progress bar loops on the screen of my main PC (uh&hellip; yeah, it&rsquo;s behaving a little odd. But that&rsquo;s another topic entirely).</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">Ok, now that you know you&rsquo;re in for a lot of monotonous text, let&rsquo;s get on with it!</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">Gamma correct rendering may sound like a simple enough concept at first, but to do it correctly can be very challenging &ndash; especially once you throw hardware variations into the mix. Possibly worse yet is that it is something you must keep in mind throughout development, and educate your teammates about. Or you ignore the issue completely and live with the consequences, but it will come around to bite you down the road. Repeatedly.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">First some definitions:</p>
<ul>
<li>&lt;Gamma/sRGB/Linear&gt; space<br />The curve of raw data values to represented values for the data that you&rsquo;re working with (could by bytes, floats, or rgb triple). Linear is easy as it&rsquo;s an exact match. Gamma and sRGB on the other hand are not identical, and instead define a curve that gives more raw data values to the lower ranges of the represented values compared to the higher ranges. For the purpose of this post, we&rsquo;ll call gamma and sRGB the same thing (though they aren&rsquo;t necessarily this way, as sRGB refers to a very specific curve, while gamma can be anything).</li>
<li>To gamma a texture/value<br />To convert from linear space to gamma space. This will result in raw linear values (the same as their represented values) of 0.2 going to raw gamma values of ~0.5 (but still representing 0.2). The exact values depend on the curve of the gamma space that you convert to of course.</li>
<li>To degamma a texture/value<br />The opposite of the above; to convert from gamma space to linear space by applying the inverse of the gamma curve. So, with the above example you would get back the original linear raw value of 0.2 from the gamma value ~0.5.</li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">So what does it really take to be gamma correct? There are 3 primary areas of concern: the pipeline, the shader, and the render target.</p>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">The Pipeline and Tools</p>
<ul>
<li>Some of the source data that you&rsquo;re given will be in gamma space, and other source data will be in linear space. The pipeline has to know what it has, and what it should do with it. Easier said than done, as this requires meta data to be present &ndash; either artist-set or automatically-set based on usage. Having artists specify what everything should be interpreted as is obviously the easiest choice when faced with having to shoehorn gamma correct behaviour into an existing pipeline without the backend architecture to support it, but does carry with it the consequence that user-errors will be abundant.</li>
<li>If you&rsquo;re going to perform any processing on textures in the pipeline (resizing, mipmap generation, blending the edges of cubemap faces, etc), the operations must be done in linear space. The gotcha with this is that you must operate with as much precision as possible throughout this process to avoid issues with quantization due to the conversion to linear space and back again. This usually means converting to a floating point texture immediately, and only converting back as the very last step. Yes, and you&rsquo;ll probably have issues achieving this with some of the external libraries you use. So go and modify them too (and diverge from what&rsquo;s in SVN, making taking updates all that much harder). Fun stuff.</li>
<li>The final conversion to gamma space after you&rsquo;ve done your processing may also bite you due to hardware variations. If you&rsquo;re lucky you&rsquo;ll only be targeting platforms that have proper support for sRGB &ndash; but many are not so lucky and as such will be in for a world of fiddly pain thanks to . But at least it&rsquo;s documented now, which has only happened in the last couple of years. Extremely fun stuff.</li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">The Shader</p>
<ul>
<li>Everything you do in a shader should be in linear space. Simple.</li>
<li>There are states that you can set on the various platforms to automatically convert textures when sampled from gamma space to linear space, but these states do live in different places for different platforms.</li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">The Render Target</p>
<ul>
<li>The joys of hardware variations will strike you severely here, and throw a spanner (wrench for those of North American&nbsp;heritage) in the works.</li>
<li>Frame buffers are usually stored in gamma space and you output linear space values from the pixel shader. Thus, blending the output of the pixel shader with the frame buffer can be done in linear space (correct) or gamma space (incorrect) depending on the platform. DX9 and the PS3 will do it incorrectly, but DX10+ and the X360 will do it correctly.</li>
</ul>
<p style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding: 0px;">Here&rsquo;s a spoiler: not everything should be gamma corrected at every step. But what does that mean? Why is that? Well, that&rsquo;s exactly what this post is about!</p>
<p>&nbsp;</p>
<p><em>Continued at&nbsp;<a href="http://www.technofumbles.com/weblog/2011/01/21/intuition-for-gamma-correct-rendering/">Intuition for Gamma Correct Rendering</a> at TechnoFumbles&#8230;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.altdevblogaday.com/2011/01/22/intuition-for-gamma-correct-rendering/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.827 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2013-05-24 11:50:42 -->
<!-- Compression = gzip -->