<?xml version="1.0"?>
<!-- name="generator" content="blosxom/2.0" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>Steven Tattersall's Accreted Drivel   </title>
    <link>http://www.clarets.org/steve/blosxom.cgi</link>
    <description></description>
    <language>en</language>
<div id="frontinfo">My name is Steven Tattersall and I make computer games.
                Here are some of the latest things I have posted.</div>
  <item>
    <title>Personal Reading List, 2009</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2010/01/16#reading_list_2009</link>
    <description>
&lt;p&gt;2009 saw a jump in the number of books read, from 25 to 43.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0307278980&quot;&gt;The Way Some People Die&lt;/a&gt;&amp;#8221;, Ross MacDonald (reread) (2nd Jan)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0307279065&quot;&gt;The Blue Hammer&lt;/a&gt;&amp;#8221;, Ross MacDonald (reread) (5th Jan)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0140621164&quot;&gt;Selected Tales&lt;/a&gt;&amp;#8221;, Edgar Allan Poe (19th Jan)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/1853260029&quot;&gt;Alice in Wonderland, Through the Looking Glass&lt;/a&gt;&amp;#8221;, Lewis Carroll (24th Jan)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/014062032X&quot;&gt;Around the World in Eighty Days&amp;#8221;&lt;/a&gt;, Jules Verne (29th Jan)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007232837&quot;&gt;Roseanna&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo (5th Feb)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007232845&quot;&gt;The Man Who Went Up In Smoke&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo (14th Feb)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0749922648&quot;&gt;Getting Things Done: How to Achieve Stress-free Productivity&lt;/a&gt;&amp;#8221;, David Allen (16th Feb)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0307279049&quot;&gt;The Doomsters&lt;/a&gt;&amp;#8221;, Ross MacDonald (26th Feb)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/1853260150&quot;&gt;The Picture of Dorian Gray&lt;/a&gt;&amp;#8221;, Oscar Wilde (1st March)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/000724293X&quot;&gt;The Man on the Balcony&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007242948&quot;&gt;The Laughing Policeman&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007242956&quot;&gt;The Fire Engine that Disappeared&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007242964&quot;&gt;Murder at the Savoy&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007242972&quot;&gt;The Abominable Man&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007242980&quot;&gt;The Locked Room&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0007242999&quot;&gt;Cop Killer&lt;/a&gt;&amp;#8221;, Maj Sjowall and Per Wahloo (reread)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Terrorists&amp;#8221;, Maj Sjowall and Per Wahloo&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Heckler&amp;#8221;, Ed McBain&lt;/li&gt;
	&lt;li&gt;&amp;#8220;No Beast So Fierce&amp;#8221;, Edward Bunker&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Siege of Krishnapur&amp;#8221;, J. G. Farrell&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The State of Africa&amp;#8221;, Martin Meredith&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Lady, Lady, I Did It!&amp;#8221;, Ed McBain&lt;/li&gt;
	&lt;li&gt;&amp;#8220;I Married A Communist&amp;#8221;, Philip Roth&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Ten Second Staircase&amp;#8221;, Christopher Fowler&lt;/li&gt;
        &lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/1851686762&quot;&gt;The Secret War with Iran&lt;/a&gt;&amp;#8221;, Ronen Bergman&lt;/li&gt;
        &lt;li&gt;&amp;#8220;Cop Hater&amp;#8221;, Ed McBain&lt;/li&gt;
        &lt;li&gt;&amp;#8220;The Thin Man&amp;#8221;, Dashiel Hammett&lt;/li&gt;
        &lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0224080237&quot;&gt;Bad Blood: the Secret Life of the Tour de France&lt;/a&gt;&amp;#8221;, Jeremy Whittle&lt;/li&gt;
        &lt;li&gt;&amp;#8220;&lt;a href=&quot;http://my.linkbaton.com/isbn/0224080172&quot;&gt;Rough Ride&lt;/a&gt;&amp;#8221;, Paul Kimmage&lt;/li&gt;
	&lt;li&gt;&amp;#8220;On Murder&amp;#8221;, de Quincey&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Art of the Idea&amp;#8221;, John Hunt&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Soul of a New Machine&amp;#8221;, Tracy Kidder&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Modern Con Man: How To Get Something For Nothing&amp;#8221;, Todd Robbins&lt;/li&gt;
	&lt;li&gt;&amp;#8220;A Most-Wanted Man&amp;#8221;, John Le Carre&lt;/li&gt;
	&lt;li&gt;&amp;#8220;White Corridor&amp;#8221;, Christopher Fowler&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Brave New World&amp;#8221;, Aldous Huxley&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Drowning Pool&amp;#8221;, Ross MacDonald (reread)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Black Money&amp;#8221;, Ross MacDonald (reread)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Horse&amp;#8217;s Arse&amp;#8221;, Charley Own&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Der Fall Galton&amp;#8221; (German translation), Ross MacDonald&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Big Blowdown&amp;#8221;, George P. Pelecanos&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Computer Vision: Principles and Practice&amp;#8221;&lt;/li&gt;
&lt;/ol&gt;

</description>
  </item>
  <item>
    <title>About Steve</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2009/08/10#steve</link>
    <description>
&lt;p&gt;It&amp;#8217;s no good running a web site unless you get a page to yourself, is it?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://www.clarets.org/steve/webcam.jpg&quot; alt=&quot;Steven Tattersall - Work webcam (old)&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;Steven Tattersall&lt;/h3&gt;


&lt;p&gt;I now work as Principal Programmer at &lt;a target=_top 
href=&quot;http://uk.scee.com&quot;&gt;Sony Computer Entertainment Europe&lt;/a&gt;, at its 
&lt;a href=&quot;http://www.worldwidestudios.net/cambridge&quot;&gt;Cambridge 
studio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Some past games and projects I have worked on are:&lt;/p&gt;

	&lt;ul&gt;
	&lt;li&gt;&lt;a target=_top href=&quot;http://www.medievil2.com&quot;&gt;Medievil 2&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a target=_top href=&quot;http://www.scee.com/c-12&quot;&gt;(c-12)&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;Some work on Primal (link &lt;a target=_top href=&quot;http://www.primalgame.com&quot;&gt;1&lt;/a&gt; 
		&lt;a target=_top href=&quot;http://uk.playstation.com/games/gamesinfo04_game.jhtml?localeTitleId=1037578&amp;linktype=FSRG&quot;&gt;2&lt;/a&gt;)&lt;/li&gt;

	&lt;li&gt;&lt;a href=&quot;http://www.ghosthunter-game.com/&quot;&gt;Ghosthunter&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;Some of the SCE E3 2005 demos that launched the Playstation 3&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.24-thegame.com/&quot;&gt;24: The Game&lt;/a&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href=&quot;http://www.playtvps3.com/&quot;&gt;PlayTV&lt;/a&gt;.&lt;/li&gt;

	&lt;/ul&gt;

&lt;p&gt;Other bits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;demos/index.html&quot;&gt;Older drivel&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a target=_top href=&quot;http://www.sourceforge.net/projects/freekick&quot;&gt;Freekick&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
</description>
  </item>
  <item>
    <title>GDC 2009 Report</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2009/08/07#gdc_2009_report</link>
    <description>&lt;p&gt;So, as usual, I&amp;#8217;m so late with my conference notes that the next big conference (Siggraph 2009) is already rolling round.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;GDC is big. Really big. You just won&amp;#8217;t believe how vastly hugely mindbogglingly big it is. I mean you may think it&amp;#8217;s a long way down the road to the chemist, but that&amp;#8217;s just peanuts to GDC.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;&amp;#8211; with apologies to Douglas Adams&lt;/p&gt;

&lt;p&gt;I really wasn&amp;#8217;t prepared for just how many people go to GDC. When you&amp;#8217;re used to the European version, going to a conference with 17,000 attendees is a real eye-opener.&lt;/p&gt;

&lt;p&gt;As with most write-ups, I&amp;#8217;ve got a bit tired towards the end. I&amp;#8217;ll try to go back later to bolster the detail in the later talks.&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;anchor-Wednesday&quot;&gt;&lt;/a&gt;Wednesday&lt;/h2&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-Keynote&quot;&gt;&lt;/a&gt;Keynote&lt;/h3&gt;

&lt;p&gt;I missed this (I was in a meeting). So I missed the free copy of Rhythm Heaven that was given out. Which is a shame because my
 admiration for Nintendo grows every month. You can find an exhaustive write-up on Wired &lt;span class=&quot;nobr&quot;&gt;
 &lt;a href=&quot;http://blog.wired.com/games/2009/03/gdc-live-blog-n.html&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-MediaMolecule%3A%27WingingIt%27Ups%2CDowns%2CMistakes%2CSuccessesintheMakingofLITTLEBIGPLANET&quot;&gt;&lt;/a&gt;
Media Molecule: &amp;#8216;Winging It&amp;#8217; - Ups, Downs, Mistakes, Successes in the Making of LITTLEBIGPLANET&lt;/h3&gt;

&lt;p&gt;Speaker: Alex Evans (Technical Director, Media Molecule), Mark Healey (Creative Director, Media Molecule)&lt;br/&gt;
&lt;a href=&quot;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9012&quot; 
rel=&quot;nofollow&quot;&gt;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9012&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://t-machine.org/index.php/2009/03/25/gdc09-making-of-little-big-planet-ups-downs-mistakes-successes/&quot; rel=&quot;nofollow&quot;&gt;Thorough write-up&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;The Molecules managed to more or less fill a big hall with their engagingly high-tech yet pseudo-shambolic talk. Using 
some custom code that Alex Evans had written on his Mac, they used diagrams draw in real time, pre-built images and text to paste 
together &amp;#8220;slides&amp;#8221; in real time on a virtual graph paper display. (At one point A.E. pulled down the screen to reveal some of 
the app&amp;#8217;s code. Tellingly the file was called &amp;#8220;craplib.cpp&amp;#8221;)&lt;/p&gt;

&lt;p&gt;They called their talk &amp;#8220;Winging It&amp;#8221; but really that does a slight injustice to how flexible &amp;#8211; or chaotic? &amp;#8211; 
their development process is. MM seem to be ruthless at reworking and refining their game during its development. As part 
of their talk they showed a video of Milestone 6 of LBP (which appeared to be an early Greenlight demo). The core of LBP 
was clearly there in many ways, with the cloth-feel graphics and the same intro-level music. On the other hand, as they 
admitted, they had gone down several blind alleys. One was the attempt of a giant beanstalk in the game, not suited to a 
2D platformer, and custom boss fights.&lt;/p&gt;

&lt;p&gt;Perhaps the biggest change, though, was in terms of level creation. Their original strategy was to use in-game tools 
such as a paintbrush and shotgun to affect the world, something you could see in the demo, with the sackboy avatar with 
a long paint roller in his hand, desperately trying to paint the world competently. This was all ditched later for the 
custom editor and Pop-It tools. This was a very late decision in the project, previously there had been a tension between 
the &amp;#8220;Level Designers&amp;#8221; and &amp;#8220;Pop-It Iterators&amp;#8221;.&lt;/p&gt;

&lt;p&gt;The culture of prototyping and the legacy of Lionhead was obvious. [If they want to try something]&amp;#8230; &amp;#8220;People just go 
ahead and do it&amp;#8221; said Mark Healey at one point, and he showed videos mockups of some features that team members created 
on their own initiative. It made you want to go out and just do something. Very inspiring. This is helped by the fact 
that as Alex said, they have a very small codebase, and all their technology is under their own control. I think he 
said 5 minutes for a full build, but that might be my fevered imagination.&lt;/p&gt;

&lt;p&gt;It clearly wasn&amp;#8217;t all plain sailing though. Mark mentioned that the team had nearly come to blows over the creation 
of Sackboy&amp;#8217;s design (they eventually had a &amp;#8220;face off&amp;#8221; to see who had the best design, then gave final say to one artist) 
and the integration of physics. It also took a long time to argue for the inclusion of the in-game mapped switches that 
LBP ended doing crazy things with, which seems such a fundamental component of the game that I&amp;#8217;m amazed. So, in all, the 
transition to the final &amp;#8220;Game Creation Package&amp;#8221; took a long time to take hold fully. And even then, with the first private 
Sony beta, for MM families and Sony employees, the levels created were so poor that they thought they had made an enormous 
mistake&amp;#8230;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: inspiring &amp;#8211; imaginative &amp;#8211; ninjas&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-Level5%27sTechniquestoProducingaHitGameFromPROFESSORLAYTONtoINAZUMAELEVENandTHEANOTHERWORLD&quot;&gt;&lt;/a&gt;Level-5&amp;#8217;s Techniques to Producing a Hit Game&amp;#8212;-From PROFESSOR LAYTON to INAZUMA ELEVEN and THE ANOTHER WORLD&lt;/h3&gt;

&lt;p&gt;Speaker: Akihiro Hino (CEO/President, LEVEL-5 Inc.), Usuke Kumagai (Programmer, Level-5, Inc.)&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9357&quot; rel=&quot;nofollow&quot;&gt;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9357&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;This talk was real-time translated, and I suspect it lost a little in the process. As well as doing 
&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Professor_Layton_and_the_Curious_Village&quot; rel=&quot;nofollow&quot;&gt;a franchise that is sweeping the world&lt;/a&gt;&lt;/span&gt;, Level 5 have at least two other games in production. There was also &amp;#8220;Inazuma Eleven&amp;#8221;, a combination of football game and RPG, and &amp;#8220;Ninokuni&amp;#8221; which is a collaboration with Studio Ghibli.&lt;/p&gt;

&lt;p&gt;Of all the words in the title, &amp;#8220;Hit&amp;#8221; seemed to be the point of the talk. The subtitle was &amp;#8220;how to make a fun game 
sellable&amp;#8221;. It concentrated on why they thought they made their games sell. The gist was: they have a promotional 
strategy set up even before the game went into full development.&lt;/p&gt;

&lt;p&gt;Through the power of a dodgy translation they cited two key elements that they used when selling a game&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&amp;#8220;Catch Copy Planning&amp;#8221;&lt;/b&gt; Subtitled as &amp;#8220;loading the weapons&amp;#8221;, this appeared to boil down to &amp;#8220;have key selling 
points in mind before you start&amp;#8221;. When thinking of game ideas Hino-san said that he imagined a conference presentation 
from it, and how the audience would react to it. For Professor Layton the 3 key ideas were&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Puzzles and story in the same game&lt;/li&gt;
	&lt;li&gt;The &amp;#8220;mental exercise&amp;#8221; theories of Dr &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Professor_Layton#History&quot; rel=&quot;nofollow&quot;&gt;Akiro Tago&lt;/a&gt;&lt;/span&gt;, who is extremely popular with children in Japan&lt;/li&gt;
	&lt;li&gt;Animation and voice acting beyond the quality of that seen before in a DS game (in Japan, the voice actors used are much more famous than those on other DS games).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;These ideas don&amp;#8217;t seem particularly revolutionary to us, but I think the key was that he had a clear idea of the products core strengths before setting out. In addition, they also produced a promo video before development started, setting out the key ideas to the development team, so that they also had a clear idea of what the project was meant to be. Very little gameplay was shown, even in videos which had been re-edited much later in development.&lt;/p&gt;

&lt;p&gt;The second half of &amp;#8220;Catch Copy Planning&amp;#8221; was to identify the core market for the game (the female market was identified for Professor Layton) and to match the game content to the market and pitch the game directly to them.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&amp;#8220;Boom Trigger&amp;#8221;&lt;/b&gt; Subtitled as &amp;#8220;Creating a big fire&amp;#8221;. This was suggested ways to make people talk to one another about the game (what they termed the &amp;#8220;Communication Gimmick&amp;#8221;) and extending the lifetime of the game (&amp;#8220;Extension Gimmick&amp;#8221;). So for Prof L the Communication Gimmick was asking friends to solve puzzles for them (possibly using the &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Nintendo_Wi-Fi_Connection&quot; rel=&quot;nofollow&quot;&gt;wi-fi connection&lt;/a&gt;&lt;/span&gt;?) The Extension Gimmick was the sheer number of subgames, and the ability to unlock and download new puzzles after the release date.&lt;/p&gt;

&lt;p&gt;So again, nothing too extraordinary, but it was noticeable that they applied these principles to all the other games they produced, including their football RPG.&lt;/p&gt;

&lt;p&gt;There was much excitement in the audience about the &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.onlineghibli.com&quot; rel=&quot;nofollow&quot;&gt;Ghibli&lt;/a&gt;&lt;/span&gt; tie-in. Including some footage of the new game. Akihiro Hino admitted to being like a schoolboy in their presence, which was quite sweet.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: hits &amp;#8211; boomtrigger &amp;#8211; cryptic&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-AnAmericanengineinTokyo%3AThecollaborationofEpicGamesandSquareEnixforTHELASTREMNANT&quot;&gt;&lt;/a&gt;An American engine in Tokyo: The collaboration of Epic Games and Square Enix for &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.metacritic.com/games/platforms/xbox360/lastremnant?q=last%20remnant&quot; rel=&quot;nofollow&quot;&gt;THE LAST REMNANT&lt;/a&gt;&lt;/span&gt;&lt;/h3&gt;

&lt;p&gt;Speaker: Mark Cerny (Consultant/Developer, Cerny Games), Michael Capps (President, Epic Games Inc), Robert Gray (Technical Consultant, Square Enix), Hiroshi Takai (Director, The Last Remnant, Square Enix), Daniel Vogel (Lead Engine Programmer, Epic Games, Inc.)&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9350&quot; rel=&quot;nofollow&quot;&gt;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9350&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Square Enix did something few Japanese developers would even consider: they switched to using Unreal for one of their games. So the panel had 2 very voluble Americans, a quiet German lead programmer, and a near-silent producer from Japan.&lt;/p&gt;

&lt;p&gt;Reflecting on it now, the only thing that sticks in the mind was Mr. Square&amp;#8217;s initial response when asked &amp;#8220;what were the problems with working with Unreal 3&amp;#8221;. The response was to pretend that the question hadn&amp;#8217;t been asked at all and to stare into the distance until the question went away. Like my mother used to say, &amp;#8220;if you can&amp;#8217;t say something nice, don&amp;#8217;t say anything at all&amp;#8221;.&lt;/p&gt;

&lt;p&gt;As with most panel discussions things were very disjointed, so I might have to resort to bullet points&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;The Squeenix guys got a bit of a shock when they first saw the code, their initial response was &amp;#8220;how on earth can you ship a game with this&amp;#8221;? They refused to buy a licence until Epic committed to translating all their documentation into Japanese. Unfortunately Epic hired cheap-ass translators who (a) translated the wrong documents, starting with Unreal 2 docs and (b) did things like translate &amp;#8220;Actor class&amp;#8221; into &amp;#8220;man who plays in films class&amp;#8221;.&lt;/li&gt;
	&lt;li&gt;Square sent engineers to the East Coast to &amp;#8220;embed&amp;#8221; with Epic. This is the first time any developer has done this.&lt;/li&gt;
	&lt;li&gt;Epic development process is very different from the Japanese. Square based around the idea of only bringing assets into the game when they are done. Unreal is based around iteration and effectively generating content in-game. This was a major cultural shift.&lt;/li&gt;
	&lt;li&gt;Their biggest asset was Rob Gray who acted as a &amp;#8220;conduit&amp;#8221; between the two companies. He could translate and act as a mediator. It sounded like the whole process would have failed without him.&lt;/li&gt;
	&lt;li&gt;Major problems (they answered eventually&amp;#33;) were:
	&lt;ul&gt;

		&lt;li&gt;artist-driven development was new to them. They jumped in and made a lot of mistakes early on that made it very hard to fix things later.&lt;/li&gt;
		&lt;li&gt;constant engine change. Updates took 1-2 months to come through to the game teams because of the upgrade time. Epic constantly asked &amp;#8220;when will the engine be done?&amp;#8221;&lt;/li&gt;
		&lt;li&gt;working with the engine. The Unreal Lead Programmer effectively admitted that some of their code might not be great, but it&amp;#8217;s there for a reason i.e. someone will be using it. So they never change for the sake of it. (Personally this sounds like a horrible situation for any programmer to be in, I wonder how long this can last).&lt;/li&gt;
		&lt;li&gt;Square very used to a fixed, tight memory budget (&amp;#8220;not 1 kilobyte wasted&amp;#8221;). Garbage collection made them very nervous and Square reported &amp;#8220;wastage&amp;#8221; of up to 30MB. Epic didn&amp;#8217;t really have an answer to this.&lt;/li&gt;
		&lt;li&gt;Compromises had to be made. Square wanted lots of characters on screen, more than UE could do. They had to scale down as a result. There were &amp;#8220;lots of areas&amp;#8221; where it didn&amp;#8217;t meet expectations.&lt;/li&gt;
	&lt;/ul&gt;

	&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;When asked if it was a success, the Japanese producer described it as a &amp;#8220;great experience&amp;#8221;, which I think meant &amp;#8220;no&amp;#8221;. On the other hand, he did say that he got much happier as development went on (&amp;#8220;we learned a lot&amp;#8221;). Some of the team do want to use the engine again.&lt;/p&gt;

&lt;p&gt;I notice Square have &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.gamasutra.com/php-bin/news_index.php?story=22767&quot; rel=&quot;nofollow&quot;&gt;just licensed Gamebryo&lt;/a&gt;&lt;/span&gt; (albeit from a different internal studio). I wonder how much of that is based on the Unreal experience.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: cultural &amp;#8211; cagey &amp;#8211; misunderstandings&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;anchor-Thursday&quot;&gt;&lt;/a&gt;Thursday&lt;/h2&gt;


&lt;h3&gt;&lt;a name=&quot;anchor-Valve%27sApproachtoPlaytesting%3AtheApplicationofEmpiricism&quot;&gt;&lt;/a&gt;Valve&amp;#8217;s Approach to Playtesting: the Application of Empiricism&lt;/h3&gt;

&lt;p&gt;Speaker: Mike Ambinder (Experimental Psychologist, Valve)&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=8884&quot; rel=&quot;nofollow&quot;&gt;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=8884&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Valve make great games, but I&amp;#8217;ve always been left disappointed when seeing their talks. Maybe I&amp;#8217;m unlucky. Some people raved about this talk, but it seemed to me to be quite a dry, not too incisive runthrough of techniques on how to playtest a game. It suffered from trying to cover too many subjects rather than picking one and covering it well. So it ended up being a bit of a litany of starter information, with each technique discussed in turn. There were still a few nuggets in amongst the stones though.&lt;/p&gt;

&lt;p&gt;Valve use:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Direct Observation&lt;/li&gt;
	&lt;li&gt;Verbal Reports (player speaking out loud while playing)&lt;/li&gt;
	&lt;li&gt;Q&amp;amp;A&lt;/li&gt;
	&lt;li&gt;Statistical Tracking&lt;/li&gt;

	&lt;li&gt;Design Experiments e.g. community polls&lt;/li&gt;
	&lt;li&gt;Surveys&lt;/li&gt;
	&lt;li&gt;Physiological Measurements (eye tracking, skin conductance, face sensors)&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;The advantages and disadvantages of each can be found quite readily with a bit of Googling, so again some snippets of things I thought were non-obvious or worth repeating.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Direct Observation (as most of these methods) needs a specific &lt;b&gt;design goal&lt;/b&gt; to be useful i.e. &amp;#8220;is this UI working&amp;#8221;. Just watching without any aim isn&amp;#8217;t worth it.&lt;/li&gt;

	&lt;li&gt;Of the pieces of footage shown, it&amp;#8217;s obvious that Valve go a long way to make their UIs very, very, well&amp;#8230; &lt;em&gt;obvious&lt;/em&gt;. Big glows round characters, lots of icons were added if the player missed any important information. Trying to be too subtle didn&amp;#8217;t work for them. Which is what we have found time after time :-)&lt;/li&gt;
	&lt;li&gt;What the player &lt;b&gt;does&lt;/b&gt;, rather than what she says, is primary. For example, the player often gives the wrong explanation as to why they have done something after-the-fact, in order to self justify. It is too easy to bias the results with the wrong context. (I wish the presenter had given references for some of the psychology studies he mentioned. Some of the experimental results he stated were almost too good to be believed). But the bottom line is &amp;#8220;people don&amp;#8217;t know why they do what they do&amp;#8221;.&lt;/li&gt;
	&lt;li&gt;When doing surveys, a common trick is to repeat the same question in different ways &amp;#8211; and get different answers from the respondents. This is a way of correlating the underlying answer and checking the answer isn&amp;#8217;t susceptible to innate (too much) bias or influence.&lt;/li&gt;
	&lt;li&gt;Valve&amp;#8217;s play testing continues long after initial release. There is online stats gathering, polls, testing.&lt;/li&gt;

	&lt;li&gt;Some people have successful used an unusual marker to measure involvement: the rate a player is seen sipping his/her drink has a good correlation to their involvement&amp;#33;&lt;/li&gt;
	&lt;li&gt;When designing UIs, they try to limit long single eye movements (say between opposite corners of the screen), since this is known to be very tiring for the player.&lt;/li&gt;
	&lt;li&gt;Using skin conductance, it&amp;#8217;s known that players get a second spike in their body alertness between 10 and 15 seconds after the initial shock. So designers use this to time secondary attacks in the game for maximum scariness&amp;#33;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;It&amp;#8217;s still reassuring to see effort in the direction of &amp;#8220;design as hypothesis, so test it as scientifically as you can&amp;#8221;, since that&amp;#8217;s the direction we seem to be moving in as well.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: dry &amp;#8211; thorough &amp;#8211; a-bit-dull-really&lt;/b&gt;&lt;/p&gt;


&lt;h3&gt;&lt;a name=&quot;anchor-SolidGameDesign%3AMakingthe%27Impossible%27Possible&quot;&gt;&lt;/a&gt;Solid Game Design: Making the &amp;#8216;Impossible&amp;#8217; Possible&lt;/h3&gt;

&lt;p&gt;Speaker: Hideo Kojima (Head of Kojima Productions)&lt;br/&gt;
&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9459&quot; rel=&quot;nofollow&quot;&gt;https://www.cmpevents.com/GD09/a.asp?option=C&amp;amp;V=11&amp;amp;SessID=9459&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;This talk has been done to death, and there are far better write-ups than I can manage (my favourite is on &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://blog.wired.com/games/2009/03/gdc-live-blog-m.html&quot; rel=&quot;nofollow&quot;&gt;Wired&lt;/a&gt;&lt;/span&gt;. And I missed the start by being in a meeting with the Havok guys. The highlights were the Japanese MSG adverts, the one in the office and the jungle were hysterical. Unfortunately I can&amp;#8217;t find them on YouTube :-(&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: isometric &amp;#8211; adverts &amp;#8211; dig-at-ps3&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-AllAboutNobyNobyBoy&quot;&gt;&lt;/a&gt;All About Noby Noby Boy&lt;/h3&gt;

&lt;p&gt;Speaker: Keita Takahashi (Bandai Namco)&lt;/p&gt;

&lt;p&gt;Probably my favourite talk from the whole conference: it was just so&amp;#8230; so&amp;#8230; &lt;em&gt;nice&lt;/em&gt;. It started out with a knitted scarf that looked like &lt;em&gt;Noby Noby Boy&lt;/em&gt; himself and turned out to have been knitted by the designer&amp;#8217;s mother, and ended with Takahashi gently inquiring if one of the questioners in the Q&amp;amp;A section maybe had a few, you know, &lt;em&gt;issues&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;More-or-less complete transcription is &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.gamasutra.com/php-bin/news_index.php?story=22941&quot; rel=&quot;nofollow&quot;&gt;here&lt;/a&gt;&lt;/span&gt; It&amp;#8217;s well worth reading to see the mental processes of someone who is clearly viewing the world from a different angle from most people. Sometimes I wondered if the games industry was sending him mad&amp;#8230; he is certainly treading a separate path. No wonder he at one point declared that we should &amp;#8220;ignore players and companies and make the games we like&amp;#8221; and &amp;#8220;do not fear failure&amp;#8221;.&lt;/p&gt;

&lt;p&gt;There was no real structure to the talk, so in many ways it matches the Noby Noby Boy &amp;#8220;game&amp;#8221; itself. It just gradually unfolded in a way that sort of made sense at the end. Similar to the Media Molecule talk, Takahashi-san used drawings and videos rather than a traditional presentation. Maybe the word we shouldn&amp;#8217;t fixate on is &amp;#8220;game&amp;#8221;. Maybe it&amp;#8217;s &amp;#8220;play&amp;#8221; instead. (Man, that&amp;#8217;s deep). The presenter described NNB as being like &amp;#8220;buying a ticket to a festival&amp;#8221; and his goal as &amp;#8220;creating something enjoyable&amp;#8221;, which ties in with that somewhat.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: charming &amp;#8211; whimsical &amp;#8211; inspiring&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-ExperimentalGameplaySessions&quot;&gt;&lt;/a&gt;Experimental Gameplay Sessions&lt;/h3&gt;

&lt;p&gt;Speaker: various&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.gamasutra.com/blogs/jimmcginley/20090329/1019/GDC_2009__Day_43__Experimental_Gameplay_Sessions.php&quot; rel=&quot;nofollow&quot;&gt;another writeup&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;2 hours, 10 presentations, lots of indie games. How &amp;#8220;experimental&amp;#8221; they were seemed to vary (Flower seemed an odd choice, and Derek Yu almost seemed like he was chosen because he&amp;#8217;s popular in the indie scene), but everything had at least one interesting element to it.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.experimental-gameplay.org/&quot; rel=&quot;nofollow&quot;&gt;Website&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;You can download and play quite a few of them, and see videos. In order the games were&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://giantsparrow.com/games/swan/&quot; rel=&quot;nofollow&quot;&gt;Unfinished Swan&lt;/a&gt;&lt;/span&gt; This looked like a really cool video that was still searching for a game to attach to it&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.steveswink.com/&quot; rel=&quot;nofollow&quot;&gt;Shadow Physics&lt;/a&gt;&lt;/span&gt; Steve Swink, Steve Anderson&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://marctenbosch.com/&quot; rel=&quot;nofollow&quot;&gt;Miegakure&lt;/a&gt;&lt;/span&gt; possibly the most bonkers of the lot&lt;/li&gt;

	&lt;li&gt;Spy Party - Chris Hecker&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.ludomancy.com/blog/&quot; rel=&quot;nofollow&quot;&gt;Daniel Benmergui&lt;/a&gt;&lt;/span&gt; &amp;#8220;I Wish I Were the Moon&amp;#8221; ,&amp;#8221;Trials&amp;#8221;, &amp;#8220;StoryTeller&amp;#8221;, &amp;#8220;Today I Die&amp;#8221;&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://thatgamecompany.com/games/flower/&quot; rel=&quot;nofollow&quot;&gt;Flower&lt;/a&gt;&lt;/span&gt; &amp;#45; Jenova Chen, Nick Clark&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://achrongame.com/&quot; rel=&quot;nofollow&quot;&gt;Achron - Hazardous Software&lt;/a&gt;&lt;/span&gt; (I have the word &amp;#8220;MADNESS&amp;#8221; written in big letters in my notepad next to this one)&lt;/li&gt;

	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.newgrounds.com/portal/view/480006&quot; rel=&quot;nofollow&quot;&gt;Closure - Tyler Glail&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://bushghost.blogspot.com/&quot; rel=&quot;nofollow&quot;&gt;Where is My Heart - Bernhard Schulenburg&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.farbs.org/games.html&quot; rel=&quot;nofollow&quot;&gt;Rom Check Fail - Farbs&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.tigsource.com/articles/category/roguelikes&quot; rel=&quot;nofollow&quot;&gt;Roguelikes - Derek Yu&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;At least 3 or 4 of the games (Miegakure, Achron, Closure, Shadow Physics) were influenced, or at least in the mould of, recent games where the concept of &amp;#8220;mapping different dimensions to one another&amp;#8221; is used, Braid being the most obvious. They ranged from the merely quite-bonkers (Shadow Physics), to the totally-bonkers (Achron, Miegakure).&lt;/p&gt;

&lt;p&gt;In terms of new gameplay or mechanics, I thought Spy Party &amp;#8211; although flawed in its implementation &amp;#8211; was the closest to being something genuinely novel. The idea was for the player to watch on-screen characters interact (in a party situation), then try to work out who was the other real-life player, and who were the AIs. A sort of &amp;#8220;reverse Turing Test&amp;#8221; made more feasible by limiting the range of player &amp;#8220;language&amp;#8221; to something simpler than full natural written English. Unfortunately, the &amp;#8220;gameplay&amp;#8221; consisted of just watching for a tell-tale animation playing on a character rather than spotting things like patterns of behaviour.&lt;/p&gt;

&lt;p&gt;The game that I was most interested in playing was &amp;#8220;Today I Die&amp;#8221;, a simple 2D game where the lyrics of a short poem were written on screen. By playing the game you could collect new words and swap them into the poem. And when the words swapped, the gameplay on the screen matched the new words, so new games opened up. It was the kind of thing you need to see &amp;#8211; it becomes far simpler to explain. And quite charming in its execution.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: mindbending &amp;#8211; fun &amp;#8211; exhausting&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;anchor-Friday&quot;&gt;&lt;/a&gt;Friday&lt;/h2&gt;

&lt;p&gt;Lots of design talks yesterday, so today I put on my programming hat, and the unveiling of&amp;#8230;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-RasterizationontheLarrabee%3AAFirstLookattheLarrabeeNewInstructions%28LRBni%29inAction&quot;&gt;&lt;/a&gt;Rasterization on the Larrabee: A First Look at the Larrabee New Instructions (LRBni) in Action&lt;/h3&gt;

&lt;p&gt;Speaker: Michael Abrash (RAD Game Tools)&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-SIMDProgrammingwithLarrabee%3AASecondLookattheLarrabeeNewInstructions%28LRBni%29inAction&quot;&gt;&lt;/a&gt;SIMD Programming with Larrabee: A Second Look at the Larrabee New Instructions (LRBni) in Action&lt;/h3&gt;

&lt;p&gt;Speaker: Tom Forsyth (Intel)&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Note&lt;/b&gt; The slides for these presentations are available &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://software.intel.com/en-us/articles/intel-at-gdc/&quot; rel=&quot;nofollow&quot;&gt;here on Intel&amp;#8217;s site&lt;/a&gt;&lt;/span&gt; The slides are in PDF so don&amp;#8217;t include the extra notes that Michael Abrash promised. Curses.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s probably best to lump these presentations together, although the style of presentation was somewhat different. &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.intel.com/technology/visual/microarch.htm&quot; rel=&quot;nofollow&quot;&gt;Larrabee&lt;/a&gt;&lt;/span&gt; is Intel&amp;#8217;s attempt to take on the hardware graphics cards vendors by gluing together &lt;em&gt;lots&lt;/em&gt; of old Pentium chips and developing a software renderer. Actually that&amp;#8217;s a horrible mis-representation, but the whole thing does remind me of a MacGyver-style &amp;#8220;it&amp;#8217;s crazy but it might just work&amp;#33;&amp;#8221; skunkworks.&lt;/p&gt;

&lt;p&gt;Abrash and Forsyth are two of the Smartest Guys in the Room, so if it&amp;#8217;s possible they will be the ones to do it, but at the moment the jury is definitely out as to whether the numbers will work out. It looks like they are betting on using the inherent parallelisation of some algorithms involved in rendering, and load balancing to occupy the chipset&amp;#8217;s time and spread out workload to constantly feed the processors, to give them enough of a gain to offset the inevitable performance decrease you will get by not using custom hardware to do your rendering for you. And those gains and losses are much too hard to define to just stick some numbers into Excel. And we haven&amp;#8217;t gone into the power consumption either&amp;#8230;&lt;/p&gt;

&lt;p&gt;Michael Abrash&amp;#8217;s talk was easily the most hardcore talk I went to. Not only did it feature extensive assembly language listings &amp;#8211; which I love, but I know are an acquired taste &amp;#8211; he also deliberately raced through some quite involved triangle rasterisation algorithms in order to fit into his alloted hour. And I can honestly say that the attendee sat next to me did, genuinely, fall asleep (he was a forum moderator on gamedev.net, I checked his pass). It was a really interesting concept though, so I need to wait till the full slides come out to go through it in-depth.&lt;/p&gt;

&lt;p&gt;Tom Forsyth&amp;#8217;s talk was much easier to follow, and still had a gratifying dollop of assembler. While Abrash&amp;#8217;s talk focussed on how using clever algorithms could help you get a win over a GPU architecture, Tom&amp;#8217;s talk went into more detail about the extra instructions they had add to the traditional Pentium instruction-set. With the addition of instructions with 3 operands, and the mask register usable on many parallel instructions, you can end up with&lt;/p&gt;
&lt;div class=&quot;code panel&quot; style=&quot;border-width: 1px;&quot;&gt;&lt;div class=&quot;codeContent panelContent&quot;&gt;
&lt;pre class=&quot;code-java&quot;&gt;vmadd213ps vR{kL}, vR, vRstart ; I think &lt;span class=&quot;code-keyword&quot;&gt;this&lt;/span&gt; is vR * vR + vRStart (with mask), result in first operand (vR)&lt;/pre&gt;

&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The new scatter-gather instructions look neat. They are meant to allow easily packing/unpacking between SoA and AoS data format, so you can easily shuffle them into formats that can be parallelised easily. However, the downside is that they use memory access just like any other instruction, so the cost of cache misses could be crippling. Again, the proof is in the pudding.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: hardcore &amp;#8211; assembler &amp;#8211; abrashtalkstoofast&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-StatebasedScriptinginUncharted%3ADrake%27sFortuneandUncharted2%3AAmongThieves&quot;&gt;&lt;/a&gt;State-based Scripting in Uncharted: Drake&amp;#8217;s Fortune and Uncharted 2: Among Thieves&lt;/h3&gt;
&lt;p&gt;Speaker: Jason Q Gregory (Naughty Dog)&lt;/p&gt;

&lt;p&gt;This talk was packed 10 minutes before it started, although I have to confess that I didn&amp;#8217;t find too much new in this talk. It generally talked about how they attach scripts to objects and use their scripting language to set up scripted sequences, and add a bit of variety to things like making prop objects wobble when the player is climbing on them, and fall off when the player jumps off.&lt;/p&gt;

&lt;p&gt;All the usual issues such as making the scripts re-startable if the entity was streamed back in came up. There didn&amp;#8217;t seem to be any solution other than &amp;#8220;write your script correctly&amp;#8221;.&lt;/p&gt;

&lt;p&gt;ND are using a custom scripting language largely based around &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.plt-scheme.org/&quot; rel=&quot;nofollow&quot;&gt;PLT Scheme&lt;/a&gt;&lt;/span&gt; which I guess you could broadly categorise as a Lisp variant with very strong typing. Partly this is because of ND&amp;#8217;s heritage with Goal (a &amp;#8220;kind of&amp;#8221; Lisp, it seemed to be a lot more complex than a simple categorisation) on PS2. To me using Lisp&amp;#8217;s syntax but not its amazing weak typing seems to be, at first sight, taking all of Lisp&amp;#8217;s disadvantages and few of its advantages, but ND are the ultimate arbiter of that. I&amp;#8217;d love to see how their scripters work, or indeed what background their scripters have.&lt;/p&gt;

&lt;p&gt;One side-effect of the use of a Lisp variant was that their scripts ended up as a mix of code and data in &amp;#8220;state blocks&amp;#8221; (I think to represent their state machines).&lt;/p&gt;

&lt;p&gt;Debugging seemed to be a case of using printf(). However, what Jason did seem to intimate, and what I&amp;#8217;ve seen in the past, is that education, documentation and training are the most effective debugging tools in many cases.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: scripting &amp;#8211; standard &amp;#8211; lisptastic&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-RealtimeResearch%3AAnExperimentinUnderstandingGames&quot;&gt;&lt;/a&gt;Real-time Research: An Experiment in Understanding Games&lt;/h3&gt;
&lt;p&gt;Speaker: various&lt;/p&gt;

&lt;p&gt;Worst talk I saw :-(  I regret not going to the Peter Molyneux talk instead, and it&amp;#8217;s not often I say that.&lt;/p&gt;

&lt;p&gt;The idea was that during GDC itself, small teams of people went around doing research on the attendees themselves. The &amp;#8220;experiments&amp;#8221; were things like conducting surveys, &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.jesperjuul.net/ludologist/?p=596&quot; rel=&quot;nofollow&quot;&gt;analysing Twitter and blogs for the &amp;#8220;#GDC&amp;#8221; tag&lt;/a&gt;&lt;/span&gt; or analysing the use of business cards (I think &amp;#8211; it really wasn&amp;#8217;t clear what that one was about).&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s fair enough that the work wasn&amp;#8217;t intended to be peer-reviewed or anything, but unfortunately a lot of the work was conducted so roughly as to not give even the semblance of a sensible result. For example, one experiment involved asking attendees to pick a point on the &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.mud.co.uk/richard/hcds.htm&quot; rel=&quot;nofollow&quot;&gt;Richard Bartle player interest graph&lt;/a&gt;&lt;/span&gt; which map onto player styles, and build a profile of disciplines. However, the experiment involved sticking Post-Its on a largeish cardboard sheet, and as the Post-Its accumulated, people started to stick their entries further and further out to avoid obscuring others&amp;#8217; entries&amp;#8230; oops.&lt;/p&gt;

&lt;p&gt;David Tisserand of SCEE was in the presenting list for the Business Card experiment. I think he was a bit embarrassed about having been roped in, sorry David!&lt;/p&gt;

&lt;p&gt;Side note: I don&amp;#8217;t know if the poor standard of work was related to the fact that this talk had the highest factor of academics presenting and attending. Sample set is a bit too small.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: disappointing &amp;#8211; amateurish &amp;#8211; wordle&lt;/b&gt;&lt;/p&gt;

&lt;h3&gt;&lt;a name=&quot;anchor-DynamicWalkingwithSemiProceduralAnimation&quot;&gt;&lt;/a&gt;Dynamic Walking with Semi-Procedural Animation&lt;/h3&gt;

&lt;p&gt;Speaker: Rune Skovbo Johansen (Unity Technologies)&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;&lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.runevision.com/&quot; rel=&quot;nofollow&quot;&gt;Rune&amp;#8217;s website&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I saved a good one till last. &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://home.comcast.net/~tom_forsyth/blog.wiki.html&quot; rel=&quot;nofollow&quot;&gt;Tom Forsyth&amp;#8217;s blog&lt;/a&gt;&lt;/span&gt; had recommended this talk and I wasn&amp;#8217;t disappointed. It was a tech talk about how to do runtime skeletal manipulation of a walking character to handle correct foot placement. And it also handled quadrupeds really well. Very impressive.&lt;/p&gt;

&lt;p&gt;Gavin Clarke did a lot of very similar work for us on Ghosthunter on PS2 to get what was for its time real state-of-the-art foot IK. Many of the ideas here were the same, but it did some very good analysis to allow &amp;#8220;hands-free&amp;#8221; integration. So for example, it analyses the walk cycle animation to determine automatically the foot-down and foot-up times, length of stride and foot on the floor. It also goes into some depth about how to handle tricky cases, such as bending the trailing foot when stepping down from a ledge, which often looks very ungainly unless you get it right, or smoothing out the root transform of the character as you move up and down steep changes in height.&lt;/p&gt;

&lt;p&gt;Good advert for the Unity engine, too. I&amp;#8217;ve been guilty of thinking of it as &amp;#8220;just a Flash-like browser game engine&amp;#8221; in the past, I need to reconsider because they were doing some very good stuff.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;In three keywords: animation &amp;#8211; quadrupeds &amp;#8211; impressive&lt;/b&gt;&lt;/p&gt;

&lt;h2&gt;&lt;a name=&quot;anchor-ThingsToRememberNextTime&quot;&gt;&lt;/a&gt;Things To Remember Next Time&lt;/h2&gt;

&lt;p&gt;These are things I wish I&amp;#8217;d know before I went:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;take a laptop. There is lots of free wi-fi, but no pods with PCs&lt;/li&gt;
	&lt;li&gt;find a quick timetable &amp;#8211; the provided one is useless&lt;/li&gt;
	&lt;li&gt;scout out the venue in advance so you can easily find where all the talks are held&lt;/li&gt;
	&lt;li&gt;don&amp;#8217;t trust the titles of the talks! Generally they are either vague, trying to be too clever, or in some cases downright misleading. 
        A better guide is stick to speaker&amp;#8217;s reputations, or read an in-depth description of the talk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and finally, but possibly most importantly:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;avoid the vegetarian option for the free GDC lunch. Or for that matter, probably the non-vegetarian option.&lt;/li&gt;
&lt;/ul&gt;

</description>
  </item>
  <item>
    <title>Personal Reading List, 2008</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2009/01/03#reading_list_2008</link>
    <description>
&lt;p&gt;Inspired by &lt;a href=&quot;http://interconnected.org/home/2008/03/30/books_read_march_2008&quot;&gt;Matt Webb sooper genius&lt;/a&gt;, I&amp;#8217;m starting to keep a log of books read. It&amp;#8217;s probably a bad idea to be inspired by someone who seems able to knock off several erudite editions per month. But I have to start somewhere.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s always hard to find time to read &amp;#8212; or rather it seems to be. After a hard day&amp;#8217;s &lt;strike&gt;programmi&lt;/strike&gt; management, it&amp;#8217;s too easy to flop down in front of the TV. Hence I am making an effort to structure my reading time. Faced by options paralysis in the bookshop yesterday, I decided to limit my choice of books to fiction authors only starting with the letter in the cabinet in front of where I stood: &amp;#8220;F&amp;#8221;, as it turned out.&lt;/p&gt;

&lt;p&gt;I doubt this will be a hard-and-fast rule: I already know that I will break it for non-fiction reading, mainly depending on what my work requires. But it certainly made it easier to &lt;em&gt;choose&lt;/em&gt; a set of books and push me to read books I&amp;#8217;ve considered reading, but never quite got to. The aim is &amp;#8220;structure&amp;#8221;, rather than &amp;#8220;constraint&amp;#8221;. I guess I&amp;#8217;ll see how it goes.&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://www.amazon.co.uk/Christine-Falls-Benjamin-Black/dp/0330445324/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1207599453&amp;sr=1-1&quot;&gt;Christine Falls&lt;/a&gt;&amp;#8221;, Benjamin Black (a pseudonym of John Banville)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://www.amazon.co.uk/Death-Dalziel-Pascoe-Novel/dp/0007194862/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1207599664&amp;sr=1-1&quot;&gt;The Death of Dalziel&lt;/a&gt;&amp;#8221;, Reginald Hill&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://www.amazon.co.uk/White-Heat-History-Swinging-1964-1970/dp/0349118205/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1207599708&amp;sr=1-1&quot;&gt;White Heat: A History of Britain in the Swinging Sixties: 1964-1970&lt;/a&gt;&amp;#8221;, Dominic Sandbrook. A monster, it took me several weeks; an intriguing attempt to blend the machinations of the Wilson government with the pop-culture of the Beatles and the Rolling Stones.&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://www.christopherfowler.co.uk/cf/bk_full_dark_house.php&quot;&gt;Dark Full House&lt;/a&gt;&amp;#8221;, &lt;a href=&quot;http://www.christopherfowler.co.uk/&quot;&gt;Christopher Fowler&lt;/a&gt;. Really enjoyed this; had a playful sense of humour that I&amp;#8217;ve not seen in crime thrillers for quite some time. (Finished 10th April)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://www.peterme.com/archives/000261.html&quot;&gt;Designing For People&lt;/a&gt;&amp;#8221;, Henry Dreyfuss. First published in 1955, an easy-to-digest blend of timeless good advice and delightful &amp;#8220;oh what were they thinking&amp;#8221; archaisms. The &amp;#8220;predictions for the future&amp;#8221; are more accurate in the 1955 version&amp;#8217;s final chapter than the revised 1967 edition (Finished 12th April)&lt;/li&gt;
    &lt;li&gt;&amp;#8220;&lt;a href=&quot;http://shakespeare.mit.edu/merchant/&quot;&gt;The Merchant of Venice&lt;/a&gt;&amp;#8221;. In preparation for our impending trip to Stratford to see the &lt;a href=&quot;http://arts.guardian.co.uk/theatre/drama/reviews/story/0,,2272816,00.html&quot;&gt;RSC production&lt;/a&gt;. I can see why it&amp;#8217;s called a &amp;#8220;problem play&amp;#8221; now (13th April).
    &lt;li&gt;&amp;#8220;&lt;a href=&quot;http://www.sensible.com/buythebook.html&quot;&gt;Don&amp;#8217;t Make Me Think!&lt;/a&gt;&amp;#8221; (Second Edition), by Steve Krug. This has been sat on my desk at work, half finished, since January, and I have finally mustered the energy to polish off the second half. (14th April).
	&lt;li&gt;&amp;#8220;&lt;a 
href=&quot;http://www.amazon.com/Clubbable-Woman-Dalziel-Pascoe-Novel/dp/0586072586&quot;&gt;A 
Clubbable Woman&lt;/a&gt;&amp;#8221;, Reginald Hill. Comfort reading. (21st April).&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a 
href=&quot;http://www.amazon.co.uk/Foreign-Correspondent-Alan-Furst/dp/075382230X/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1207598715&amp;sr=8-1&quot;&gt;The 
Foreign Correspondent&lt;/a&gt;&amp;#8221;, Alan Furst. (3rd May).&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Towards the End of the Morning&amp;#8221;, Michael Frayn.&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Water Room&amp;#8221;, Christopher Fowler.&lt;/li&gt;
	&lt;li&gt;&amp;#8220;&lt;a href=&quot;http://www.amazon.co.uk/Absalom-Vintage-Classics-William-Faulkner/dp/0099475111/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1207598766&amp;sr=1-1&quot;&gt;Absalom, Absalom!&lt;/a&gt;&amp;#8221;, William Faulkner (aborted &amp;#8212; unreadable)&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Under The Frog&amp;#8221;, Tibor Fischer&lt;/li&gt;
	&lt;li&gt;&amp;#8220;A Death in Tuscany&amp;#8221;, Michele Giuttari&lt;/li&gt;
        &lt;li&gt;&amp;#8220;Independence Day&amp;#8221;, Richard Ford (4th July - 3rd September)&lt;/li&gt;
        &lt;li&gt;&amp;#8220;The Interpretation of Murder&amp;#8221;, Jed Rubenfield&lt;/li&gt;
        &lt;li&gt;&amp;#8220;Seventy-Seven Clocks&amp;#8221;, Christopher Fowler&lt;/li&gt;
        &lt;li&gt;&amp;#8220;The Return&amp;#8221;, Hakan Nesser&lt;/li&gt;
        &lt;li&gt;&amp;#8220;Ways of Seeing&amp;#8221;, John Berger&lt;/li&gt;
        &lt;li&gt;&amp;#8220;The Sportswriter&amp;#8221;, Richard Ford&lt;/li&gt;
        &lt;li&gt;&amp;#8220;Così Fan Tutti&amp;#8221;, Michael Dibdin (reread)&lt;/li&gt;
        &lt;li&gt;&amp;#8220;The Tailor of Panama&amp;#8221;, John Le Carré&lt;/li&gt;
	&lt;li&gt;&amp;#8220;A Cure for All Diseases&amp;#8221;, Reginald Hill&lt;/li&gt;
	&lt;li&gt;&amp;#8220;Cop Killer&amp;#8221;, Maj Sjöwall and Per Wahlöö&lt;/li&gt;
	&lt;li&gt;&amp;#8220;The Dip&amp;#8221;, Seth Godin&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, round about a book every fortnight. This is pathetic in comparison 
to Mr. Webb. I think this can be improved in 2009. I am starting to find 
techniques to squeeze in more reading, and less television.&lt;/p&gt;

&lt;p&gt;Around 50% of my consumption has been crime fiction, with the 
percentage increasing towards the end of the year, as my reliance on the 
letter F tailed off. And some of the first titles of 2009 will be the Ross 
MacDonalds I got for Christmas. I think it might be time to retire the 
letter F and switch to a new pattern &amp;#8212; Penguin Classics, perhaps.&lt;/p&gt;

</description>
  </item>
  <item>
    <title>Memory Debugging on &amp;#8220;24: The Game&amp;#8221; (PS2)</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2008/09/19#Memory debugging on 24</link>
    <description>
&lt;h2&gt;Author&amp;#8217;s Note&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;I originallly wrote this piece for an internal Sony discussion about memory debugging, about 2 years
ago. In lieu of actual creating any original content for this website, I thought I&amp;#8217;d resurrect this
piece, and polish it to make it less dry than the original report. 
It&amp;#8217;s unusual, since games developers rarely admit in public to anything that doesn&amp;#8217;t sound like a shiny,
new, perfect game engine. But game development is now more the art of the possible than the art of
whizzy code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I should also point out that a lot of the hard work was done by the two people who worked on
the systems originally: Chris Sorrell and Gavin Bell. Kudos to them.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;Background to &amp;#8220;24&amp;#8221;&lt;/h2&gt;

&lt;p&gt;I originally started working on &amp;#8220;24&amp;#8221; in mid-2005. By that point the game had had over 2 years of
development on it. &amp;#8220;24&amp;#8221; was based on Cambridge Studio’s in-house PS2 engine, started in
1999. This is the fourth game based around the PS2 engine. It was
originally developed for Primal, a third-person action adventure with
on-foot action. &amp;#8220;24&amp;#8221; had a very different requirement set, as it attempted to
incorporate free-roaming driving missions. The loading patterns for driving areas caused vastly more 
&amp;#8220;problematic&amp;#8221; memory usage than the slower on-foot sections. There were also quite a few subtle issues
caused by persistent memory allocations, which we will see later.&lt;/p&gt;

&lt;p&gt;With a couple of months left on the project we were still having serious memory and stability 
problems, so extra staff was added to work on diagnostics (i.e. me).&lt;/p&gt;

&lt;h2&gt;Some Terminology&lt;/h2&gt;

&lt;p&gt;Terminology for memory allocation seems to change with every engine I see, so here
is the list for this piece. (This differs from the class names in our code,
which reused &amp;#8220;pool&amp;#8221; in more than one context).&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;Heap: a large block of memory using a standard
     memory-allocation algorithm: for us, it was usually a &amp;#8220;&lt;a href=&quot;http://www.memorymanagement.org/glossary/b.html#best.fit&quot;&gt;best-fit&lt;/a&gt;&amp;#8221; algorithm;&lt;/li&gt;
 &lt;li&gt;Pool: chunk of memory acting more like an array of
     fixed-sized allocations for quick allocation. Its own internal array was
     allocated from a heap;&lt;/li&gt;
 &lt;li&gt;Allocator: a chunk of memory allocated on the heap, inside
     which another custom allocator type was used (usually first-fit).&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;The Standard Heap Memory Allocator&lt;/h3&gt;

&lt;p&gt;The core memory allocator had been custom-written from the ground up, six years earlier.
It was, in essence, a best-fit allocator using boundary tags (as far as I could
tell). It also had some custom bucketing code to try to boost performance &amp;#8212; to
skip any candidates that were known to be too small for a potential allocation, it tracked the free
areas in &amp;#8220;size buckets&amp;#8221; and only looked in the bucket of sizes that were as big as, or bigger than,
the amount of memory you wanted to allocate.
&lt;/p&gt;

&lt;p&gt;The basic heap allocator also offered the usual additions:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;Alignment for the base allocation plus alignment for
     elements of array;&lt;/li&gt;
 &lt;li&gt;Deferred free processing (for render allocations). This is where the allocation would stay around
     for a couple of frames after the allocation was explicitly freed, to allow it to be read by
     the in-progress GS graphics rendering.&lt;/li&gt;
 &lt;li&gt;&amp;#8220;Slave&amp;#8221; allocations, where deallocation of one memory
     location would cause the slaved allocations to also be freed. (By the end
     of &amp;#8220;24&amp;#8221; this was unused, after a rewrite of the rendering
     system)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Memory layouts and patterns&lt;/h3&gt;

&lt;p&gt;There were several heaps in the game:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;The main, or &amp;#8220;global&amp;#8221; heap: for all allocations over 8K in size, or any allocation that could be
     relocated.
     In the final shipped disk build, this was about 23MB in size, out of the PS2&amp;#8217;s 32MB total.&lt;/li&gt;
 &lt;li&gt;The &amp;#8220;bantam heap&amp;#8221;: this was a separate heap, for any allocations under 8K in size. This ended
     up around 5MB in size. If the bantam heap overflowed, and it did, allocations would overspill into the
     main heap. (Those of a nervous disposition will get worried hearing that).&lt;/li&gt;
 &lt;li&gt;Debug heap. Debug allocations would go in the bantam heap
     on non-debug versions, or be blocked at compile time (debug allocations
     like this were prevented unless they absolutely had to be allowed).&lt;/li&gt;
 &lt;li&gt;Havok heap. Havok kept a completely separate heap of about
     2.5MB, not managed by our systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the heaps and their sizes were allocated at boot-up of the game. We
couldn&amp;#8217;t reinitialise heaps at runtime, as the engine design meant that some
systems (particularly the render system, as it turned out), couldn&amp;#8217;t cope with it.&lt;/p&gt;

&lt;h3&gt;The Hard Bits&lt;/h3&gt;

&lt;p&gt;The Really Hard Bit was getting rid of memory fragmentation.&lt;/p&gt;

&lt;p&gt;The resource system and loading system on &amp;#8220;24&amp;#8221; made a
separate allocation for each loaded resource (and possibly extra allocations on
post-load processing). During runtime, there could be up to around 2500 allocations
in the main memory heap, most of which would be resources.&lt;/p&gt;


&lt;p&gt;These are the main root causes of memory crashes we had in
24.&lt;/p&gt;



&lt;ul&gt;
 &lt;li&gt;Heap fragmentation: the main heap in particular would
     fill up due to fragmentation. Even with resource relocation (see later),
     we would often see out-of-memory crashes with around 1.5MB still free in
     the heap. Also fragmentation would be extremely unpredictable on different
     play-throughs.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
 &lt;li&gt;Granular handle-based loading system. Our game resource
     system was completely handle-based and tried to reuse already-loaded
     resource data. Rather than have a hard-specific process for the loading of
     a chunk of assets, creating a handle for an object would register a
     request to load the data and it would appear some time later as a separate
     allocation. Certain &amp;#8220;group&amp;#8221; handle requests would pull in a block of files
     linked to that group (an informal form of WAD handling, although without
     compression). An example would be the set of geometry files for an area of
     map. Each file within that group would still count as a separate resource
     and have separate allocations. Creating a handle to an already-loaded
     object would simply reuse that resource and increment its reference count.
     Resources were deallocated only when all handle references to the object
     were lost.&lt;br&gt;
     &lt;br&gt;
     While this was often a boon for programmers’ productivity (although all
     our code had to check for handles pointing to loaded data), it meant that
     it was very difficult to explicitly control loading/unloading of resource
     allocations, and so have any control on the memory allocation patterns.
     Code would often almost invisibly trigger loads/unloads.&lt;br&gt;
     &lt;br&gt;
     As a result, resources loaded in at the same time, and hence usually
     allocated close to one another, could have completely different
     deallocation times. Looking at research papers, this is a core root cause
     of fragmentation.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
 &lt;li&gt;Leak tracking. This was particularly problematic. Until the
     end of development, the engine did not reset most systems between
     levels/game starts. This led to leaks going undetected for long stages of
     development. In the end, there was a lot of work recoding systems so we
     could reset them, and adding tagging information to reliably track these
     problems. In addition, some systems did not leak per se, but held on to
     allocations beyond level scope. See the &amp;#8220;Conclusions&amp;#8221; section for more
     about this.&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
 &lt;li&gt;Bantam Heap overflow. Due to historical reasons, we had to
     allow the bantam heap to overflow, particularly in areas with heavy
     rendering or lots of NPCs. Normally the situation would &amp;#8220;right itself&amp;#8221;
     when memory levels dropped again. However, some allocations would persist
     for the course of a whole level, or in some cases even longer (see &amp;#8220;Leak
     tracking&amp;#8221; above).&lt;/li&gt;
&lt;/ul&gt;



&lt;ul&gt;
 &lt;li&gt;Render allocations. Memory allocation for rendering was
     highly dynamic and used granular allocations in the bantam, then main
     heap. This would cause spikes in the memory and frequent bantam heap
     overflow. However it would often try to reuse allocations to save
     processor time, meaning that it would try to hang on to allocations in the
     main heap. This exacerbated the fragmentation.&lt;/li&gt;
&lt;/ul&gt;





&lt;ul&gt;
 &lt;li&gt;Load system differences. To try to improve load times on
     PS2, initially-loaded data for the start of a level was compressed and
     interleaved with the movies, and also supplied as a WAD (if the movie was
     skipped). However, this also caused the memory allocation patterns to vary
     wildly, as allocations for movie playback buffers affected the patterns.
     As a result, memory fragmentation was far worse after a movie was played
     back. This situation only ever happened on final disk builds, so having
     diagnostic data on disk builds on Test machines was essential for us.&lt;/li&gt;
&lt;/ul&gt;



&lt;h3&gt;Custom heap allocation types&lt;/h3&gt;



&lt;p&gt;Although best-fit allocation performs well in general tests,
we ended up with some interesting problems innate to its approach. In
particular, memory &amp;#8220;islands&amp;#8221; caused by persistent allocations in otherwise free
space caused us serious problems later on.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.memorymanagement.org/articles/&quot;&gt;A bit of reading up&lt;/a&gt; showed that best-fit 
allocators are very prone to this, which is intuitive when
you start to think abou it. Guess what? We were using a best-fit allocator.&lt;/p&gt;


&lt;p&gt;Very late in the project we added custom allocation
strategies to force allocations to the top or bottom of memory heaps, or into
heaps that they would not have used with the default strategy. An example would
be that when movies with embedded WAD data were played back, movie buffers were
forced to the top of the heap, and resource allocations to the bottom. Although
this was an unpleasant hack, it gave us a measure of robustness to the
&amp;#8220;islands&amp;#8221; problem. It was invaluable in actually getting the
game to ship. (In essence we were switching to using a first-fit allocator for critical areas).&lt;/p&gt;



&lt;h3&gt;Runtime Relocation&lt;/h3&gt;

&lt;p&gt;Resource relocation was added to the engine before &amp;#8220;24&amp;#8221;. It
helped fix any fragmentation problems we had seen on earlier titles. However,
on &amp;#8220;24&amp;#8221; it wasn’t powerful enough to fix everything. This was mainly because
the balance of the mixture of relocatable to non-relocatable objects in the
heap shifted between projects – there weren’t enough movable objects in the
heap any more, and we didn’t have time to recode systems to cope with
relocation.&lt;/p&gt;

&lt;p&gt;Relocatable types were:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;Animations&lt;/li&gt;
 &lt;li&gt;Textures&lt;/li&gt;
 &lt;li&gt;Model instances&lt;/li&gt;
 &lt;li&gt;Localised text&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything else (in particular, character model data) was
non-relocatable. Analysing the patterns of how this caused fragmentation was
essential for us.&lt;/p&gt;

&lt;p&gt;The relocation allocator code just tended to push resources
to the earliest big-enough free space in the top of memory. To keep overheads
down, relocation was constrained to a maximum of 4 resources, or 64K, per
frame. Generally, fragmentation wasn’t limited by this relocation rate; it was
more that the memory patterns were unrecoverable by that point because of
large, unrelocatable resources sat at inconvenient positions in memory.&lt;/p&gt;



&lt;p&gt;In conclusion, although we had a very sophisticated memory
system, it stored up quite a lot of problems for us later down the line. What
had served us comparatively well in early games didn’t stand up very well for a
game with very different gameplay styles.&lt;/p&gt;

&lt;p&gt;If I had my time again, and was the Lead, I would force non-relocatable and relocatable resources
to be separate heaps, and set my budgets accordingly (easier said than done, though).&lt;/p&gt;



&lt;h2&gt;Runtime Statistics&lt;/h2&gt;

&lt;p&gt;As might have become obvious now, our engine did a &lt;em&gt;lot&lt;/em&gt; of
allocation. Loading up a driving level and checking the number of active
allocations gives a figure of over 13000! Of these allocations, 12000 are in
the bantam (&amp;#8220;small&amp;#8221;) heap.&lt;/p&gt;



&lt;p&gt;At the same point there are 1360 separate loaded resource
files, of which 900 are theoretically relocatable. However, in a typical test these
relocatable resources comprised only about 6MB of the 20+MB of the allocated heap
space (this ratio varies, of course).&lt;/p&gt;



&lt;p&gt;Some tests we did after the game was released showed that we
were doing around 200-300 memory operations (including freeing memory) &lt;em&gt;per
frame&lt;/em&gt; during shooting levels.  On driving levels it was around 100-200, but
with spikes of up to 700 per frame when streamed loading caused object creation
(a spike has been seen with 5000 deallocations in a frame during gameplay). On
previous PS2 titles this was actually worse; there was a lot of work done to
recode rendering allocations which cut down this figure quite significantly.
Nearly all these per-frame allocations were of small size and went in the
bantam heap.&lt;/p&gt;



&lt;p&gt;Clearly this would have an effect on real-time update for
any external tool. We can get some more exhaustive statistics on this if anyone
wants them.&lt;/p&gt;



&lt;p&gt;To run reliably on driving levels, we had to maintain an
overall level of at least 1.5MB free in the main heap. Any less and fragmentation
was liable to cause a crash.&lt;/p&gt;

&lt;h2&gt;Debug Facilities&lt;/h2&gt;

&lt;h3&gt;Per-allocation data&lt;/h3&gt;

&lt;p&gt;These are the debug fields saved per-allocation on the main
different build types.&lt;/p&gt;

&lt;table class=MsoTableGrid border=1 cellspacing=0 cellpadding=0
 &gt;
 &lt;thead&gt;
  &lt;tr&gt;
   &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
   padding:0cm 5.4pt 0cm 5.4pt'&gt;
   &lt;p&gt;&lt;b&gt;Feature&lt;/b&gt;&lt;/p&gt;
   &lt;/td&gt;
   &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
   border-left:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
   &lt;p&gt;&lt;b&gt;Debug&lt;/b&gt;&lt;/p&gt;
   &lt;/td&gt;
   &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
   border-left:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
   &lt;p&gt;&lt;b&gt;Internal disks&lt;/b&gt;&lt;/p&gt;
   &lt;/td&gt;
   &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
   border-left:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
   &lt;p&gt;&lt;b&gt;Master&lt;/b&gt;&lt;/p&gt;
   &lt;/td&gt;
  &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tr&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
  border-top:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Allocation size&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
  border-top:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Allocation time&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
  border-top:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Full name tag (supplied in code)&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;No&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;No&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
  border-top:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Allocation PC&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;No&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border:solid windowtext 1.0pt;
  border-top:none;padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Mission ID&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;Yes&lt;/p&gt;
  &lt;/td&gt;
  &lt;td width=148 valign=top style='width:110.7pt;border-top:none;border-left:
  none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;
  padding:0cm 5.4pt 0cm 5.4pt'&gt;
  &lt;p&gt;No&lt;/p&gt;
  &lt;/td&gt;
 &lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Runtime overhead was 32 bytes/allocation on debug
disks/masters, 48 bytes on full-debug builds.&lt;/p&gt;



&lt;p&gt;The &amp;#8220;mission ID&amp;#8221; field was a late addition. It allowed us to
track quite effectively leaks between missions, particularly when doing
automated tests, and see how long some allocations actually persisted.&lt;/p&gt;



&lt;p&gt;Using names tags for allocations often led to problems. Cut
and paste code, and template code, often made it difficult to provide useful
tags and a lot of STL-style classes ended up with all their allocations with
the same name until we reworked the code. This often led to a lot of subtle
leaks being ignored by programmers!&lt;/p&gt;

&lt;h3&gt;Boundary corruption checks&lt;/h3&gt;

&lt;p&gt;There was the facility to do boundary corruption checks by
tagging data beyond allocations with known values. Surprisingly, this feature
wasn’t that useful to us, although it took a lot of work – we found only 2
cases where it fired, and they were probably debuggable anyway, as the bugs
would have corrupted internal memory pointers.&lt;/p&gt;



&lt;p&gt;The usefulness of this feature was lessened because the
checks for corruption usually fired a long time after the code responsible for
the corruption, sometimes several seconds later. Checks were usually done when
the block itself, or surrounding blocks changed state (usually being freed).
Corrupting the memory system pointers inadvertently made the problems usually
come to light earlier &amp;#8212; usually when doing debug per-frame integrity checks.&lt;/p&gt;

&lt;h3&gt;Reports&lt;/h3&gt;



&lt;p&gt;Memory reports were normally triggered from in-game menus
and provided the usual set of filtering per-pool and per-type, full dumps,
sorting by tag etc. I guess this is all pretty standard.&lt;/p&gt;

&lt;h3&gt;In-game fragmentation display&lt;/h3&gt;



&lt;p&gt;The in-game display of fragmentation gave us a good quick
overview of memory layout. It had a small memory footprint so we could leave it
operational on all disks other than master submissions.&lt;/p&gt;


&lt;p class=caption&gt;&lt;img border=0 width=576
height=403 
src=&quot;http://www.clarets.org/steve/images//24debug/mem_debug_3.jpg&quot;&gt;In-game 
fragmentation display. Top panel
is main heap, lower left is bantam heap (dangerously full!). Different colours represent unique allocations.&lt;/p&gt;

&lt;p&gt;When used in-game, there were keyboard controls to browse
memory and check the type of any selected allocation. There were also options
to highlight allocations with specific names, any allocations after a set time,
or by which mission they were allocated on. This gave a quick and easy way of
spotting obvious leaks, and watching allocation patterns (a sobering
experience).&lt;/p&gt;



&lt;p&gt;Unfortunately, since the control was coarse, it wasn’t that
useful for in-depth analysis; we generally had to resort to written log data
for that.&lt;/p&gt;

&lt;h3&gt;Memory card logs&lt;/h3&gt;

&lt;p&gt;In the final stages we saw a lot of discrepancies between
even &amp;#8220;near disk&amp;#8221; builds &amp;#8212; where all build options were the same as a disk build
except for using the disk as data source &amp;#8212; and the disk builds themselves. We
also had a lot of cases where memory fragmentation was only being reported on
testers’ PS2 Debug kits.&lt;/p&gt;

&lt;p&gt;Since we couldn’t afford the IOP memory to add network
support, we logged quite a lot of statistics to memory card files. This had
near-zero runtime/memory overhead.&lt;/p&gt;

&lt;p&gt;Statistics included:&lt;/p&gt;

&lt;ul&gt;
 &lt;li&gt;Full memory dumps at given points (in particular after
     level shutdowns);&lt;/li&gt;
 &lt;li&gt;Overall memory levels every 5 seconds, very useful for
     memory hotspots;&lt;/li&gt;
 &lt;li&gt;Full exception crash information, including memory areas
     around register addresses (the name of the log file matching the play-through
     would then appear on the exception screen for the testers to add to crash
     reports).&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The dumps were all in normal ASCII format; this made parsing
very easy. Generally the testers played all day then we copied all their memory
card logs off for later analysis. Using the memory cards also meant that the
testers didn’t need much external tools to be run; they could use it in a
fire-and-forget manner.&lt;/p&gt;



&lt;p&gt;We then very quickly knocked up Python scripts to parse the
outputs. By also parsing the MAP file that matched the disk’s executable, we
could also do lookups on all the code that allocated the memory, rather than
storing debug strings at runtime.&lt;/p&gt;



&lt;p&gt;The scripts could then give full annotated and totalised
reports, and visual representation of the memory layout (similar to the in-game
fragmentation display). There was no interactive use of the tools; we never
really found a case where it was necessary. If you really wanted to know
details of an exact allocation we just looked in the text reports.&lt;/p&gt;



&lt;p&gt;The exception handler scripts could also generate a full
binary image file that could get loaded into the PS2 debugger – this was
terrific for checking out complicated crashes.&lt;/p&gt;



&lt;p&gt;In short, this system was probably critical in hunting down
most of the really nasty crash problems we had.&lt;/p&gt;

&lt;h3&gt;&lt;span lang=EN-US&gt; &lt;/span&gt;&lt;/h3&gt;

&lt;p  &gt;&lt;img border=0 width=&quot;480&quot;
height=&quot;328&quot; src=&quot;http://www.clarets.org/steve/images//24debug/mem_debug_1.jpg&quot;&gt;&lt;/p&gt;

&lt;p class=&quot;caption&quot;&gt;output from a Python script showing global
heap memory layout extracted from memory card logs. This shows a snapshot
dumped after an out-of-memory exception, drawn in a similar way to the in-game
fragmentation display. White areas are remaining free memory. The text at the
start of each allocation is the truncated name of the C++ function that did the
allocation. In this view, all allocations from the same code have the same 
colour&lt;/p&gt;

&lt;p  &gt;&lt;img border=0 width=576
height=404 
src=&quot;http://www.clarets.org/steve/images//24debug/mem_debug_2.jpg&quot;&gt;&lt;/p&gt;

&lt;p class=&quot;caption&quot;&gt;the same view as above, but this time
filtered to show allocations inside the current level (in pink) and those from
before (green). Here it’s clearer to the trained eye that we are seeing minor
fragmentation in the middle of the heap. This is because of allocations that
live longer than one mission – here script allocations and the language manager&lt;/span&gt;&lt;/p&gt;



&lt;h3&gt;Allocation histories&lt;/h3&gt;

&lt;p&gt;The debug builds supported a rolling buffer of the last 8192
memory operations in the system. It was optionally built in using conditional compilation.&lt;/p&gt;



&lt;p&gt;Surprisingly, we only found this feature useful on one
occasion. This was a crash bug involving render DMA and cache invalidation on
non-disk builds, where the fact that near-consecutive allocations partially
overlapped causing unexpected data cache write-backs.&lt;/p&gt;



&lt;h2&gt;Some Conclusions&lt;/h2&gt;

&lt;h3&gt;&amp;#8220;Leaks&amp;#8221; between levels&lt;/h3&gt;

&lt;p&gt;On PS1 our approach to memory leaks was simple; we made a simplified
snapshot of the memory state at the start of, say, a level. Then on exit of the
level we compared the memory state to the snapshot. Anything that didn’t match
was a leak.&lt;/p&gt;



&lt;p&gt;On PS2 this approach fell down quite badly. As well as the
fact that not all systems shut down on level exit, it seems that C++ code (or
maybe just our C++ code!) gave memory usage that didn’t fit this model. One
example would be our implementation of dynamically sized arrays, similar to STL
vectors. Although they did not leak memory, they would end up with internal buffers
that would grow but would never shrink back if the number of objects within it
decreased. Often these reallocated buffers would be created at extremely
inopportune times e.g. when the bantam heap had overflowed into the main heap,
causing consistent fragmentation.&lt;/p&gt;



&lt;p&gt;Early on in PS2 development the decision was taken not to
assert when possible leaks were flagged. (This may well have been a mistake.)
The warnings were always ignored by users; often the warnings were spurious,
and in many cases even if the warnings were valid, they were unhelpful e.g. on
the lines of &amp;#8220;there are more generic list objects in the world than when you
started&amp;#8221;.&lt;/p&gt;



&lt;p&gt;Given no asserts, the main approaches we found were:&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;a list of &amp;#8220;acceptable&amp;#8221; tags for leaks. This was actually quite dangerous
and led to some allocations that looked OK sneaking through later on.&lt;/li&gt;

&lt;li&gt;lots of hard work checking every potential leak. This is what we
actually ended up doing.&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;The automated tests and memory card logs were invaluable in
gathering the data for the &amp;#8220;hard work&amp;#8221;.&lt;/p&gt;

&lt;h3&gt;Real-time update versus snapshots&lt;/h3&gt;

&lt;p&gt;At the start of doing the final work on memory debugging we
thought that real-time update would be invaluable. As it turned out, it wasn’t
nearly as important as we expected. Although the in-game display was handy for
getting an overall view of what was going on, most of the crucial events were
only exposed in later analysis.&lt;/p&gt;



&lt;p&gt;The most useful debug capability to me, by far, was the
ability to dump a snapshot at a known point (triggered from code), and
potentially visualise them offline. This let us see very clearly obvious leaks
and fragmentation islands at important points. Because we still had allocation
time in the debug dumps, it was easy to trace patterns of allocation.&lt;/p&gt;

&lt;p&gt;The other really obvious point was that having this data
available in an easily-parsed format was vital. We just used simple CSV-like
text files. It meant that offline processing was trivial and would allow us to
do automation.&lt;/p&gt;


&lt;h3&gt;Conclusions&lt;/h3&gt;

&lt;p&gt;Here are the main things to take away from all this:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;Think about your memory policy as early as possible. Get at least the ability to dump the memory
        layout as soon as you can &amp;#8212; you can go far with just that&lt;/li&gt;
    &lt;li&gt;Understand the different types of memory allocator, and their advantages and disadvantages. If
        I had my time again, I&amp;#8217;d stick with first-fit allocators. Be aware that fragmentation is caused
        at the time of de-allocation, not allocation &amp;#8212; so try to ensure neighbouring allocations get
        freed at roughly the same time.&lt;/li&gt;
    &lt;li&gt;Measure &amp;#8212; don&amp;#8217;t guess! Every man and his dog has his opinions about why you&amp;#8217;re running out of
        memory. It&amp;#8217;s the art. It&amp;#8217;s the maps. It&amp;#8217;s Programmer X doing lots of little allocations. Ignore
        them and sit and &lt;em&gt;find out&lt;/em&gt; how much things are taking. We only needed to look at about
        the top 20 memory allocating functions to account for 80-90% of the memory.&lt;/li&gt;
    &lt;li&gt;You don&amp;#8217;t need to overboard on memory pools. I&amp;#8217;ve seen games that split all their allocations
        in to different pools. For most cases these are wasting memory &amp;#8212; you can intermingle the
        allocations and still track them, particularly if the allocations are relatively small.
        3 or 4 pools is usually enough.&lt;/li&gt;
    &lt;li&gt;Don&amp;#8217;t mix relocatable and non-relocatable allocations. It might buy you some time, but mainly
        you are just postponing the point that your problems start&amp;#8230;&lt;/li&gt;
    &lt;li&gt;Don&amp;#8217;t over-engineer your debugging. The time spent getting that &amp;#8220;perfect system&amp;#8221; can be better
        used elsewhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And finally&amp;#8230;&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Everything is a trade-off. People might think &amp;#8220;what a rubbish system&amp;#8221;, but if you don&amp;#8217;t ship
        your game, you won&amp;#8217;t even have an article to write&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

</description>
  </item>
  <item>
    <title>Mugshot Gallery</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2008/09/19#mugshot_gallery</link>
    <description>
&lt;p&gt;The people at SCEE Cambridge (past and present). Photos courtesy of Andy Ellis.&lt;/p&gt;

&lt;p&gt;My, what a pretty lot we are.&lt;/p&gt;

&lt;table&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_adam_garman.jpg&quot; alt=&quot;adam garman&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_alan_brand.jpg&quot; alt=&quot;alan brand&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_alan_mccarthy.jpg&quot; alt=&quot;alan mccarthy&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_alex_sulman.jpg&quot; alt=&quot;alex sulman&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_andrew_ellis.jpg&quot; alt=&quot;andrew ellis&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_andrew_ostler.jpg&quot; alt=&quot;andrew ostler&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_andrew_scheller.jpg&quot; alt=&quot;andrew scheller&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_andy_knowles.jpg&quot; alt=&quot;andy knowles&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_andy_tudor.jpg&quot; alt=&quot;andy tudor&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_angelo_bod.jpg&quot; alt=&quot;angelo bod&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_ben_hesketh.jpg&quot; alt=&quot;ben hesketh&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_ben_hesketh_2.jpg&quot; alt=&quot;ben hesketh 2&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_ben_levitt.jpg&quot; alt=&quot;ben levitt&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_candice_teo.jpg&quot; alt=&quot;candice teo&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_candice_teo_2.jpg&quot; alt=&quot;candice teo 2&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_chris_riddell.jpg&quot; alt=&quot;chris riddell&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_chris_roope.jpg&quot; alt=&quot;chris roope&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_chris_sorrell.jpg&quot; alt=&quot;chris sorrell&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_daniel_tomlinson.jpg&quot; alt=&quot;daniel tomlinson&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_dave_fletcher.jpg&quot; alt=&quot;dave fletcher&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_dean_miller.jpg&quot; alt=&quot;dean miller&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_dinesh_mahathevan.jpg&quot; alt=&quot;dinesh mahathevan&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_dominic_cahalin.jpg&quot; alt=&quot;dominic cahalin&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_gareth_hughes.jpg&quot; alt=&quot;gareth hughes&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_gavin_bell.jpg&quot; alt=&quot;gavin bell&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_gavin_clarke.jpg&quot; alt=&quot;gavin clarke&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_gaz_antcliffe.jpg&quot; alt=&quot;gaz antcliffe&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_guillaume_raffy.jpg&quot; alt=&quot;guillaume raffy&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_guy_moss.jpg&quot; alt=&quot;guy moss&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_James Shepherd.jpg&quot; alt=&quot;James Shepherd&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_james_busby.jpg&quot; alt=&quot;james busby&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_james_shepherd.jpg&quot; alt=&quot;james shepherd&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_Jason Wilson 1.jpg&quot; alt=&quot;Jason Wilson 1&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_Jason Wilson 2.jpg&quot; alt=&quot;Jason Wilson 2&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_jason_riley.jpg&quot; alt=&quot;jason riley&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_jason_wilson.jpg&quot; alt=&quot;jason wilson&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_jean_baptiste_bolcato.jpg&quot; alt=&quot;jean baptiste bolcato&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_jim_butt.jpg&quot; alt=&quot;jim butt&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_julian_rex.jpg&quot; alt=&quot;julian rex&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_justin_summers.jpg&quot; alt=&quot;justin summers&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_kevin_rose.jpg&quot; alt=&quot;kevin rose&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_lisa_harmon.jpg&quot; alt=&quot;lisa harmon&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_mark_gibbons.jpg&quot; alt=&quot;mark gibbons&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_martin_binfield.jpg&quot; alt=&quot;martin binfield&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_martin_binfield_2.jpg&quot; alt=&quot;martin binfield 2&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_martin_binfield_3.jpg&quot; alt=&quot;martin binfield 3&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_martin_kift.jpg&quot; alt=&quot;martin kift&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_mike_froggatt.jpg&quot; alt=&quot;mike froggatt&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_mike_frost.jpg&quot; alt=&quot;mike frost&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_mitch_phillips.jpg&quot; alt=&quot;mitch phillips&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_Nicholas Kidd.jpg&quot; alt=&quot;Nicholas Kidd&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_patrick_obrien_2.jpg&quot; alt=&quot;patrick obrien 2&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_paul_crowder.jpg&quot; alt=&quot;paul crowder&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_paul_donovan.jpg&quot; alt=&quot;paul donovan&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_paul_edridge.jpg&quot; alt=&quot;paul edridge&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_paul_edridge2.jpg&quot; alt=&quot;paul edridge2&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_paul_firth.jpg&quot; alt=&quot;paul firth&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_pete_giles.jpg&quot; alt=&quot;pete giles&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_phil_mansell.jpg&quot; alt=&quot;phil mansell&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_richard_odonovan.jpg&quot; alt=&quot;richard odonovan&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_rich_talbot_watkins.jpg&quot; alt=&quot;rich talbot watkins&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_rob_hill.jpg&quot; alt=&quot;rob hill&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_rob_king.jpg&quot; alt=&quot;rob king&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_rob_king_2.jpg&quot; alt=&quot;rob king 2&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_rob_needle.jpg&quot; alt=&quot;rob needle&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_rob_starr.jpg&quot; alt=&quot;rob starr&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_rosalind_burr.jpg&quot; alt=&quot;rosalind burr&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_sarah_hefford.jpg&quot; alt=&quot;sarah hefford&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_steven_moore.jpg&quot; alt=&quot;steven moore&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_steven_tattersall.jpg&quot; alt=&quot;steven tattersall&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_steve_loughran.jpg&quot; alt=&quot;steve loughran&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_Stuart Adcock.jpg&quot; alt=&quot;Stuart Adcock&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_stuart_adcock.jpg&quot; alt=&quot;stuart adcock&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_stuart_bugg.jpg&quot; alt=&quot;stuart bugg&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_tom_jones.jpg&quot; alt=&quot;tom jones&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_tony_heap.jpg&quot; alt=&quot;tony heap&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_tony_jackson.jpg&quot; alt=&quot;tony jackson&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_tony_jackson_2.jpg&quot; alt=&quot;tony jackson 2&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//thumb_tony_pyle.jpg&quot; alt=&quot;tony pyle&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</description>
  </item>
  <item>
    <title>My Little PlayTV page</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2008/09/19#my_little_playtv_page</link>
    <description>
&lt;p&gt;&lt;img src=&quot;http://www.clarets.org/steve/images//playtv_box.jpg&quot; align=&quot;right&quot;/&gt;I spent nearly a year as the Lead Programmer on PlayTV, and it should finally be in the shops on September 19th.&lt;/p&gt;



&lt;p&gt;In an interesting twist, this has probably been the most straightforward project I&amp;#8217;ve ever worked on. So it&amp;#8217;s nice
that blogs &lt;a href=&quot;http://www.wonderlandblog.com/wonderland/2008/09/the-ps3-dvr-is.html&quot;&gt;I respect&lt;/a&gt; and &lt;a href=&quot;
http://technovia.co.uk/2008/09/mmmm-playstatio.html&quot;&gt;enjoy&lt;/a&gt; are actually getting quite excited about the product!&lt;/p&gt;

&lt;p&gt;My time on the project is more or less finished now, and I am back working on games concepting. However, there are
lots of snippets of useful information that I&amp;#8217;d like to share about PlayTV, but probably can&amp;#8217;t at the moment (NDAs, 
legal issues). This whole &amp;#8220;DRM&amp;#8221; saga is particularly vexing. Maybe at some point in the future I&amp;#8217;ll be able to release them.&lt;/p&gt;

&lt;p&gt;And of course there is the roll of honour: special thanks to our hard-working developers: Tony Pyle, Sergio Moreira, 
Matt Read, Darren White, Paul Crowder, Emily Brown, Nigal Raymond, Mike Redmond, Tony Godar. It turns out we developed
the product from scratch several times faster than other comparable TV products. (It helps having such a powerful machine!)



</description>
  </item>
  <item>
    <title>About this site</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2008/04/14#about_this_site</link>
    <description>
&lt;p&gt;
It&amp;#8217;s not updated very often, and is mainly a dumping ground for documents created outside of my work for SCEE.
&lt;/p&gt;

&lt;p&gt;This site doesn&amp;#8217;t have comments. Send a mail instead.&lt;/p&gt;

&lt;p&gt;This site is now built with &lt;a href=&quot;http://www.blosxom.com&quot;&gt;Blosxom&lt;/a&gt;. It used to use
&lt;a href=&quot;http://www.movabletype.org&quot;&gt;Movable Type&lt;/a&gt;, but Blosxom suits my less-is-more ethos quite
nicely.&lt;/p&gt;

</description>
  </item>
  <item>
    <title>So Little Time&amp;#8230;</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2007/09/05#50</link>
    <description>
&lt;p&gt;I&amp;#8217;ve taken the day off.&lt;/p&gt;
&lt;p&gt;While it&amp;#8217;s great to have a worthwhile and time-consuming project at work, it means that I&amp;#8217;m neglecting the other, more creative areas of my brain. Sometimes you need to take a break and refresh those un-tickled corners of the mind&lt;/p&gt;

&lt;p&gt;Things I&amp;#8217;d like to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make a game! (Watch this space).&lt;/li&gt;
&lt;li&gt;Learn &lt;a href=&quot;http://www.erlang.org&quot;&gt;Erlang&lt;/a&gt;, to see how well it maps on to current console architectures (and the next ones).&lt;/li&gt;
&lt;li&gt;Finish having a go at the &lt;a href=&quot;http://www.icfpcontest.org/&quot;&gt;ICFP&lt;/a&gt; competition puzzles that I started.&lt;/li&gt;
&lt;li&gt;Investigate visual recognition systems and the maths behind them.&lt;/li&gt;
&lt;li&gt;Finish learning how to use my Sony Alpha SLR camera properly.&lt;/li&gt;
&lt;li&gt;&lt;strike&gt;Buy a bike&lt;/strike&gt; and use it (the bike is bought, but not delivered).&lt;/li&gt;
&lt;li&gt;Do some writing. Maybe this is a start.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Phew! That&amp;#8217;s too much. Where should I start?&lt;/p&gt;

</description>
  </item>
  <item>
    <title>Play TV</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2007/08/28#49</link>
    <description>
&lt;img alt=&quot;playtv.jpg&quot; src=&quot;http://www.clarets.org/steve/images/playtv.jpg/playtv.jpg&quot; width=&quot;480&quot; height=&quot;270&quot; border=&quot;0&quot; /&gt;
&lt;p&gt;
Now that it&amp;#8217;s been officially announced, I guess I can say what I&amp;#8217;m working on. I&amp;#8217;m leading the application team for Sony&amp;#8217;s new PVR, &amp;#8220;Play TV&amp;#8221;. The response seems overwhelmingly positive.&lt;/p&gt;

&lt;p&gt;
Congratulations and well done to the team: the three Tonys, the two Matts, Mark, Sergio, Manuel, Nigal, Emily and the Crowdermiser. It&amp;#8217;s amazing what we&amp;#8217;ve achieved in such a short space of time.
&lt;/p&gt;</description>
  </item>
  <item>
    <title>Perl is like going commando</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2006/01/28#perl_is_like</link>
    <description>
&lt;p&gt;I keep using this analogy about &lt;a href=&quot;http://www.perl.com&quot;&gt;Perl&lt;/a&gt;, but forgetting to get it down on (virtual) paper. So here it is.&lt;/p&gt;

&lt;blockquote&gt;
Perl is like not wearing underpants; it feels tremendously freeing, but sooner or later you&amp;#8217;ll get something caught in your zipper.
&lt;/blockquote&gt;</description>
  </item>
  <item>
    <title>Found phrases: Roshambolic</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2005/07/20#45</link>
    <description>
&lt;p&gt;&lt;b&gt;Roshambolic&lt;/b&gt; (adj.): the state of a badly-organised &lt;a href=&quot;http://en.wikipedia.org/wiki/Rock,_Paper,_Scissors&quot;&gt;Paper-Scissors-Stone&lt;/a&gt; competition.&lt;/p&gt;

&lt;p&gt;UPDATE: &lt;a href=&quot;http://www.gazoongaattack.com/review141001.html&quot;&gt;already coined!&lt;/a&gt;</description>
  </item>
  <item>
    <title>We know Jack</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2005/03/30#44</link>
    <description>
&lt;p&gt;Yes, the studio is doing the game of &amp;#8220;24&amp;#8221;.&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://gamesindustry.biz/press_release.php?aid=7667&quot;&gt;GamesIndustry.biz - &amp;#8216;24&amp;#8217; Counts Down for PlayStation 2 this Autumn&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;If there are mistakes in the German or Italian subtitles, it&amp;#8217;s probably my fault. That&amp;#8217;s about the limit of my involvement, though.&lt;/p&gt;

&lt;p&gt;We have a huge team ploughing through it as I type.&lt;/p&gt;

&lt;p&gt;And what am I working on?&lt;/p&gt;

&lt;p&gt;[/me looks down nervously and mumbles] erm, something.&lt;/p&gt;</description>
  </item>
  <item>
    <title>Ghosthunter - Array Pictures</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2004/12/06#gh_array_pictures</link>
    <description>
&lt;p&gt;Paul de Vrijer sent a nice mail the other day, asking why you couldn&amp;#8217;t see the ghosts in the array after about the ship (can&amp;#8217;t remember which level). Anyway, it seemed to waste the code and art that was in the game, so I took screenshots of all the ghosts, and here they are:&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0000.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0000.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0001.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0001.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0002.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0002.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0003.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0003.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0004.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0004.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0005.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0005.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0006.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0006.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0007.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0007.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0008.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0008.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0009.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0009.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0010.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0010.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0011.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0011.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0012.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0012.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0013.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0013.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0014.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0014.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0015.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0015.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0016.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0016.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0017.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0017.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0018.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0018.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0019.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0019.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0020.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0020.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0021.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0021.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0022.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0022.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0023.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0023.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0024.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0024.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0025.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0025.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0026.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0026.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0027.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0027.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0028.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0028.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0029.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0029.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0030.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0030.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0031.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0031.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0032.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0032.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0033.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0033.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0034.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0034.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0035.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0035.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0036.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0036.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0037.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0037.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0038.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0038.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0039.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0039.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0040.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0040.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0041.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0041.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0042.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0042.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0043.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0043.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0044.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0044.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0045.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0045.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/td&gt;&lt;a href=&quot;http://www.clarets.org/steve/images/gh_array/array_0046.jpg&quot;&gt;&lt;img src=&quot;http://www.clarets.org/steve/images/gh_array/thumb_array_0046.jpg&quot; alt=&quot;&quot;&gt;&lt;/a&gt;&lt;/table&gt;
&lt;/p&gt;
</description>
  </item>
  <item>
    <title>Ghosthunter Cheats</title>
    <link>http://www.clarets.org/steve/blosxom.cgi/2004/11/04#ghosthunter_cheats</link>
    <description>
&lt;p&gt;It&amp;#8217;s about time I posted the cheats to this game.&lt;/p&gt;

&lt;p&gt;To activate, you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;be in-game,&lt;/li&gt;
&lt;li&gt;hold down a certain button combo for about 5 seconds (with no other buttons held)&lt;/li&gt;
&lt;li&gt;tap an extra button (keeping the combo held down).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here are the current combos:&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;HOLD DOWN FOR 5 SECS&lt;/td&gt;&lt;td&gt;TAP&lt;/td&gt;&lt;td&gt;CHEAT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L3, digital &amp;#8220;right&amp;#8221;		&lt;/td&gt;&lt;td&gt;Triangle		&lt;/td&gt;&lt;td&gt;Disable Laz death&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;L3, digital &amp;#8220;right&amp;#8221;		&lt;/td&gt;&lt;td&gt;Circle		&lt;/td&gt;&lt;td&gt;Mega damage (easier to kill enemies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R3, Square				&lt;/td&gt;&lt;td&gt;digital &amp;#8220;up&amp;#8221;	&lt;/td&gt;&lt;td&gt;Hat Cheat. Some entities will wear silly hats/costumes.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;

&lt;p&gt;(&amp;#8220;digital right&amp;#8221; refers to the button directly left of &amp;#8220;select&amp;#8221;, not sure what the official name is)&lt;/p&gt;

&lt;p&gt;You will get a piece of text such as &amp;#8220;Yes!&amp;#8221; on-screen if each code has worked.&lt;/p&gt;

&lt;p&gt;You need to do these in the order specified (e.g. you can&amp;#8217;t turn on the hat cheat on its own).&lt;/p&gt;

&lt;p&gt;Cheats will be saved until the machine is reset, but not saved on memory card.&lt;/p&gt;


&lt;p&gt;As an example of the hat cheat: here&amp;#8217;s the teddy monster with a handbag:&lt;/p&gt;

&lt;p&gt;
&lt;img alt=&quot;teddy_with_handbag.png&quot; src=&quot;http://www.clarets.org/steve/teddy_with_handbag.png&quot; width=&quot;320&quot; height=&quot;224&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There are several others, but I don&amp;#8217;t want to spoil the fun.&lt;/p&gt;

</description>
  </item>
  </channel>
</rss>