<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>fishsoup &#187; Coding</title>
	<atom:link href="http://blog.fishsoup.net/category/coding/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fishsoup.net</link>
	<description>Owen Taylor on Coding, Food, etc.</description>
	<lastBuildDate>Wed, 09 Nov 2011 03:13:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.fishsoup.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>fishsoup &#187; Coding</title>
		<link>http://blog.fishsoup.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.fishsoup.net/osd.xml" title="fishsoup" />
	<atom:link rel='hub' href='http://blog.fishsoup.net/?pushpress=hub'/>
		<item>
		<title>Application/Compositor Synchronization</title>
		<link>http://blog.fishsoup.net/2011/11/08/applicationcompositor-synchronization/</link>
		<comments>http://blog.fishsoup.net/2011/11/08/applicationcompositor-synchronization/#comments</comments>
		<pubDate>Tue, 08 Nov 2011 20:41:55 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[GNOME]]></category>

		<guid isPermaLink="false">http://blog.fishsoup.net/?p=417</guid>
		<description><![CDATA[This blog entry continues an extended series of posts over the last couple of years. Older entries: Frames not Idles (May 2009) Timing Frame Display (June 2009) What to do if you can’t do 60fps (June 2011) Frame Timing the Simple Way (June 2011) What we figured out in the last post was that if [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=417&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This blog entry continues an extended series of posts over the last couple of years. Older entries:</p>
<ul>
<li> <a href="http://blog.fishsoup.net/2009/05/28/frames-not-idles/">Frames not Idles</a> (May 2009)</li>
<li><a href="http://blog.fishsoup.net/2009/06/02/timing-frame-display/">Timing Frame Display</a> (June 2009)</li>
<li><a href="http://blog.fishsoup.net/2011/06/22/what-to-do-if-you-cant-do-60fps/">What to do if you can’t do 60fps </a> (June 2011)</li>
<li><a href="http://blog.fishsoup.net/2011/06/30/frame-timing-the-simple-way/">Frame Timing the Simple Way</a> (June 2011)</li>
</ul>
<p>What we figured out in the last post was that if you can&#8217;t animate at 60fps, then from the point of achieving a smooth display, a very good thing to do is to just animate as fast as you can while still giving the compositor time to redraw. The process is represented visually below. (You can click on the image for a larger version.)</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/11/acx-loaded-large.png"><img src="http://owtaylor.files.wordpress.com/2011/11/acx-loaded-small.png" alt="" title="Application/Compositor Synchronization (Loaded)" width="640" height="400" class="aligncenter size-full wp-image-419" /></a></p>
<p>The top section shows a timeline of activity for the Application, Compositor, and X server. At the bottom, we show the contents of the application&#8217;s window pixmap, the back buffer, and the front buffer as time progresses. From this, we can get an idea of the time between the point where a user hits a key and the point where that displays on the screen: the input latency. The keystroke C almost immediately makes its way into a new application frame, and that new frame is almost immediately drawn by the compositor into the back buffer, and the back buffer is almost immediately swapped by the X server. On the other hand, the keystroke D suffers multiple delays.</p>
<p>What happens if we use the same algorithm when we&#8217;re unloaded &#8211; when the total drawing time is less than the interval between screen refreshes? Then it looks like:</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/11/acx-unloaded-large.png"><img src="http://owtaylor.files.wordpress.com/2011/11/acx-unloaded-small.png" alt="" title="Application/Compositor Synchronization (Unloaded)" width="640" height="400" class="aligncenter size-full wp-image-426" /></a></p>
<p>This is basically working pretty well &#8211; but we note that even though the application is drawing quickly and the entire system is unloaded we still have a lot of input latency.  If we plot the latency versus the application drawing time it looks like:</p>
<p><img src="http://owtaylor.files.wordpress.com/2011/11/acx-latency-draw-immediately.png" alt="" title="Input Latency vs. Application Draw Time" width="639" height="479" class="aligncenter size-full wp-image-423" /></p>
<p>The shaded area shows the theoretical range of latencies, the solid line the theoretical average latency, and the points show min/max/avg latencies as measured in a simulation. (It should be mentioned that this is only the latency when we&#8217;re continually drawing frames. An isolated frame won&#8217;t have any problems with previously queued frames, so will appear on the screen with minimal latency.)</p>
<p>We could potentially improve this by having the application delay rendering a new frame &#8211; the compositor can use the time used to render the last frame to make a guess as to a &#8220;deadline&#8221; &#8211; a time by which the application needs to have the frame rendered. We can again look at a timeline plot and simulated latencies for this algorithm:</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/11/acx-unloaded-both-delay-large.png"><img src="http://owtaylor.files.wordpress.com/2011/11/acx-unloaded-both-delay-small.png" alt="" title="Application/Compositor Synchronization (Unloaded, With Delay)" width="640" height="400" class="aligncenter size-full wp-image-425" /></a></p>
<p><img src="http://owtaylor.files.wordpress.com/2011/11/acx-latency-wait.png" alt="" title="Input Latency vs. Application Draw Time (With Delay)" width="639" height="479" class="aligncenter size-full wp-image-422" /></p>
<p>There are downsides to delaying frame render &#8211; the obvious one is that if we guess wrong and the application starts the frame too late, then we can entirely miss a frame. From a smoothness point of view this looks really bad. In general, an application should only use a deadline provided by the compositor if it has reason to believe that the next frame is roughly similar to the previous one. Another disadvantage is that the delay algorithm does cause a frame-rate cliff as soon as the time to draw a frame exceeds the vblank period &#8211; there is an instant drop from 60fps to 30fps.</p>
<p>Which of these two algorithms is better likely depends upon the application: if an application wants maximum animation smoothness and protection from glitches, drawing frames as early makes sense. On the other hand, if input latency is a critical factor &#8211; for a game or real-time music application, then delaying frame drawing as late as possible would be preferable.</p>
<p>So, what we want to do from the level of application/compositor synchronization is provide enough information to allow applications to implement different algorithms. After drawing a frame, the compositor should send a message to the application containing:</p>
<ul>
<li>The expected time at which the frame will be displayed on screen</li>
<li>If possible, a deadline by which the application needs to have finished drawing the next frame to get it appear onscreen.
<li>The time that the next frame will be displayed onscreen</li>
</ul>
<p>But even without the deadline information, just having a basic response at the end of the frame already greatly improves the situation from the current situation. I&#8217;m working on a <a href="https://mail.gnome.org/archives/wm-spec-list/2011-October/msg00006.html">proposal</a> to add application/compositor synchronization to the Extended Window Manager Hints specification.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owtaylor.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owtaylor.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owtaylor.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owtaylor.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/owtaylor.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/owtaylor.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/owtaylor.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/owtaylor.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owtaylor.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owtaylor.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owtaylor.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owtaylor.wordpress.com/417/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owtaylor.wordpress.com/417/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owtaylor.wordpress.com/417/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=417&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fishsoup.net/2011/11/08/applicationcompositor-synchronization/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a45426932356d75ac19f68c0c958f800?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Owen</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/11/acx-loaded-small.png" medium="image">
			<media:title type="html">Application/Compositor Synchronization (Loaded)</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/11/acx-unloaded-small.png" medium="image">
			<media:title type="html">Application/Compositor Synchronization (Unloaded)</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/11/acx-latency-draw-immediately.png" medium="image">
			<media:title type="html">Input Latency vs. Application Draw Time</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/11/acx-unloaded-both-delay-small.png" medium="image">
			<media:title type="html">Application/Compositor Synchronization (Unloaded, With Delay)</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/11/acx-latency-wait.png" medium="image">
			<media:title type="html">Input Latency vs. Application Draw Time (With Delay)</media:title>
		</media:content>
	</item>
		<item>
		<title>Frame Timing: the Simple Way</title>
		<link>http://blog.fishsoup.net/2011/06/30/frame-timing-the-simple-way/</link>
		<comments>http://blog.fishsoup.net/2011/06/30/frame-timing-the-simple-way/#comments</comments>
		<pubDate>Thu, 30 Jun 2011 22:03:04 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.fishsoup.net/?p=403</guid>
		<description><![CDATA[This is a follow-up to my post from last week; I wanted to look into why the different methods of frame timing looked different from each other. As a starting point, we can graph the position position of a moving object (like the ball) as displayed to the user versus it&#8217;s theoretical position (gray line): [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=403&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>This is a follow-up to <a href="http://blog.fishsoup.net/2011/06/22/what-to-do-if-you-cant-do-60fps/">my post</a> from last week; I wanted to look into <i>why</i> the different methods of frame timing looked different from each other. As a starting point, we can graph the position position of a moving object (like the ball) as displayed to the user versus it&#8217;s theoretical position (gray line):</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/06/simulation_example.png"><img src="http://owtaylor.files.wordpress.com/2011/06/simulation_example.png" alt="" title="Position vs. Time" width="600" height="400" class="aligncenter size-full wp-image-404" /></a></p>
<p>The &#8220;Frame Start&#8221; and &#8220;Frame Center&#8221; lines represent the two methods described in the last post. We either choose position of objects in the frame based on the theoretical position at the <i>start</i> of the time that the frame will be displayed, or at the <i>center</i> of the frame time. The third line &#8220;Constant Steps&#8221; shows a method that wasn&#8217;t described in the last post, but you would have seen if you tried the demo: it&#8217;s actually the simplest possible algorithm you can imagine: compute the positions of objects at the current time, draw the frame as fast as possible, start a new frame.</p>
<p>The initial reaction to the above graph is that the &#8220;Frame Center&#8221; method is about as good as you can get at tracking the theoretical position, and the &#8220;Constant Steps&#8221; method is much worse than the other two. But this isn&#8217;t what you see if you try out the demo &#8211; Constant Steps is actually quite a bit better than Frame Start. Trying to understand this, I realized that the delay &#8211; the vertical offset in the graph &#8211; is really completely irrelevant to how smooth things look &#8211; the user has no idea of where things are supposed to be &#8211; just how things change from frame to frame. What matters for smoothness is mostly the velocity &#8211; the distance things move from frame to frame. If we plot this, we see a quite different picture:</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/06/simulation_example_velocity.png"><img src="http://owtaylor.files.wordpress.com/2011/06/simulation_example_velocity.png" alt="" title="Velocity vs. Time" width="600" height="400" class="aligncenter size-full wp-image-405" /></a></p>
<p>Here we see something more like the visual impression &#8211; that the &#8220;Frame Start&#8221; method has a lot more bouncing around in velocity as compared to the other two. (The velocity for all three drops to zero when we miss a frame.) We can quantify this a bit by graphing the variance of the velocity versus time to draw a frame. We look at the region from a frame draw time of 1 frame (60fps) to a frame draw time of 2 frames (30fps).</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/06/simulation_velocity_variance.png"><img src="http://owtaylor.files.wordpress.com/2011/06/simulation_velocity_variance.png" alt="" title="Velocity Variance" width="600" height="400" class="aligncenter size-full wp-image-407" /></a></p>
<p>Here we see that in terms of providing consistent motion velocity, Constant Steps is actually is a bit better than the Frame Center at all times.</p>
<p>What about latency? You might think that Constant Steps is worse because it&#8217;s tracking the theoretical position less closely, but really, this is an artifact &#8211; to implement Frame Center, we have to predict future positions. And,  unless we can predict what the user is going to do, predicting future positions cannot reduce latency in responding to input. The only thing that tracking the theoretical positions closer helps with is is if we&#8217;re trying to do something iike sync video to audio. And of course, to the extent that we can predict future positions or compute a delay to apply to the audio track, we can do that for Constant Steps as well: instead of drawing everything at their current positions, we can choose them based on the position at a time shortly in the future.</p>
<p>If such a simple method work well, do we actually need compositor to application synchronization? It&#8217;s likely needed because we can&#8217;t really draw frames as fast as possible, we should draw frames only as fast as possible while still allowing the compositor to always be able to get in, get GPU resources, and draw a frame at the right time.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owtaylor.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owtaylor.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owtaylor.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owtaylor.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/owtaylor.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/owtaylor.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/owtaylor.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/owtaylor.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owtaylor.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owtaylor.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owtaylor.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owtaylor.wordpress.com/403/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owtaylor.wordpress.com/403/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owtaylor.wordpress.com/403/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=403&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fishsoup.net/2011/06/30/frame-timing-the-simple-way/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a45426932356d75ac19f68c0c958f800?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Owen</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/06/simulation_example.png" medium="image">
			<media:title type="html">Position vs. Time</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/06/simulation_example_velocity.png" medium="image">
			<media:title type="html">Velocity vs. Time</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/06/simulation_velocity_variance.png" medium="image">
			<media:title type="html">Velocity Variance</media:title>
		</media:content>
	</item>
		<item>
		<title>What to do if you can&#8217;t do 60fps?</title>
		<link>http://blog.fishsoup.net/2011/06/22/what-to-do-if-you-cant-do-60fps/</link>
		<comments>http://blog.fishsoup.net/2011/06/22/what-to-do-if-you-cant-do-60fps/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 21:58:48 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.fishsoup.net/?p=379</guid>
		<description><![CDATA[I&#8217;ve been working recently on figuring out application to compositor synchronization. One aspect of that is the timing information does the compositor need to send back to the application and how should the application use it. In the case where everything is lightly loaded and we can hit 60fps, it&#8217;s pretty obvious what we want [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=379&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been working recently on figuring out application to compositor synchronization. One aspect of that is the timing information does the compositor need to send back to the application and how should the application use it. In the case where everything is lightly loaded and we can hit 60fps, it&#8217;s pretty obvious what we want &#8211; we just output constantly spaced frames:</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/06/60fps.png"><img src="http://owtaylor.files.wordpress.com/2011/06/60fps.png" alt="" title="60fps: smooth motion" width="531" height="81" class="aligncenter size-full wp-image-384" /></a></p>
<p>But what if we can&#8217;t do that? Say we only have the CPU and GPU resources to draw 40fps. To keep things simple and frame timing consistent, do we drop every other frame and draw the animation at 30fps?</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/06/30fps.png"><img src="http://owtaylor.files.wordpress.com/2011/06/30fps.png" alt="" title="30fps: dropping every other frame" width="531" height="81" class="aligncenter size-full wp-image-380" /></a></p>
<p>(Gray frames are frames where we don&#8217;t do an update and reuse the previous image. The dotted circles show the theoretical position of the moving ball at the time of the frame.)</p>
<p>Or maybe it would be better to show more frames, to drop only one out of every three frames?</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/06/40fps-frame-start.png"><img src="http://owtaylor.files.wordpress.com/2011/06/40fps-frame-start.png" alt="" title="40fps: dropping 1 out of 3 frames" width="531" height="81" class="aligncenter size-full wp-image-383" /></a></p>
<p>Or maybe we need to do something more sophisticated than to just drop frames &#8211; maybe when rendering a frame we need to take into account how long the frame will be displayed for and calculate positions at the <b>center</b> of the frame display period?</p>
<p><a href="http://owtaylor.files.wordpress.com/2011/06/40fps-frame-center.png"><img src="http://owtaylor.files.wordpress.com/2011/06/40fps-frame-center.png" alt="" title="40ps: positions at frame center" width="531" height="81" class="aligncenter size-full wp-image-382" /></a></p>
<p>The answers to what looked better wasn&#8217;t at all obvious to me, even after a few years of playing with drawing animations for GNOME Shell, so I wrote a <a href="http://git.fishsoup.net/cgit/frame-rate-demo">demo application</a> to try out various things. If you want to test it out, note that it needs to be run uncomposited, so under GNOME 3, run <tt>metacity --replace &amp;</tt> from a terminal and then use Alt-F4 to close the &#8220;something has gone wrong&#8221; screen. (<tt>gnome-shell --replace &amp;</tt> to get back to your desktop.)</p>
<p>So, what conclusions have I drawn from looking at my demo? The first conclusion is that 60fps is visually way better than anything else. This wasn&#8217;t completely obvious to me going in &#8211; after all, movies run at 24fps. But movies have motion blur from the exposure time, which we don&#8217;t have here. (Adding motion blur to desktop animations would increase computational work considerably, and it seems unlikely that 30fps + motion blur looks better than 60fps without motion blur.)</p>
<p>The second conclusion is that how we time things matters a lot. Of the two methods above for dropping every third frame, the second method is obviously much  better than the first one. </p>
<p>The third conclusion, is that if we can get frame timing right, then running at 40fps looks better than running at 30fps, but if we don&#8217;t get frame timing right, then the visual appearance is about the same, or possibly even worse.</p>
<p>What does this mean for an application to compositor synchronization protocol? I don&#8217;t have the final answer to that yet, but in very general terms we need to support applications that want to draw at frame rates like 40fps, because it can potentially look better &#8211; but we have to be careful that we support doing it with algorithms that actually look better.</p>
<p><b>Update:</b> BTW, if anybody knows useful literature references about this area, I&#8217;d be interested.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owtaylor.wordpress.com/379/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owtaylor.wordpress.com/379/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owtaylor.wordpress.com/379/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owtaylor.wordpress.com/379/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/owtaylor.wordpress.com/379/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/owtaylor.wordpress.com/379/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/owtaylor.wordpress.com/379/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/owtaylor.wordpress.com/379/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owtaylor.wordpress.com/379/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owtaylor.wordpress.com/379/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owtaylor.wordpress.com/379/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owtaylor.wordpress.com/379/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owtaylor.wordpress.com/379/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owtaylor.wordpress.com/379/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=379&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fishsoup.net/2011/06/22/what-to-do-if-you-cant-do-60fps/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a45426932356d75ac19f68c0c958f800?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Owen</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/06/60fps.png" medium="image">
			<media:title type="html">60fps: smooth motion</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/06/30fps.png" medium="image">
			<media:title type="html">30fps: dropping every other frame</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/06/40fps-frame-start.png" medium="image">
			<media:title type="html">40fps: dropping 1 out of 3 frames</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2011/06/40fps-frame-center.png" medium="image">
			<media:title type="html">40ps: positions at frame center</media:title>
		</media:content>
	</item>
		<item>
		<title>GNOME Shell GUADEC wrap-up</title>
		<link>http://blog.fishsoup.net/2010/08/02/gnome-shell-guadec-wrap-up/</link>
		<comments>http://blog.fishsoup.net/2010/08/02/gnome-shell-guadec-wrap-up/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 18:02:23 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.fishsoup.net/?p=289</guid>
		<description><![CDATA[Unless you&#8217;ve been hiding under a rock, if you are a GNOME contributor, you probably know the big news from GUADEC: we decided to push GNOME 3 back another six months. I obviously would prefer if this wasn&#8217;t necessary &#8211; it feels like we&#8217;ve been working on GNOME Shell for a long time now, and [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=289&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Unless you&#8217;ve been hiding under a rock, if you are a GNOME contributor, you probably know the big news from GUADEC: we decided to push GNOME 3 back another six months. I obviously would prefer if this wasn&#8217;t necessary &#8211; it feels like we&#8217;ve been working on GNOME Shell for a long time now, and it would be good to get something into user&#8217;s hands. (It&#8217;s been 19 months or so since we announced the project and wrote the first code.) But it was definitely the right decision: it will give us the time to make GNOME 3 really solid, rather than pushing something not quite finished out the door.</p>
<p>The GNOME Shell team did 3 talks:</p>
<ul>
<li>I gave a presentation where I looked at what we&#8217;ve done in the last year and where we are currently:  <a href="http://fishsoup.net/bib/#GnomeShellGuadec2010">The State of the GNOME 3 Shell</a>.</li>
<li>Jon talked about the big ideas behind GNOME Shell design, then together with Jakub gave a peak at some of the work they&#8217;ve been doing recently: <a href="http://blogs.gnome.org/mccann/2010/08/01/shell-yes/">Shell Yes!</a>.</li>
<li>Colin and Dan talked about how to make your application rock with GNOME 3: <a href="http://gnome.org/~danw/gnome-3-and-your-app.odp">GNOME 3 and Your Application</a></li>
</ul>
<p>Unfortunately, the videos for the talks aren&#8217;t yet posted anywhere. So, you&#8217;ll have to figure out what you can from slides. This may be pretty hard for my talk &#8211; a lot of the slides are just screenshots comparing where we were a year ago to where we are today. But Colin and Dan&#8217;s talk has notes in the slides, and Jon&#8217;s talk has a video mockup of upcoming shell design changes.</p>
<p>Some media coverage: You can hear me talking with Fabian Scherschel about the shell in the latest Linux Outlaws <a href="http://linuxoutlaws.com/podcast/160"> podcast</a>, and if you read German there&#8217;s an article by Andreas Proschofsky at <a href="http://derstandard.at/1277339159479/Linux-Desktop-GNOME-Shell-Die-Zukunft-der-Zukunft">derstandard.at</a>.</p>
<p>We had a good crowd of shell people at the conference; there were 6 or so of us there from Red Hat, and beyond that I was really happy to meet Florian Muellner and Maxim Ermilov who have been responsible for much of the progress in the shell over the last year. (I&#8217;d tell you what they&#8217;ve done here, but it would make this post too long.) Our two summer of code students were also there: Christina Boumpouka who is working on adding CSS support to LookingGlass, and Matt Novenstern who is doing a bunch of improvements to the message tray.</p>
<p>I talked to the Tracker crowd a bit about integration of Tracker with the shell. I mentioned a couple of areas where we could use some help on the Tracker side: we need more notifications, so we don&#8217;t have to constantly requery to show the user all their files and no deleted files, and someone needs to take care of pushing files that the user actually uses into Tracker for indexing whether or not they are in the directories that Tracker automatically indexes. But basically it&#8217;s a question of finding someone with the time to sit down and do the work and implement the designs we have. The shell needs a way to search files and file metadata, and Tracker is obvious leader in this area for GNOME.</p>
<p>I also talked a bit about remerging St and Mx with Chris Lord and Emmanuelle Bassi, though somehow I missed catching up with Thomas Wood. We&#8217;re all really positive on the idea &#8211; there&#8217;s been a lot of complementary development on the two codebases. (The way I explained it in my talk is that St has powerful CSS support, which we need for the one-off shell UI, while Mx has far more widgets, which they need for the wider range of things they use Mx for in Meego..) There&#8217;s definitely some devil in the details &#8211; we&#8217;re definitely not done with every toolkit enhancement we need for the shell, for one thing &#8211; but hopefully we can make it happen soon.</p>
<p>Øyvind Kolås gave an awesome demo of <a href="http://git.clutter-project.org/?r=cluttersmith">ClutterSmith</a>. This had the GNOME Shell designers jumping up and down to get it yesterday &#8211; enough with Inkscape and Blender. Ideally, we could have a live mockup of the shell in ClutterSmith, using the same images and CSS files as the real shell, and the designers could use that to experiment with new visual changes and motion design.</p>
<p>On the plane home, I started hacking on new shadow code for Mutter that can handle variable shadow radii and shaped shadows.  It&#8217;s still a work in progress, but since every blog post needs a picture:</p>
<p style="text-align:center;"><img class="size-full wp-image-291 aligncenter" title="Shadow Test Program" src="http://owtaylor.files.wordpress.com/2010/08/shadow-test-program.png" alt="" width="404" height="430" /></p>
<p>(This is a test program using images for windows; the ugly window borders are ugly because that&#8217;s what I could draw in the GIMP quickly. On the other hand, the shadow banding is a defect in my code that I&#8217;m still working on.)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owtaylor.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owtaylor.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owtaylor.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owtaylor.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/owtaylor.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/owtaylor.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/owtaylor.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/owtaylor.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owtaylor.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owtaylor.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owtaylor.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owtaylor.wordpress.com/289/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owtaylor.wordpress.com/289/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owtaylor.wordpress.com/289/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=289&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fishsoup.net/2010/08/02/gnome-shell-guadec-wrap-up/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a45426932356d75ac19f68c0c958f800?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Owen</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2010/08/shadow-test-program.png" medium="image">
			<media:title type="html">Shadow Test Program</media:title>
		</media:content>
	</item>
		<item>
		<title>Measuring GNOME Shell Performance</title>
		<link>http://blog.fishsoup.net/2010/05/26/measuring-gnome-shell-performance/</link>
		<comments>http://blog.fishsoup.net/2010/05/26/measuring-gnome-shell-performance/#comments</comments>
		<pubDate>Wed, 26 May 2010 23:32:31 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.fishsoup.net/?p=255</guid>
		<description><![CDATA[One of the big goals of the GNOME 3 Shell is to use animation and visual effects for positive good. An animation explains to the user what the connection is between point A and point B. For this to work, the animation has to be smooth &#8211; it can&#8217;t be a jerky sequence of disconnected [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=255&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>One of the big goals of the <a href="http://live.gnome.org/GnomeShell">GNOME 3 Shell</a> is to use animation and visual effects for positive good. An animation explains to the user what the connection is between point A and point B. For this to work, the animation has to be smooth &#8211; it can&#8217;t be a jerky sequence of disconnected frames. Performance matters.</p>
<p>Over the last 18 months we&#8217;ve done a fair bit of work on performance &#8211; everything from fixing problems with AGP memory caching in the radeon kernel drivers to to moving tests for whether recent files are still there to a separate thread. But this work was ad-hoc and unsystematic. There was no way to see if shell performance got better or worse over time. To compare the performance of two different systems. Or even to tell in a rigorous way whether an optimization that seemed to make sense actual improved things. Over the last few weeks I&#8217;ve been working to correct this; to get hard, repeatable numbers that represent how well the shell is performing.</p>
<p>The core of the GNOME Shell performance framework is the <strong>event log</strong>. When event logging is enabled, all sorts of different types of <strong>events</strong> are logged: when painting of a frame begins, when painting of a frame ends, when the user enters the overview, and so forth. The log is stored in a compact format (as little as 6 bytes per event), so can be recorded with very little overhead. It doesn&#8217;t significantly affect performance.</p>
<p>The other thing that is recorded in the event log is <strong>statistics</strong>. A statistic is some measurement about the current state: for example, how many bytes of memory have been allocated. Every few seconds, registered statistics are polled and written to the event log as a special event type. Statistics collection can also be triggered manually.</p>
<p>Once we have an event log recorded, we can analyze it to determine <strong>metrics</strong>. We can measure the latency between clicking on the activities overview button and the first frame of the zoom animation. We can see how many bytes are leaked each time the user goes to the overview by comparing the memory usage before and after. Since we want to measure exactly the same conditions every time, we don&#8217;t want to analyze a performance log generated by the user actually doing stuff; instead we script the operation of the shell from Javascript. You can see how this looks by looking at the run() function in <a href="http://git.gnome.org/browse/gnome-shell/tree/js/perf/core.js">js/perf/core.js</a>. The rest of this performance script contains the logic to compute the metrics when the recorded event log is replayed (For example, during replay the script_overviewShowDone() function is called when replaying a script.overviewShowDone event.)</p>
<p>Running <code>gnome-shell --replace --perf=core</code> produces a summary of the computed metrics that looks, in part, like:</p>
<p><code># Additional malloc'ed bytes the second time the overview is shown<br />
leakedAfterOverview 83200<br />
# Time to first frame after triggering overview, first time<br />
overviewLatencyFirst 192482<br />
# Time to first frame after triggering overview, second time<br />
overviewLatencySubsequent 66838<br />
</code></p>
<p>(The times are in microseconds.) Being able to get these numbers for a particular build of the shell is good, but what we really want to be able to do is compare these numbers over lots of systems over time. So, there&#8217;s also a website <a href="http://shell-perf.gnome.org">shell-perf.gnome.org</a> where statistics can be uploaded.</p>
<p>(The way that uploading works is that after registering a system on the site, you are mailed instructions about how to create a ~/.config/gnome-shell/perf.ini with an appropriate secret key, and the <code>--perf-upload</code> option uploads the report. Please only do this with <a href="http://live.gnome.org/GnomeShell#Building">Git builds</a> of gnome-shell for now &#8211; there are some updates to the metrics even since the 2.29.2 release yesterday.)</p>
<p>If you browse around the site, you&#8217;ll see that you can look at the recorded metrics for different systems or for an individual system over time. You can also look at a specific uploaded report. <a href="http://shell-perf.gnome.org/report/otaylor-fedora13-radeon.rv505/13">An example</a>:</p>
<p><a href="http://shell-perf.gnome.org/report/otaylor-fedora13-radeon.rv505/13"><img src="http://owtaylor.files.wordpress.com/2010/05/gnome-shell-event-log-viewer.png" alt="shell-perf.gnome.org: detailed view of a performance report" title="gnome-shell-report-view" width="540" height="272" class="aligncenter size-full wp-image-281" /></a></p>
<p>I should point out, since it&#8217;s not very obvious, that navigation to individual reports is by clicking on the report headers in the system view. In the report view, you can see the details of the uploaded metrics. But you also can see the entire original event log!  (The event log browser is using the HTML canvas &#8211; I&#8217;ve tested it in Firefox and Epiphany &#8211; it probably works in most browsers that GNOME developers are likely to be using.) Having the event log means that if an anomalous performance report is uploaded we can actually dig in and see more about what&#8217;s going on.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owtaylor.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owtaylor.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owtaylor.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owtaylor.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/owtaylor.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/owtaylor.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/owtaylor.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/owtaylor.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owtaylor.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owtaylor.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owtaylor.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owtaylor.wordpress.com/255/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owtaylor.wordpress.com/255/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owtaylor.wordpress.com/255/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=255&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fishsoup.net/2010/05/26/measuring-gnome-shell-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a45426932356d75ac19f68c0c958f800?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Owen</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2010/05/gnome-shell-event-log-viewer.png" medium="image">
			<media:title type="html">gnome-shell-report-view</media:title>
		</media:content>
	</item>
		<item>
		<title>GNOME Shell 2.28.0 &#8211; A Preview</title>
		<link>http://blog.fishsoup.net/2009/10/07/gnome-shell-2-28-0-a-preview/</link>
		<comments>http://blog.fishsoup.net/2009/10/07/gnome-shell-2-28-0-a-preview/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 00:29:26 +0000</pubDate>
		<dc:creator>Owen</dc:creator>
				<category><![CDATA[Coding]]></category>

		<guid isPermaLink="false">http://blog.fishsoup.net/?p=242</guid>
		<description><![CDATA[Going from releasing GNOME 2.27.x unstable releases of GNOME Shell to GNOME 2.29.x unstable releases of GNOME Shell naturally involves crossing 2.28 in the middle, so we thought we&#8217;d take the opportunity to make a set of tarballs that are little more stable than the typical Friday snapshots. A good place for people to try [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=242&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Going from releasing GNOME 2.27.x unstable releases of GNOME Shell to GNOME 2.29.x unstable releases of GNOME Shell naturally involves crossing 2.28 in the middle, so we thought we&#8217;d take the opportunity to make a set of tarballs that are little more stable than the typical Friday snapshots. A good place for people to try things out. I&#8217;ve just uploaded mutter-2.28.0 and gnome-shell-2.28.0 tarballs to ftp.gnome.org.</p>
<p>If you want to building things yourself, you still should use the JHBuild setup described on our <a href="http://live.gnome.org/GnomeShell">wiki page</a>. It&#8217;s the easiest way to do it. The tarballs are really designed for people creating distribution packages.</p>
<p>Looking back, I haven&#8217;t blogged about GNOME Shell changes since February. That&#8217;s a very long time so I&#8217;m not going to make any attempt to describe here what all has changed since then. (693 commits just to the gnome-shell Git module.)</p>
<p>To find all the nooks and crannys of the GNOME Shell user interface you can use the neat <a href="http://live.gnome.org/GnomeShell/CheatSheet">cheat sheet</a> that Marina created.  It&#8217;s a good way to learn about the secret commands supported by the Alt-F2 dialog without going to the source code, as well as to get an overview of the more user-oriented parts of the shell.</p>
<p>Considering only at the changes in the last few weeks, the biggest change recently has been to the Alt-Tab dialog; Jon McCann and Jeremy Perry (one of the designers here at Red Hat) came up with some ideas about how the Alt-Tab could better integrate with the way we group windows by application in the Activities Overview, and Dan Winship did a lot of work to make those ideas into something we could try out. Steve Frécinaux also jumped in more recently to help out with this. Jon&#8217;s going to describe the design ideas involved in more detail soon, so save your ideas for improvement for his post, but here&#8217;s a quick screenshot to whet your appetite:</p>
<p><a href="http://owtaylor.files.wordpress.com/2009/10/gnome-shell-new-alt-tab.png"><img src="http://owtaylor.files.wordpress.com/2009/10/alt-tab-thumbnail.png" alt="New GNOME Shell Alt-Tab Selector" title="New GNOME Shell Alt-Tab Selector" width="512" height="384" class="aligncenter size-full wp-image-247" /></a></p>
<p>The other big recent change isn&#8217;t so screenshot-able, but Colin and I took some interesting parts of the NBTK library from Moblin and imported it into GNOME Shell as ST (the Shell Toolkit). (We&#8217;re still cooperating closely with Moblin on the work; the rename is just to keep things non-confusing.) We get several nice things from this: scrolling, better layout capabilities, but the big change is the ability to use CSS for styling. NBTK already had a good start on this, and I then merged in some work I did last year for hippo-canvas to get extra capabilities like CSS styling of borders and fonts. This is really intended to make development easier &#8211; so we don&#8217;t have to have all sorts of hardcoded fonts, colors, and pixel sizes in the code, but also should provide a good entry point for artists to work on alternate appearances for the shell.</p>
<p>Oh, and I quickly used ST to hack up a drop-down calendar when you click on the clock. So you can finally find out what day of the month it is in GNOME Shell without having to run &#8216;cal&#8217; in a terminal.</p>
<p>We hope people will try it out, and see how it works for them in practice; packages will be in Fedora rawhide shortly and the JHBuild I mentioned above really is easy to get going on any recent Linux distribution if you aren&#8217;t running something quite so up-to-date. If you are in the Boston area, come to the <a href="http://live.gnome.org/Boston2009">GNOME Summit</a> this weekend. All the developers working at Red Hat on the shell will be there, and hopefully a few other shell developers as well. You can see the shell in action, talk to us, and just in case you are having trouble getting it compiling, we&#8217;ll help you with that too. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/owtaylor.wordpress.com/242/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/owtaylor.wordpress.com/242/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/owtaylor.wordpress.com/242/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/owtaylor.wordpress.com/242/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/owtaylor.wordpress.com/242/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/owtaylor.wordpress.com/242/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/owtaylor.wordpress.com/242/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/owtaylor.wordpress.com/242/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/owtaylor.wordpress.com/242/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/owtaylor.wordpress.com/242/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/owtaylor.wordpress.com/242/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/owtaylor.wordpress.com/242/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/owtaylor.wordpress.com/242/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/owtaylor.wordpress.com/242/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.fishsoup.net&amp;blog=1430594&amp;post=242&amp;subd=owtaylor&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.fishsoup.net/2009/10/07/gnome-shell-2-28-0-a-preview/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/a45426932356d75ac19f68c0c958f800?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Owen</media:title>
		</media:content>

		<media:content url="http://owtaylor.files.wordpress.com/2009/10/alt-tab-thumbnail.png" medium="image">
			<media:title type="html">New GNOME Shell Alt-Tab Selector</media:title>
		</media:content>
	</item>
	</channel>
</rss>
