<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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/"
		>
<channel>
	<title>Comments on: Fast File Loading / part II &#8211; Load-In-Place</title>
	<atom:link href="http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/feed/" rel="self" type="application/rss+xml" />
	<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/</link>
	<description>Code, 3D, Games, Linux and much more...</description>
	<lastBuildDate>Mon, 09 Nov 2009 03:12:38 +0100</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: Bruno Champoux</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-96007</link>
		<dc:creator>Bruno Champoux</dc:creator>
		<pubDate>Wed, 12 Mar 2008 12:41:31 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-96007</guid>
		<description>I did some television interview about the whole subject here it is:

http://www.youtube.com/watch?v=MPQDEKMHk5s</description>
		<content:encoded><![CDATA[<p>I did some television interview about the whole subject here it is:</p>
<p><a href="http://www.youtube.com/watch?v=MPQDEKMHk5s" rel="nofollow">http://www.youtube.com/watch?v=MPQDEKMHk5s</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ent</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-52092</link>
		<dc:creator>ent</dc:creator>
		<pubDate>Tue, 16 Oct 2007 00:29:21 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-52092</guid>
		<description>I am in the process of creating a new Load/Save System. Having worked with both Serialization Systems and InPlace Systems I think that my next implementation is going to be a Serialization System.

InPlace is 100% efficient, but it is very hard to maintain across platforms and between runtime &amp; editors. You have to save all the class (although in lot of scenarios you could save only a small percentage). Compression probably will eliminate all that redundant information, but anyway it doesn&#039;t seem the right way.

My current approach is a Serialization System, where you Serialize the member that you want and where a schema file is generate for debug versions of the data. The final version doesn&#039;t use schemas, is a raw of the data in the same order they are read and where a lot of optimizations can be applied, for example a std::vector of POD can be read with a single fread operation. I have to test it, but I am almost sure I will reach almost the same speed that the inplace with this approach.</description>
		<content:encoded><![CDATA[<p>I am in the process of creating a new Load/Save System. Having worked with both Serialization Systems and InPlace Systems I think that my next implementation is going to be a Serialization System.</p>
<p>InPlace is 100% efficient, but it is very hard to maintain across platforms and between runtime &#038; editors. You have to save all the class (although in lot of scenarios you could save only a small percentage). Compression probably will eliminate all that redundant information, but anyway it doesn&#8217;t seem the right way.</p>
<p>My current approach is a Serialization System, where you Serialize the member that you want and where a schema file is generate for debug versions of the data. The final version doesn&#8217;t use schemas, is a raw of the data in the same order they are read and where a lot of optimizations can be applied, for example a std::vector of POD can be read with a single fread operation. I have to test it, but I am almost sure I will reach almost the same speed that the inplace with this approach.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nicolas Fleury</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16736</link>
		<dc:creator>Nicolas Fleury</dc:creator>
		<pubDate>Sat, 12 May 2007 02:08:36 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16736</guid>
		<description>Hi Tom, nice to see you here.
I tend to agree with you on many points, but I&#039;m not as convinced that load-in-place data IO overhead is that bigger than with valuable-members-only data; useless members being good compression targets.  Like Bruno said, procedural techniques and LIP are orthogonal, even if load-in-place nature could favor a tendency to load final classes.  I would expect that streaming simplification tend to produce a speed gain.

Actually, my main concern sounds like the opposite; raw data is typically taking more space than complex C++ objects, so load-in-place performance effect, positive or negative, might be negligible (compared with loading-in-place only parts of objects).  I would then prefer the most productive approach in day-to-day programming.

I believe in IDL solutions like Bruno mentionned; it can generates a lot of useful code for both tools and engine.  But I still doubt full load-in-place as a single solution.  The IDL can actually be used to do the exact opposite: control how to serialize a class.  Programmers can then end up with more flexibility in their code by dealing only with IDL for serialized members, whatever how.  Combined with some form of C++ reflection (can be generated, can be meta-prog, can be both combined), it&#039;s possible to save any object in C++ engine in tool-mode.  In a sense, C++ reflection, IDL and load-in-place are all orthogonal.

I now work in an environment with mixed solutions like you describe, and I tend to prefer it.  It&#039;s probably why data management is not a popular topic as you said; we just can&#039;t agree on one ideal solution;)

Cheers,
Nic</description>
		<content:encoded><![CDATA[<p>Hi Tom, nice to see you here.<br />
I tend to agree with you on many points, but I&#8217;m not as convinced that load-in-place data IO overhead is that bigger than with valuable-members-only data; useless members being good compression targets.  Like Bruno said, procedural techniques and LIP are orthogonal, even if load-in-place nature could favor a tendency to load final classes.  I would expect that streaming simplification tend to produce a speed gain.</p>
<p>Actually, my main concern sounds like the opposite; raw data is typically taking more space than complex C++ objects, so load-in-place performance effect, positive or negative, might be negligible (compared with loading-in-place only parts of objects).  I would then prefer the most productive approach in day-to-day programming.</p>
<p>I believe in IDL solutions like Bruno mentionned; it can generates a lot of useful code for both tools and engine.  But I still doubt full load-in-place as a single solution.  The IDL can actually be used to do the exact opposite: control how to serialize a class.  Programmers can then end up with more flexibility in their code by dealing only with IDL for serialized members, whatever how.  Combined with some form of C++ reflection (can be generated, can be meta-prog, can be both combined), it&#8217;s possible to save any object in C++ engine in tool-mode.  In a sense, C++ reflection, IDL and load-in-place are all orthogonal.</p>
<p>I now work in an environment with mixed solutions like you describe, and I tend to prefer it.  It&#8217;s probably why data management is not a popular topic as you said; we just can&#8217;t agree on one ideal solution;)</p>
<p>Cheers,<br />
Nic</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bruno Champoux</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16609</link>
		<dc:creator>Bruno Champoux</dc:creator>
		<pubDate>Fri, 11 May 2007 13:54:22 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16609</guid>
		<description>In our case the I/O overhead is quite low, in fact we get effective transfer rates of about 6 to 10 MB/s on the Xbox 360 (probably more if we had the patience to write data to the edge of the disc every time), which is not bad (we don&#039;t do PC games, so no HDD for us).

We load compressed packages of fairly optimized data structures, and in the future we&#039;ll try to use as much procedural data as possible. You are right, it is good to balance CPU time with loading time. Compression is crucial, in any form, procedural techniques or generic LZ, and that will make good use of all those processors we now have. Something we&#039;ll need to improve in time, but (I think) orthogonal to LIP.

I think the I/O problems many people have are due to seek times, and the parsing-less nature of load-in-place is still desirable.</description>
		<content:encoded><![CDATA[<p>In our case the I/O overhead is quite low, in fact we get effective transfer rates of about 6 to 10 MB/s on the Xbox 360 (probably more if we had the patience to write data to the edge of the disc every time), which is not bad (we don&#8217;t do PC games, so no HDD for us).</p>
<p>We load compressed packages of fairly optimized data structures, and in the future we&#8217;ll try to use as much procedural data as possible. You are right, it is good to balance CPU time with loading time. Compression is crucial, in any form, procedural techniques or generic LZ, and that will make good use of all those processors we now have. Something we&#8217;ll need to improve in time, but (I think) orthogonal to LIP.</p>
<p>I think the I/O problems many people have are due to seek times, and the parsing-less nature of load-in-place is still desirable.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Tom Plunket</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16502</link>
		<dc:creator>Tom Plunket</dc:creator>
		<pubDate>Thu, 10 May 2007 23:44:09 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16502</guid>
		<description>Bruno, Nicolas, interesting to see you here.

Yeah, this article bears more than a passing resemblance to the talk you guys did at GDC.

I&#039;ve come to regard load-in-place as somewhat of a lost cause lately, though, since we&#039;re loading so much data this round, that it&#039;s probably not as effective as it could be.  Of course, it all depends on your requirements, but as the author points out, this method has a huge IO overhead and virtually zero CPU overhead.  When the player is staring at the loading screen, I think we should do whatever we can to reduce the IO load even if it costs us 100% of our CPU.  As such, loading less data (e.g. &quot;prototype data&quot;) and constructing the objects from that may be more effective going forward.

For &quot;large streaming worlds&quot; (which we started doing on a PS1 game I was working on in 1996), you should do everything you can to have zero CPU overhead, so then I&#039;d say you should try to load data that functionality consumes rather than full-blown objects.  The requirement to call placement new on every object is overhead that&#039;s just wasted in my opinion.  Load PODs off of disc, and do as much or as little processing as you need to get that data into your game system.

I think that data management is a serious topic for modern games, and sadly one that goes undiscussed during a game&#039;s development, but the solutions are going to vary by the problems, and I would not be surprised if the &quot;best&quot; solutions for a game were as varied as the scenarios that need to load data.  For my current game, for instance, some data gets cooked right into the executable, some gets loaded out of bare files, some gets loaded out of WADs.  Some of the loaded data is further processed after load, and some isn&#039;t.  I don&#039;t believe that a &quot;one size fits all&quot; solution is generally appropriate.

Load-in-place definitely has its place, though, so my hats off to all of you guys for doing the presentations and articles.</description>
		<content:encoded><![CDATA[<p>Bruno, Nicolas, interesting to see you here.</p>
<p>Yeah, this article bears more than a passing resemblance to the talk you guys did at GDC.</p>
<p>I&#8217;ve come to regard load-in-place as somewhat of a lost cause lately, though, since we&#8217;re loading so much data this round, that it&#8217;s probably not as effective as it could be.  Of course, it all depends on your requirements, but as the author points out, this method has a huge IO overhead and virtually zero CPU overhead.  When the player is staring at the loading screen, I think we should do whatever we can to reduce the IO load even if it costs us 100% of our CPU.  As such, loading less data (e.g. &#8220;prototype data&#8221;) and constructing the objects from that may be more effective going forward.</p>
<p>For &#8220;large streaming worlds&#8221; (which we started doing on a PS1 game I was working on in 1996), you should do everything you can to have zero CPU overhead, so then I&#8217;d say you should try to load data that functionality consumes rather than full-blown objects.  The requirement to call placement new on every object is overhead that&#8217;s just wasted in my opinion.  Load PODs off of disc, and do as much or as little processing as you need to get that data into your game system.</p>
<p>I think that data management is a serious topic for modern games, and sadly one that goes undiscussed during a game&#8217;s development, but the solutions are going to vary by the problems, and I would not be surprised if the &#8220;best&#8221; solutions for a game were as varied as the scenarios that need to load data.  For my current game, for instance, some data gets cooked right into the executable, some gets loaded out of bare files, some gets loaded out of WADs.  Some of the loaded data is further processed after load, and some isn&#8217;t.  I don&#8217;t believe that a &#8220;one size fits all&#8221; solution is generally appropriate.</p>
<p>Load-in-place definitely has its place, though, so my hats off to all of you guys for doing the presentations and articles.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Bruno Champoux</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16454</link>
		<dc:creator>Bruno Champoux</dc:creator>
		<pubDate>Thu, 10 May 2007 19:54:53 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16454</guid>
		<description>We are in the process of getting rid of the entire C++ introspection part of the system and replacing it with an IDL-based data description. It makes writing live tools and production code very simple, and yet keeps the LIP packaging/loading advantages. It also prevent the need for compiling the data classes twice (once for engine-side, once for exporter-side), since the IDL parser automatically generates the C# exporter.

Simple data representation, fast loading, runtime memory defragmentation, we&#039;re happy.</description>
		<content:encoded><![CDATA[<p>We are in the process of getting rid of the entire C++ introspection part of the system and replacing it with an IDL-based data description. It makes writing live tools and production code very simple, and yet keeps the LIP packaging/loading advantages. It also prevent the need for compiling the data classes twice (once for engine-side, once for exporter-side), since the IDL parser automatically generates the C# exporter.</p>
<p>Simple data representation, fast loading, runtime memory defragmentation, we&#8217;re happy.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Nicolas Fleury</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16361</link>
		<dc:creator>Nicolas Fleury</dc:creator>
		<pubDate>Thu, 10 May 2007 05:40:43 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16361</guid>
		<description>Great article, I&#039;m happy to see someone has made a public implementation of a load-in-place system (it would be nice to have such a system in Boost).  I&#039;m the co-author of the system Bruno is mentioning and that we both presented at GDC, and, even if I like very much the system, I must say I have mixed feelings with load-in-place.  No doubt it is the fastest way to load data (and implementing it was technically very interesting), but it affects loaded classes.  Some of my ex-collegues are still talking to me about the system relative burden, so I&#039;m still not convinced the speed gain is worth the effect in Production code.  Maybe it&#039;s better only for stable and complex data like animations, but not for frequently modified small structures like game objects.  I really don&#039;t know.

The system also needs to have a complementary xml-binary-like format that is backward-compatible.  The tool-mode engine needs to be able to save both this format and the load-in-place format.  Keep up the good work, it would be nice if at some point we stop reinventing the wheel and share such code.

Regards,
Nicolas</description>
		<content:encoded><![CDATA[<p>Great article, I&#8217;m happy to see someone has made a public implementation of a load-in-place system (it would be nice to have such a system in Boost).  I&#8217;m the co-author of the system Bruno is mentioning and that we both presented at GDC, and, even if I like very much the system, I must say I have mixed feelings with load-in-place.  No doubt it is the fastest way to load data (and implementing it was technically very interesting), but it affects loaded classes.  Some of my ex-collegues are still talking to me about the system relative burden, so I&#8217;m still not convinced the speed gain is worth the effect in Production code.  Maybe it&#8217;s better only for stable and complex data like animations, but not for frequently modified small structures like game objects.  I really don&#8217;t know.</p>
<p>The system also needs to have a complementary xml-binary-like format that is backward-compatible.  The tool-mode engine needs to be able to save both this format and the load-in-place format.  Keep up the good work, it would be nice if at some point we stop reinventing the wheel and share such code.</p>
<p>Regards,<br />
Nicolas</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ent</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16267</link>
		<dc:creator>ent</dc:creator>
		<pubDate>Wed, 09 May 2007 20:13:41 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16267</guid>
		<description>Bruno,

The point of this article was to release a simple implementation of Load-In-Place that anybody could download and start playing with it. I spent more than a month working in the source code (after trying several implementation) starting from scratch. So please, don&#039;t say this is a ripof of anything.

When you publish something like you did, I think you expect others to continue or take some of your ideas to avoid reinventing the wheel. Your article gave me a lot of nice information to solve this problem and due to that I am including a link to your Presentation. So everybody reading my article can read yours. I think this is honest but if you think you deserve more credit for that, we can definitely talk about that.

About the references to your article and others in Gamasutra: it has been an unintentional error that is going to be fixed. I already sent the information to the Gamasutra staff. Sorry for that.</description>
		<content:encoded><![CDATA[<p>Bruno,</p>
<p>The point of this article was to release a simple implementation of Load-In-Place that anybody could download and start playing with it. I spent more than a month working in the source code (after trying several implementation) starting from scratch. So please, don&#8217;t say this is a ripof of anything.</p>
<p>When you publish something like you did, I think you expect others to continue or take some of your ideas to avoid reinventing the wheel. Your article gave me a lot of nice information to solve this problem and due to that I am including a link to your Presentation. So everybody reading my article can read yours. I think this is honest but if you think you deserve more credit for that, we can definitely talk about that.</p>
<p>About the references to your article and others in Gamasutra: it has been an unintentional error that is going to be fixed. I already sent the information to the Gamasutra staff. Sorry for that.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ent</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16266</link>
		<dc:creator>ent</dc:creator>
		<pubDate>Wed, 09 May 2007 20:06:14 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16266</guid>
		<description>Rush, 

I started with a simple implementation with only simple structs (no polymorphism, no pointers, etc) but it was not too useful. We indeed already had lot of data that was represented using C++ object. So we would have had to do conversions from simple structs in disk to complex C++ objects.

I am using this to implement continuous streaming of data. At the end, you cannot stream continuosly at the byte level. You pack your data in packages and your unit of streaming is the package. That package is loaded in place.

I am going to write an article about this.</description>
		<content:encoded><![CDATA[<p>Rush, </p>
<p>I started with a simple implementation with only simple structs (no polymorphism, no pointers, etc) but it was not too useful. We indeed already had lot of data that was represented using C++ object. So we would have had to do conversions from simple structs in disk to complex C++ objects.</p>
<p>I am using this to implement continuous streaming of data. At the end, you cannot stream continuosly at the byte level. You pack your data in packages and your unit of streaming is the package. That package is loaded in place.</p>
<p>I am going to write an article about this.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: ent</title>
		<link>http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/comment-page-1/#comment-16265</link>
		<dc:creator>ent</dc:creator>
		<pubDate>Wed, 09 May 2007 19:58:56 +0000</pubDate>
		<guid isPermaLink="false">http://entland.homelinux.com/blog/2007/02/21/fast-file-loading-ii-load-in-place/#comment-16265</guid>
		<description>Jason,

When you say &quot;the tools use one that rebuilds a nicer class structure that has STL containers embedded in them&quot;. How is that class generated? Dynamically or it is statically defined by the author or the class?

I started to implement a version of this that encapsulate vector, list and other containers with the same interface that the stl equivalents but your idea seems interesting.</description>
		<content:encoded><![CDATA[<p>Jason,</p>
<p>When you say &#8220;the tools use one that rebuilds a nicer class structure that has STL containers embedded in them&#8221;. How is that class generated? Dynamically or it is statically defined by the author or the class?</p>
<p>I started to implement a version of this that encapsulate vector, list and other containers with the same interface that the stl equivalents but your idea seems interesting.</p>
]]></content:encoded>
	</item>
</channel>
</rss>
