<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Adam Frisby &#187; Mono</title>
	<atom:link href="http://www.adamfrisby.com/blog/tag/mono/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.adamfrisby.com/blog</link>
	<description>ZOMGWTFHAI</description>
	<lastBuildDate>Sat, 26 Dec 2009 07:02:09 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OSGrid Turns 2</title>
		<link>http://www.adamfrisby.com/blog/2009/07/osgrid-turns-2/</link>
		<comments>http://www.adamfrisby.com/blog/2009/07/osgrid-turns-2/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 07:17:18 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
				<category><![CDATA[OSGrid]]></category>
		<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[birthday]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[osgrid]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=368</guid>
		<description><![CDATA[Yesterday, OSGrid officially turned 2, at the opening presentation hosted by yours truly. OpenSim interrupted my presentation just once &#8211; at about 40 minutes into it with 53 avatars, Mono finally kicked the bucket. (It crashed again just after I had finished. Serendipity at work!)

We&#8217;ve been experimenting with Vivox, so the entire presentation was streamed [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday, OSGrid officially turned 2, at the opening presentation hosted by yours truly. OpenSim interrupted my presentation just once &#8211; at about 40 minutes into it with 53 avatars, Mono finally kicked the bucket. (It crashed again just after I had finished. Serendipity at work!)</p>
<p><img class="alignnone size-full wp-image-370" title="Opening Presentation" src="http://www.adamfrisby.com/blog/wp-content/uploads/osgrid_openingpres.png" alt="Opening Presentation" width="680" height="321" /></p>
<p>We&#8217;ve been experimenting with Vivox, so the entire presentation was streamed via the new VivoxVoiceModule; running on the latest trunk code for OpenSimulator; both for the most part performed pretty admirably. A lot of the improvements from IBM and Intel lately into OpenSim&#8217;s packeting have been paying dividends. Mono&#8217;s previous concurrency &#8220;record&#8221; was about 40 users (for comparison .NET&#8217;s current record is 65).</p>
<p>So, what&#8217;s in store in the future and near-future for OSGrid? I had a couple of announcements at the opening presentation.</p>
<h3>First &#8211; Hello General Store</h3>
<p><img class="alignnone size-full wp-image-371" title="The General Store" src="http://www.adamfrisby.com/blog/wp-content/uploads/osgrid_generalstore.png" alt="The General Store" width="680" height="302" /></p>
<p>The general store is the first &#8220;webshop&#8221; based on OpenSim that integrates directly into the grid itself. Listing of items, setting of permissions, etc are all done from within the viewer &#8211; directly integrated with your inventory itself.</p>
<p>This has one major advantage outside of the improved convenience &#8211; it means you do not need a region to mediate the transaction. Every transaction can be done directly on the inventory server (infact this is exactly what we do.); but what does this exactly mean?</p>
<p><img class="alignnone size-full wp-image-372" title="General Store" src="http://www.adamfrisby.com/blog/wp-content/uploads/osgrid_genstore2.png" alt="General Store" width="669" height="557" /></p>
<p>When you create your general store &#8211; a special undeletable folder is created in your inventory called &#8216;My General Store&#8217;, items placed into this folder that are marked &#8216;Allow anyone to copy&#8217; are listed on our website automatically, providing you are the creator of the item in question (and have copy/trans permissions on it).</p>
<p>Purchasing of items will have them sent to your inventory directly via the inventory server (although you will need to relog after a shopping trip for the items to appear.); saves a bit of time and effort doing the transfers &#8211; and you dont lose a transfer because you were in busy mode.</p>
<h3>User Achievements</h3>
<p>Many of you spotted our new achievements system located on the OSGrid website &#8211; it&#8217;s mostly a bit of fun right now (and probably will always be), but we are going to be opening achievements up to region operators across the grid. If you have something open to the pubic (some form of competition, game or other activity that is &#8216;achievement-worthy&#8217;) you can offer achievements as rewards.</p>
<p>The exact process is yet to be exactly finalised &#8211; but you will recieve a bit of LSL at the end you can include which allows you to award your achievements to specified users. There will be some caps on who is eligable to be able to award achievements (particularly so that people do not just set them up for friends)</p>
<p>&#8220;More information soon&#8221;</p>
<h3>Acknowledgement of Direction</h3>
<p>OSGrid has traditionally been a test grid for OpenSimulator &#8211; that has been good and bad &#8211; in our case however, we&#8217;ve definetely moved on from those roots &#8211; OSGrid today is now more of a social space than a testing one. As a group, the admin team has decided to acknowledge this as part of OSGrid&#8217;s long term direction &#8211; and include those aspects in our mission statement (while preserving our current roles too).</p>
<p>While the testing aspects will always be present, we&#8217;re going to be focusing on making the social aspects more useful; such as improving our events calendars and website integration features. We would definetely like to see more live events &#8211; and will help promote any regular events to our wider communities.</p>
<p>Some of these changes will be more profound, which is actually tied to&#8230;</p>
<h3>Continents</h3>
<p>We are going to be introducing two new continents into the OSGrid ecosystem; so there will be three major continents in total. For lack of a name so far, they will be &#8216;Terra Alphus&#8217;, &#8216;Terra Betus&#8217; and &#8216;Terra Gammus&#8217; (subject to change). The current continent centered around 10,000&#215;10,000 is &#8216;Betus&#8217;; and will not be changing.</p>
<p>Alphus will be the most structured of the continents &#8211; and subdivided into three zones based on the server geography &#8211; US, Europe and Asia. Regions connected to Alphus need to be approved by a small committee, and subject themselves to a few construction limits. Alphus will:</p>
<ul>
<li>Consist only of regions on dedicated server hosts (or good quality VPSs)</li>
<li>Have a reasonable uptime (that is they are significantly likely to be online)</li>
<li>Follow a master terraforming pattern.</li>
</ul>
<p>Regions in Alphus will be organised so that servers located in the US are grouped with other US servers; EU with EU and Asia with Asia &#8212; meaning border crossing between Alphus regions is a lot more likely to be successful. The goals with the Alphus area is to ensure a more consistent user experience [especially for new users] and can be thought of as a &#8216;grid within a grid&#8217; of sorts.</p>
<p>Betus is the current continent &#8211; it&#8217;s not going to be touched (other than perhaps by a few regions moving into Alphus); the current strategy of nearly-anything-goes is not changing here. You can place your own regions in this section without any considerations at all.</p>
<p>Gammus is the final section, and also a new continent &#8211; this will be tied to our new highly experimental region launcher. Regions hosted from home using our launcher will end up here. Because these regions are less likely to be online at any given moment, we are conglomerating them together away from other regions &#8211; so that the other regions on the grid are not affected by constant neighbour checks.</p>
<p>In summation:</p>
<ul>
<li>Your current regions arent changing or moving. If you want to setup a new region on any random coordinates, that&#8217;s fine too.</li>
<li>The new continents will be fairly close to each other in coordinate terms (within 500 coordinates; or within reasonable scroll distance)</li>
<li>The goals of the introduction of the two other continents are to improve user experience (especially with border crossing, etc.)</li>
<li>This is not a grading system; Alphus regions are not better than Gammus &#8211; only that Alphus voluntarily comply with a tighter set of user experience restrictions.</li>
</ul>
<h3>New Orientation Sims</h3>
<p>We&#8217;re going to be working on some new orientation island sims with OSGrid; particularly to aquaint people with what OSGrid is and isnt. These are going to be seperate from our welcome area (LBSA), but we are going to look at ways we can integrate them together (such as providing a chat bridge with a helpers group, etc.)</p>
<p>Again, more information coming soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2009/07/osgrid-turns-2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Microthreading .NET</title>
		<link>http://www.adamfrisby.com/blog/2008/11/microthreading-net/</link>
		<comments>http://www.adamfrisby.com/blog/2008/11/microthreading-net/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 06:40:29 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[lsl]]></category>
		<category><![CDATA[microthreading]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=85</guid>
		<description><![CDATA[An issue becoming increasingly apparent with the OpenSim platform is that user scripting is a hammer &#8211; it works fine if you only need a couple of them, but lots of them running in conjunction and the operating system begins to start running poorly. The common key to fixing this is to use something such [...]]]></description>
			<content:encoded><![CDATA[<p>An issue becoming increasingly apparent with the OpenSim platform is that user scripting is a hammer &#8211; it works fine if you only need a couple of them, but lots of them running in conjunction and the operating system begins to start running poorly. The common key to fixing this is to use something such as <a href="http://en.wikipedia.org/wiki/Fiber_(computer_science)">Fibres</a> &#8211; small lightweight threads that perform better in mass numbers to full blown Operating System threads.</p>
<p>The problem is &#8211; there&#8217;s no cross platform way to access Fibres, and we have the additional problem that scripts under OpenSim should be transportable from one server to another &#8211; meaning the ability to pack up an execution context, move it to another machine, then resume is a feature we want to support.</p>
<p>Linden Lab&#8217;s <a href="http://jimpurbrick.com/">Jim Purbrick</a> <a href="http://blog.secondlife.com/2006/05/05/microthreading-mono/">wrote in 2006</a> about their work to use a <span style="text-decoration: line-through;">modified version of Mono</span> to achieve this &#8211; unfortunately with OpenSim we do not have the luxury of using modified runtimes, nor do we plan on dropping support for the official .NET runtime either. This means solutions such as <a href="http://www.bat.org/~tomba/monoco.html">Mono Continuations</a> dont work for us very well.</p>
<p>(<em>Update 26/11/08: I had a chat with Jim after showing him this article &#8211; apparently Linden is doing something fairly similar to this proposal already, without the aid of a modified runtime.</em>)</p>
<p>The solution, is ideally something we can run on both .NET and Mono, runs reasonably quickly (but obviously some overhead is acceptable) &#8211; it needs the ability to save and restore the current execution state, and it needs the ability to suspend and resume. Suspension and resumation should be fairly fast to allow it to be used in a microthreading context.</p>
<p>These requirements unfortunately knock out a very large number of options &#8211; the options we considered ranged from using IEnumerator and &#8216;yield&#8217; to handle threading (no save/restore or return values), to using reflection to emulate an instruction pointer and stack (too slow and complex).</p>
<p>The idea I am currently developing manages to avoid most of these problems, but requires a degree of runtime code mangling &#8211; the result however is something that is generally applicable to generic .NET applications that desire save/resume functionality (or microthreading).</p>
<p>The result centers around Mono.Cecil &#8211; the runtime analysis library written by one of the Mono developers. It has a very nifty feature however in that it is capable of changing a CIL stream, then writing back out the resulting assembly &#8211; meaning we can at the CIL level, begin to manipulate the results and hook in accessory functions to handle our save/restore worries.</p>
<h3>Shadowing Variables</h3>
<p>The first thing we need to consider trying to save the state of an in-execution script is that unlike Java, C# doesnt have a <strong>MethodInfo.LocalVariables.Get()</strong> method &#8211; to the C# programmer, the current Method&#8217;s stack is completely inaccessible. It <em>does however</em>, have the ability to list the local variables within this method.</p>
<p>And that&#8217;s where we enter the shadow variables &#8211; the goal of the shadow variables, is to dynamically build a Struct that contains a corresponding entry for each local variable within the method, at runtime we use Cecil to swap references to the local variables, to references to the Shadow equivilent &#8211; then saving and restoring becomes as simple as serialising and deserialising the shadow container.</p>
<p>Internally, the shadow container should be created before the method call is begun and passed in as an argument &#8211; for something that isnt resuming, it would simply be containing null values.</p>
<h3>Resuming Execution</h3>
<p>The next consideration is the ability to save and resume from an execution point within the code &#8211; this is handled through gratuitous use of the CIL equivilent of a &#8216;GOTO Label&#8217;. After each statement, we place a new label &#8211; and at the beggining of the method call, we also add a new argument (&#8221;InstructionPointerStartPoint&#8221;) and a switch statement that will &#8216;goto&#8217; the appropriate label.</p>
<p>Since we&#8217;re passing the shadow container in via the arguments &#8211; we do not need to do anything special in terms of copying data back, as all the code references the shadow container directly &#8216;as is&#8217;. This basically emulates the instruction pointer within a standard x86 processor.</p>
<h3>Handling Return Values and the Stack</h3>
<p>The final consideration we need to make is recursive calls. Suspendable user methods are allowed to call other suspendable user methods &#8211; so we need to implement our own call stack manager to make sure we can save the context of a previous call leading to the current one. (Otherwise resumption would effectively fail).</p>
<p>The solution to this is thankfully fairly simple &#8211; we create a new &#8216;StackItem&#8217; class which contains: A reference to the virtual instruction pointer (where we are currently in the execution), a reference to the function call for this method, and a reference to the current shadow container, as well as an optional reference to a decendant stack item for nested calls.</p>
<p>Before proceeding into a nested call, we need to create a new stackitem for it, and launch it within that execution context, but otherwise it falls together fairly simply.</p>
<p>By folding the stackitems together from the initial execution context, we&#8217;re able to then package up a copy of the running execution at any single point in time, transport it, then bring it back later. The whole thing ends up looking something like this.</p>
<p><img src="http://www.gwala.net/opensim_microthread.png" alt="How it all looks" width="475" height="375" /></p>
<h3>Optimising</h3>
<p>Under this situation, we do have some fairly expensive penalties when it comes to calling into a recursive function, but at the same point there are a number of relatively easy fixes. Functions for example can be inlined &#8211; only a very tiny number of functions (such as self-recursive functions) need to be handled fully. The vast majority can be inlined, thereby reducing the need to setup nested function calls in a large number of cases.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/11/microthreading-net/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>OpenSim, C#, Standards, Patents and you.</title>
		<link>http://www.adamfrisby.com/blog/2008/08/opensim-c-standards-patents-and-you/</link>
		<comments>http://www.adamfrisby.com/blog/2008/08/opensim-c-standards-patents-and-you/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 21:47:16 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[ecma]]></category>
		<category><![CDATA[iso]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[patents]]></category>
		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://www.adamfrisby.com/blog/?p=57</guid>
		<description><![CDATA[This one comes up a lot - I hear it in quite a few places &#8220;Well, shame it&#8217;s in C#.&#8221;, it&#8217;s usually followed by some nebulous statement about Microsoft, followed by patent threats, embrace extend extinguish, etc etc.
So let&#8217;s start with the basics -

C# is a ECMA and ISO standardized language. It went through the [...]]]></description>
			<content:encoded><![CDATA[<p>This one comes up a <strong>lot </strong>- I hear it in quite a few places &#8220;Well, shame it&#8217;s in C#.&#8221;, it&#8217;s usually followed by some nebulous statement about Microsoft, followed by patent threats, embrace extend extinguish, etc etc.</p>
<p>So let&#8217;s start with the basics -</p>
<ul>
<li><strong>C# is a ECMA and ISO standardized language.</strong> It went through the review procedures of ECMA and ISO in a standard fashion (<em>unlike OOXML</em>). <a href="http://www.ecma-international.org/publications/files/ecma-st/ECMA-334.pdf">Download the ECMA Spec here</a> and <a href="http://standards.iso.org/ittf/PubliclyAvailableStandards/c042926_ISO_IEC_23270_2006(E).zip">the ISO Spec here</a>.</li>
<li><strong>Yes, the base library is included in that standardization.</strong> The primary exceptions are, ADO.NET, ASP.NET, Web Services and Win Forms. Many of these exceptions are however separately covered via <a href="http://www.microsoft.com/interop/osp/default.mspx">Microsoft&#8217;s Open Standards Patent program</a>, although we&#8217;ve moved to avoiding them entirely in the standard release. (Extensions which use them are however available on the <a href="http://forge.opensimulator.org">third-party utilities forge</a>)</li>
<li><strong>The ECMA standard also includes the CIL byte code format.</strong></li>
<li>If Microsoft decide to add new extensions onto .NET (which they have done with every major release), the OpenSim developers are content to wait until those extensions are available under Mono (which moves fast enough that it isn&#8217;t a major problem).</li>
<li><strong>Microsoft is not known for breaking backwards compatibility to &#8220;extinguish&#8221; things</strong> &#8211; the mere fact you can still run Win3.1 applications on Windows Vista should give some assurances there. Microsoft is yet to make any kind of retroactive change to the .NET standard &#8211; all .NET 1.1 applications should still run under .NET 3.5 without changes. (and the cost to them of making a change like that would be significant in terms of people using applications under Windows)</li>
<li><strong>There are two completely F/OSS implementations of C#/.NET and the standard library.</strong> <a href="http://www.mono-project.com">Mono</a> (<a href="http://www.mono-project.com/FAQ:_Licensing#Could_patents_be_used_to_completely_disable_Mono.3F">Licensing Concerns Addressed Here</a>) and the FSF&#8217;s <a href="http://www.gnu.org/software/dotgnu/pnet.html">DotGNU PNET</a>. OpenSim is regularly tested for compatibility under Mono (in fact our automated testing environment uses it). DotGNU is significantly less popular and has not been properly tested with due to not being feature complete yet. There is also a third source-availible implementation from Microsoft called Rotor, however it is not under a OSI-approved license.</li>
<li>Microsoft maintains a reasonably healthy relationship with the Mono developers and has been known to collaborate in the past (such as for the development of the specialised Moonlight runtime).</li>
</ul>
<p>The next question usually is &#8220;Well, why not write it in Java then?&#8221; the answer is multi pronged and highly likely to generate a flame war on the subject &#8211; the biggest reason is that coding the same thing in Java would probably take significantly longer to do.</p>
<p>Java is a beast of a language that has had layers of gunk added in every revision resulting in a hodge-podge of inconsistently named items in the standard library that may, or may not address what you want. The second major reason is that the C# standard library is both larger and more functional &#8211; the amount of time and effort the Base Class Library has saved is astonishing. Wikipedia has a <a href="http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java">nice article detailing the differences between the two languages</a>.</p>
<p>However, since both Java and C# share a <em>very similar</em> byte code language &#8211; it is possible to do a machine driven cross-compilation so you could run <a href="http://mainsoft.com/products/vmw_j2ee.aspx">OpenSim under the JVM runtime</a> if you so wish. Source translation between the languages is also reasonably possible however requires a degree of manual work.</p>
<p>Some concluding facts which may actually surprise some people</p>
<ul>
<li>One of the largest contributors and users of the project is IBM. One of the first groups inside of IBM to get involved was IBM&#8217;s Linux Technology Center. All[?] of the IBM developers are using Linux, Emacs and Mono to develop and test.</li>
<li>Approximately half the developers working on OpenSim are running under Linux/BSD. As a user base, Linux users represent approximately 80-90% of the casual testers and operators. (Windows is however much better represented in people running commercial operations)</li>
<li>Our compatibility targets are Mono 1.2.5 (latest is 1.9) and .NET 2.0 &#8211; we dont use features which supercede these (although we may raise that to Mono 2.0 once it is out of beta).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/08/opensim-c-standards-patents-and-you/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Running OpenSim under a 64-bit Environment</title>
		<link>http://www.adamfrisby.com/blog/2008/08/running-opensim-under-a-64-bit-environment/</link>
		<comments>http://www.adamfrisby.com/blog/2008/08/running-opensim-under-a-64-bit-environment/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 19:30:06 +0000</pubDate>
		<dc:creator>Adam Frisby</dc:creator>
				<category><![CDATA[OpenSim]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[64-bit]]></category>
		<category><![CDATA[Mono]]></category>

		<guid isPermaLink="false">http://gwala.net/blog/?p=39</guid>
		<description><![CDATA[Every now and then, this hits me. I fire up OpenSim (or RealXtend), and it crashes instantly with a &#8220;BadImageFormatException&#8221; &#8211; when you see this, you know you have a compatibility problem with an embedded C/C++ binary. In english, 90% of the time this means you are running under a 64-bit environment with a mix [...]]]></description>
			<content:encoded><![CDATA[<p>Every now and then, this hits me. I fire up OpenSim (or RealXtend), and it crashes instantly with a &#8220;BadImageFormatException&#8221; &#8211; when you see this, you know you have a compatibility problem with an embedded C/C++ binary. In english, 90% of the time this means you are running under a 64-bit environment with a mix of 64 and 32bit code trying to run together.</p>
<h3>OpenSim is 64-bit aware</h3>
<p>The reason for this happening is that OpenSim by virtue of the .NET platform is quite 64-bit aware, this means natively it can address 16TB of memory just fine if run on a 64-bit operating system. (nb, under Mono you need to make sure Mono is 64bit to get the same benefits).</p>
<p>However unfortunately, some of the libraries we link against have to be compiled &#8216;one way&#8217; or the &#8216;other way&#8217; and not both.  When running a 64-bit application, things such as memory pointer lengths are difference, so there is no way to cleanly pass data between a 32-bit and 64bit application &#8211; everything must be one or the other.</p>
<h3>So how do you fix this?</h3>
<p>There&#8217;s two routes, the easy route, and the proper route. The easy route is good for 90% of our users &#8211; if you dont need to access more than 4GB of memory and dont mind about the slight slowdown when handling double precision numbers, then just run 32-bit.</p>
<p>How? Instead of launching OpenSim.exe launch OpenSim.32BitLaunch.exe instead &#8211; this forces OpenSim to run under a 32bit environment (under windows provided by WoW32).</p>
<h3>The more detailed fix</h3>
<p>The next option is to strip out the sections that are causing problems. OpenSim is modular &#8211; so you can swap bits and pieces with their alternatives. The following are components that are not 64-bit compatible by default (however it is possible to fix this, something I will get to in a moment.)</p>
<h4>Incompatible Components List</h4>
<p><strong>Physics</strong> &#8211; most problems come from our Physics Engines, since these tend to be written in high performance C/C++ with ASM littered. The following list of physics engines by default are NOT 64-bit compatible.</p>
<ul>
<li><strong>OpenDynamicsEngine</strong> &#8211; The ODE DLL we provide is compiled for a 32bit operating system, however you can fetch the sources for our custom ODE DLL from <strong>(SVN)</strong> <span class="external free"><a href="http://opensimulator.org/svn/opensim-libs/">http://opensimulator.org/svn/opensim-libs/</a> and build it yourself on your native environment.</span></li>
<li><span class="external free"><strong>AGEIA PhysX</strong> &#8211; The AGEIA PhysX support (now Nvidia PhysX) relies on a natively compiled 32-bit DLL. <em>At present there is no fix here.</em></span></li>
</ul>
<p>Compatible Engines</p>
<ul>
<li><strong>BasicPhysics </strong>- This is purely managed but very simple in operation. Collisions are provided only between the avatar and the ground here. This runs without problems regardless of environment</li>
<li><strong>POSPhysics </strong>- POS physics is a more complicated BasicPhysics engine with bounding box collisions between objects. For some tasks this is sufficient.</li>
<li><strong>BulletX</strong> &#8211; Our own custom BulletX library is derived from the BulletXNA project, this is a properly developed fully managed physics engine that does proper collisions (however the friction coefficient can be a little low for some users).</li>
</ul>
<p><strong>Storage Engines</strong> &#8211; At least one of our storage engines relies on some hard coded components, it&#8217;s listed below</p>
<ul>
<li><strong>SQLite</strong> &#8211; Whaaa? SQLite is broken on 64-bit environments? Afraid it&#8217;s true. Unfortunately on Windows systems the only solution is to recompile the entire of Mono (including Mono.SQLite.dll) yourself under a 64-bit flag.</li>
</ul>
<p>Compatible Engines</p>
<ul>
<li><strong>MySQL </strong>- The DotNetConnector provided by MySQL is 100% compatible and probably the recommended adapter for production installs.</li>
<li><strong>MSSQL</strong> &#8211; Windows-only however MSSQL is also free and the adapter is built into .NET itself so is pretty much guarunteed compatible.</li>
</ul>
<h4>Other incompatible components</h4>
<p>Perenially we have problems with the following components in addition to the above, this includes libsecondlife&#8217;s OpenJPEG version &#8211; this can be fixed by compiling libsecondlife and OpenJpeg (using make) on the target system. This may have been fixed recently however as complaints about this DLL have lessened sharply.</p>
<h3>Running</h3>
<p>Once you have swapped incompatible components out, or recompiled them appropriately, OpenSim should run under a 64-bit environment natively on Windows. As mentioned above, under Linux/Mono you will need to make sure that Mono has been compiled as a 64bit application for this to take effect.</p>
<p>The differences between the two are mostly marginal, however there are some definitve improvements in certain mathematical loops and stability when using large amounts of memory. In production environments, running 64-bit mode can be an attractive option, however will require constant maintainence to compile the above libraries as new releases occur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.adamfrisby.com/blog/2008/08/running-opensim-under-a-64-bit-environment/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
