<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://opensimulator.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Allquixotic</id>
		<title>OpenSimulator - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://opensimulator.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Allquixotic"/>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Special:Contributions/Allquixotic"/>
		<updated>2026-04-04T16:11:49Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.19.9</generator>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T20:25:28Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{proposal}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Proposal Name&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Date Proposed&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Status&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Proposer&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Core Dev Sponsor(s)&lt;br /&gt;
|None yet.&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Commercial?&lt;br /&gt;
|No.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Baseline: Yay, we have physics! ...somewhat.'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Not currently possible for most individuals and small businesses'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Possible in the future with GPU acceleration'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Questions ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Ideas ==&lt;br /&gt;
&lt;br /&gt;
=== Advantages and Challenges ===&lt;br /&gt;
&lt;br /&gt;
'''Advantages:'''&lt;br /&gt;
* Improved performance.&lt;br /&gt;
* Reduced CPU usage.&lt;br /&gt;
* Ability to use more physical objects with the same performance goals.&lt;br /&gt;
* Unlock a new level of complexity and dynamicity in OpenSimulator (although other components, such as users' graphics cards, may take time to catch up).&lt;br /&gt;
&lt;br /&gt;
'''Challenges:'''&lt;br /&gt;
* A lot of existing hardware hosting OpenSimulator does not have any GPU at all.&lt;br /&gt;
* Acquiring a dedicated GPU for a server that does not have one can be very expensive, especially if you have to custom request one from your hosting provider.&lt;br /&gt;
* Support for open source Linux graphics drivers running OpenCL is still in a very early stage (as of September 2013).&lt;br /&gt;
&lt;br /&gt;
=== Implementation Ideas ===&lt;br /&gt;
&lt;br /&gt;
# We should have a config file option in OpenSim.ini under a BulletSim heading for whether or not to enable OpenCL. Trying to be smart and autodetect might lead to problems, such as a user with an unstable graphics driver accidentally crashing their system (and then if OpenSim starts on boot, that's REALLY bad because their system crashes during the boot procedure!). We absolutely must have a way for the user to enable or disable OpenCL support, and leave it '''disabled''' by default out of the box.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should not throw away our existing code that uses the CPU paths of Bullet. The Bullet non-OpenCL paths are probably faster running on the CPU than a CPU implementation of OpenCL running the OpenCL paths of Bullet, simply because a layer of complexity is removed.&amp;lt;br /&amp;gt;&lt;br /&gt;
# If Bullet doesn't already do this, we should refuse to run OpenCL on the CPU except for testing and debugging purposes (maybe a compile flag).&lt;br /&gt;
# We should look at Bullet developer and user blogs, wikis, code comments, etc. and attempt to figure out what parts of the GPU rendering pipeline provide the greatest performance improvement vs. CPU, and run the best on GPUs, and exploit that to the best of our ability, while avoiding or minimizing the use of features that the GPU does not handle as well.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should investigate the possibility of continuing to use the CPU for physics, especially if there are certain interactions or edge cases that are horribly slow on a GPU, or not implemented in the GPU pipeline on Bullet. Better yet, we could develop some sort of physics scheduler, that first attempts to max out the GPU, and if there are still physics calculations that need to be done, push the remainder of them onto the CPU until the CPU is also saturated. On high-end servers, the CPUs do indeed allow for a non-trivial amount of physics to be done, so we needn't leave it all up to the GPU&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T18:57:12Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Introduction and Problem Statement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Proposal Name&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Date Proposed&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Status&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Proposer&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Core Dev Sponsor(s)&lt;br /&gt;
|None yet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Baseline: Yay, we have physics! ...somewhat.'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Not currently possible for most individuals and small businesses'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|↓↓'''Possible in the future with GPU acceleration'''↓↓&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Questions ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Ideas ==&lt;br /&gt;
&lt;br /&gt;
=== Advantages and Challenges ===&lt;br /&gt;
&lt;br /&gt;
'''Advantages:'''&lt;br /&gt;
* Improved performance.&lt;br /&gt;
* Reduced CPU usage.&lt;br /&gt;
* Ability to use more physical objects with the same performance goals.&lt;br /&gt;
* Unlock a new level of complexity and dynamicity in OpenSimulator (although other components, such as users' graphics cards, may take time to catch up).&lt;br /&gt;
&lt;br /&gt;
'''Challenges:'''&lt;br /&gt;
* A lot of existing hardware hosting OpenSimulator does not have any GPU at all.&lt;br /&gt;
* Acquiring a dedicated GPU for a server that does not have one can be very expensive, especially if you have to custom request one from your hosting provider.&lt;br /&gt;
* Support for open source Linux graphics drivers running OpenCL is still in a very early stage (as of September 2013).&lt;br /&gt;
&lt;br /&gt;
=== Implementation Ideas ===&lt;br /&gt;
&lt;br /&gt;
# We should have a config file option in OpenSim.ini under a BulletSim heading for whether or not to enable OpenCL. Trying to be smart and autodetect might lead to problems, such as a user with an unstable graphics driver accidentally crashing their system (and then if OpenSim starts on boot, that's REALLY bad because their system crashes during the boot procedure!). We absolutely must have a way for the user to enable or disable OpenCL support, and leave it '''disabled''' by default out of the box.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should not throw away our existing code that uses the CPU paths of Bullet. The Bullet non-OpenCL paths are probably faster running on the CPU than a CPU implementation of OpenCL running the OpenCL paths of Bullet, simply because a layer of complexity is removed.&amp;lt;br /&amp;gt;&lt;br /&gt;
# If Bullet doesn't already do this, we should refuse to run OpenCL on the CPU except for testing and debugging purposes (maybe a compile flag).&lt;br /&gt;
# We should look at Bullet developer and user blogs, wikis, code comments, etc. and attempt to figure out what parts of the GPU rendering pipeline provide the greatest performance improvement vs. CPU, and run the best on GPUs, and exploit that to the best of our ability, while avoiding or minimizing the use of features that the GPU does not handle as well.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should investigate the possibility of continuing to use the CPU for physics, especially if there are certain interactions or edge cases that are horribly slow on a GPU, or not implemented in the GPU pipeline on Bullet. Better yet, we could develop some sort of physics scheduler, that first attempts to max out the GPU, and if there are still physics calculations that need to be done, push the remainder of them onto the CPU until the CPU is also saturated. On high-end servers, the CPUs do indeed allow for a non-trivial amount of physics to be done, so we needn't leave it all up to the GPU&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T18:47:00Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Proposal Name&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Date Proposed&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Status&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Proposer&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Core Dev Sponsor(s)&lt;br /&gt;
|None yet.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Questions ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Ideas ==&lt;br /&gt;
&lt;br /&gt;
=== Advantages and Challenges ===&lt;br /&gt;
&lt;br /&gt;
'''Advantages:'''&lt;br /&gt;
* Improved performance.&lt;br /&gt;
* Reduced CPU usage.&lt;br /&gt;
* Ability to use more physical objects with the same performance goals.&lt;br /&gt;
* Unlock a new level of complexity and dynamicity in OpenSimulator (although other components, such as users' graphics cards, may take time to catch up).&lt;br /&gt;
&lt;br /&gt;
'''Challenges:'''&lt;br /&gt;
* A lot of existing hardware hosting OpenSimulator does not have any GPU at all.&lt;br /&gt;
* Acquiring a dedicated GPU for a server that does not have one can be very expensive, especially if you have to custom request one from your hosting provider.&lt;br /&gt;
* Support for open source Linux graphics drivers running OpenCL is still in a very early stage (as of September 2013).&lt;br /&gt;
&lt;br /&gt;
=== Implementation Ideas ===&lt;br /&gt;
&lt;br /&gt;
# We should have a config file option in OpenSim.ini under a BulletSim heading for whether or not to enable OpenCL. Trying to be smart and autodetect might lead to problems, such as a user with an unstable graphics driver accidentally crashing their system (and then if OpenSim starts on boot, that's REALLY bad because their system crashes during the boot procedure!). We absolutely must have a way for the user to enable or disable OpenCL support, and leave it '''disabled''' by default out of the box.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should not throw away our existing code that uses the CPU paths of Bullet. The Bullet non-OpenCL paths are probably faster running on the CPU than a CPU implementation of OpenCL running the OpenCL paths of Bullet, simply because a layer of complexity is removed.&amp;lt;br /&amp;gt;&lt;br /&gt;
# If Bullet doesn't already do this, we should refuse to run OpenCL on the CPU except for testing and debugging purposes (maybe a compile flag).&lt;br /&gt;
# We should look at Bullet developer and user blogs, wikis, code comments, etc. and attempt to figure out what parts of the GPU rendering pipeline provide the greatest performance improvement vs. CPU, and run the best on GPUs, and exploit that to the best of our ability, while avoiding or minimizing the use of features that the GPU does not handle as well.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should investigate the possibility of continuing to use the CPU for physics, especially if there are certain interactions or edge cases that are horribly slow on a GPU, or not implemented in the GPU pipeline on Bullet. Better yet, we could develop some sort of physics scheduler, that first attempts to max out the GPU, and if there are still physics calculations that need to be done, push the remainder of them onto the CPU until the CPU is also saturated. On high-end servers, the CPUs do indeed allow for a non-trivial amount of physics to be done, so we needn't leave it all up to the GPU&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T18:42:58Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Advantages and Disadvantages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Questions ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Ideas ==&lt;br /&gt;
&lt;br /&gt;
=== Advantages and Challenges ===&lt;br /&gt;
&lt;br /&gt;
'''Advantages:'''&lt;br /&gt;
* Improved performance.&lt;br /&gt;
* Reduced CPU usage.&lt;br /&gt;
* Ability to use more physical objects with the same performance goals.&lt;br /&gt;
* Unlock a new level of complexity and dynamicity in OpenSimulator (although other components, such as users' graphics cards, may take time to catch up).&lt;br /&gt;
&lt;br /&gt;
'''Challenges:'''&lt;br /&gt;
* A lot of existing hardware hosting OpenSimulator does not have any GPU at all.&lt;br /&gt;
* Acquiring a dedicated GPU for a server that does not have one can be very expensive, especially if you have to custom request one from your hosting provider.&lt;br /&gt;
* Support for open source Linux graphics drivers running OpenCL is still in a very early stage (as of September 2013).&lt;br /&gt;
&lt;br /&gt;
=== Implementation Ideas ===&lt;br /&gt;
&lt;br /&gt;
# We should have a config file option in OpenSim.ini under a BulletSim heading for whether or not to enable OpenCL. Trying to be smart and autodetect might lead to problems, such as a user with an unstable graphics driver accidentally crashing their system (and then if OpenSim starts on boot, that's REALLY bad because their system crashes during the boot procedure!). We absolutely must have a way for the user to enable or disable OpenCL support, and leave it '''disabled''' by default out of the box.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should not throw away our existing code that uses the CPU paths of Bullet. The Bullet non-OpenCL paths are probably faster running on the CPU than a CPU implementation of OpenCL running the OpenCL paths of Bullet, simply because a layer of complexity is removed.&amp;lt;br /&amp;gt;&lt;br /&gt;
# If Bullet doesn't already do this, we should refuse to run OpenCL on the CPU except for testing and debugging purposes (maybe a compile flag).&lt;br /&gt;
# We should look at Bullet developer and user blogs, wikis, code comments, etc. and attempt to figure out what parts of the GPU rendering pipeline provide the greatest performance improvement vs. CPU, and run the best on GPUs, and exploit that to the best of our ability, while avoiding or minimizing the use of features that the GPU does not handle as well.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should investigate the possibility of continuing to use the CPU for physics, especially if there are certain interactions or edge cases that are horribly slow on a GPU, or not implemented in the GPU pipeline on Bullet. Better yet, we could develop some sort of physics scheduler, that first attempts to max out the GPU, and if there are still physics calculations that need to be done, push the remainder of them onto the CPU until the CPU is also saturated. On high-end servers, the CPUs do indeed allow for a non-trivial amount of physics to be done, so we needn't leave it all up to the GPU&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T18:25:36Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Implementation Ideas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Questions ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Ideas ==&lt;br /&gt;
&lt;br /&gt;
=== Advantages and Disadvantages ===&lt;br /&gt;
&lt;br /&gt;
'''Advantages:'''&lt;br /&gt;
* Improved performance.&lt;br /&gt;
* Reduced CPU usage.&lt;br /&gt;
* Ability to use more physical objects with the same performance goals.&lt;br /&gt;
* Unlock a new level of complexity and dynamicity in OpenSimulator (although other components, such as users' graphics cards, may take time to catch up).&lt;br /&gt;
&lt;br /&gt;
'''Disadvantages:'''&lt;br /&gt;
* A lot of existing hardware hosting OpenSimulator does not have any GPU at all.&lt;br /&gt;
* Acquiring a dedicated GPU for a server that does not have one can be very expensive, especially if you have to custom request one from your hosting provider.&lt;br /&gt;
* Support for open source Linux graphics drivers running OpenCL is still in a very early stage (as of September 2013).&lt;br /&gt;
&lt;br /&gt;
=== Implementation Ideas ===&lt;br /&gt;
&lt;br /&gt;
# We should have a config file option in OpenSim.ini under a BulletSim heading for whether or not to enable OpenCL. Trying to be smart and autodetect might lead to problems, such as a user with an unstable graphics driver accidentally crashing their system (and then if OpenSim starts on boot, that's REALLY bad because their system crashes during the boot procedure!). We absolutely must have a way for the user to enable or disable OpenCL support, and leave it '''disabled''' by default out of the box.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should not throw away our existing code that uses the CPU paths of Bullet. The Bullet non-OpenCL paths are probably faster running on the CPU than a CPU implementation of OpenCL running the OpenCL paths of Bullet, simply because a layer of complexity is removed.&amp;lt;br /&amp;gt;&lt;br /&gt;
# If Bullet doesn't already do this, we should refuse to run OpenCL on the CPU except for testing and debugging purposes (maybe a compile flag).&lt;br /&gt;
# We should look at Bullet developer and user blogs, wikis, code comments, etc. and attempt to figure out what parts of the GPU rendering pipeline provide the greatest performance improvement vs. CPU, and run the best on GPUs, and exploit that to the best of our ability, while avoiding or minimizing the use of features that the GPU does not handle as well.&amp;lt;br /&amp;gt;&lt;br /&gt;
# We should investigate the possibility of continuing to use the CPU for physics, especially if there are certain interactions or edge cases that are horribly slow on a GPU, or not implemented in the GPU pipeline on Bullet. Better yet, we could develop some sort of physics scheduler, that first attempts to max out the GPU, and if there are still physics calculations that need to be done, push the remainder of them onto the CPU until the CPU is also saturated. On high-end servers, the CPUs do indeed allow for a non-trivial amount of physics to be done, so we needn't leave it all up to the GPU&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T18:01:33Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Questions ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Ideas ==&lt;br /&gt;
&lt;br /&gt;
=== Advantages and Disadvantages ===&lt;br /&gt;
&lt;br /&gt;
'''Advantages:'''&lt;br /&gt;
* Improved performance.&lt;br /&gt;
* Reduced CPU usage.&lt;br /&gt;
* Ability to use more physical objects with the same performance goals.&lt;br /&gt;
* Unlock a new level of complexity and dynamicity in OpenSimulator (although other components, such as users' graphics cards, may take time to catch up).&lt;br /&gt;
&lt;br /&gt;
'''Disadvantages:'''&lt;br /&gt;
* A lot of existing hardware hosting OpenSimulator does not have any GPU at all.&lt;br /&gt;
* Acquiring a dedicated GPU for a server that does not have one can be very expensive, especially if you have to custom request one from your hosting provider.&lt;br /&gt;
* Support for open source Linux graphics drivers running OpenCL is still in a very early stage (as of September 2013).&lt;br /&gt;
&lt;br /&gt;
=== Implementation Ideas ===&lt;br /&gt;
&lt;br /&gt;
# We should have a config file option in OpenSim.ini under a BulletSim heading for whether or not to enable OpenCL. Trying to be smart and autodetect might lead to problems, such as a user with an unstable graphics driver accidentally crashing their system (and then if OpenSim starts on boot, that's REALLY bad because their system crashes during the boot procedure!). We absolutely must have a way for the user to enable or disable OpenCL support, and leave it '''disabled''' by default out of the box.&lt;br /&gt;
&lt;br /&gt;
# We should not throw away our existing code that uses the CPU paths of Bullet. The Bullet non-OpenCL paths are probably faster running on the CPU than a CPU implementation of OpenCL running the OpenCL paths of Bullet, simply because a layer of complexity is removed.&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:55:59Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Brainstorming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming Questions ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:44:30Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Brainstorming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
# Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
# What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
# Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
# What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
## Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
## Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
## Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
# What hardware and software configurations should we test on?&lt;br /&gt;
# What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
# Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:27:25Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Introduction and Problem Statement */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
'''Caveat''': I am well aware that the estimates of scale below for the number of prims is potentially inaccurate by several orders of magnitude up or down. These are ''rough'' estimates. I am also aware that different types of physics interactions and different shapes have vastly different computational costs; for instance, it is much easier to calculate collision between two cubes compared to two toruses (torii?). The general point, however, remains valid.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
0. Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
1. What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
2. Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
3. What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
3(a). Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
3(b). Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
3(c). Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
4. What hardware and software configurations should we test on?&lt;br /&gt;
5. What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
6. Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:10:52Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* GPU OpenCL Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
0. Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
1. What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
2. Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
3. What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
3(a). Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
3(b). Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
3(c). Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
4. What hardware and software configurations should we test on?&lt;br /&gt;
5. What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
6. Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:10:06Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* GPU OpenCL Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
0. Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
1. What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
2. Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
3. What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
3(a). Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
3(b). Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
3(c). Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
4. What hardware and software configurations should we test on?&lt;br /&gt;
5. What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
6. Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:09:56Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* GPU OpenCL Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
0. Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
1. What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
2. Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
3. What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
3(a). Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
3(b). Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
3(c). Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
4. What hardware and software configurations should we test on?&lt;br /&gt;
5. What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
6. Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:09:39Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* GPU OpenCL Support */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
0. Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
1. What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
2. Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
3. What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
3(a). Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
3(b). Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
3(c). Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
4. What hardware and software configurations should we test on?&lt;br /&gt;
5. What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
6. Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; Desktop/Mobile (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
&amp;quot;Ivy Bridge&amp;quot; Server (Xeon 1275v2) or later&lt;br /&gt;
&amp;quot;Knights Corner&amp;quot; (Xeon Phi) or later&lt;br /&gt;
Excluding enthusiast and multi-CPU chips (Ivy-E, etc.)&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T17:06:37Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
0. Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
1. What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
2. Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
3. What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
3(a). Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
3(b). Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
3(c). Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
4. What hardware and software configurations should we test on?&lt;br /&gt;
5. What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
6. Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= GPU OpenCL Support =&lt;br /&gt;
&lt;br /&gt;
Here is just a table describing the current state of GPU-accelerated OpenCL support on various platforms and hardware. I choose to arbitrarily define the following:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Windows&amp;quot; as &amp;quot;Windows Vista SP2 or later, 32 or 64-bit&amp;quot;;&lt;br /&gt;
* &amp;quot;Mac&amp;quot; as &amp;quot;Mac OS X 10.7 or later&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux Proprietary&amp;quot; as &amp;quot;Linux 2.6.32 or later on RHEL 6+, Debian 6+, Ubuntu 12.04+, Fedora 17+, OpenSUSE 12.1+, with a '''closed-source''' vendor-supplied GPU kernel module&amp;quot;;&lt;br /&gt;
* &amp;quot;Linux FOSS&amp;quot; as &amp;quot;Linux 3.10 or later on the latest stable Fedora, Ubuntu, or OpenSUSE, or Debian Testing, with an open-source, Mesa or Gallium3d graphics driver&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Vendor&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Minimum Hardware Generation&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Windows&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Mac&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux Proprietary&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Linux FOSS&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|AMD&lt;br /&gt;
|Radeon HD5000 or later&lt;br /&gt;
FirePro W600 or later&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Nvidia&lt;br /&gt;
|GeForce 400 Series or later&lt;br /&gt;
Quadro 400 Series or later&lt;br /&gt;
Tesla&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;|Intel&lt;br /&gt;
|&amp;quot;Ivy Bridge&amp;quot; (Core i3/i5/i7 3xxx) or later&lt;br /&gt;
Xeon Phi?&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|style=&amp;quot;background-color: lime;&amp;quot;|Fully Supported&lt;br /&gt;
|N/A&lt;br /&gt;
|style=&amp;quot;background-color: yellow;&amp;quot;|Experimental&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T16:38:01Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|-&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction and Problem Statement =&lt;br /&gt;
&lt;br /&gt;
Right now, physical object movement and collision consumes significant CPU time for OpenSimulator. There are several popular sims that have either disabled physics completely, or severely restricted its use to the bare minimum. Use cases of OpenSimulator that desire to use lots of physical objects, collide them together in interesting ways, etc. will quickly peg their CPU, which slows down the simulator FPS, introduces time dilation, and increases network latency due to the CPU being pegged. This is observable even on high-end, current-generation single processor systems (e.g. Core i7 4770K), on any platform. Even on hardware that can easily handle a large number of objects, this problem negatively impacts region &amp;quot;density&amp;quot; (how many regions you can fit on a single server). &lt;br /&gt;
&lt;br /&gt;
Physics-based simulations and interactions may continue to be optimized on the CPU by switching from the OpenDynamicsEngine physics backend to the the Bullet Physics Engine, because Bullet is significantly faster and more optimized than ODE. However, even Bullet has its upper limit of capabilities on the CPU. Furthermore, there is a certain tradeoff to be made between accuracy/precision and speed, as depicted in the following table. The point is, by raising our computational ceiling, we can either achieve better precision, larger scale (more or more complex objects that are physical), or some tradeoff improving both aspects to a lesser degree. The other point is that GPU acceleration is currently the most cost-sensitive way to raise the performance ceiling (can ''you'' afford a supercomputer?).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|Physics Tradeoffs&lt;br /&gt;
|-&lt;br /&gt;
|'''Precision'''&lt;br /&gt;
|'''# Physical Prims'''&lt;br /&gt;
|'''Performance On Commodity Hardware'''&lt;br /&gt;
|'''Hardware Class For Acceptable Performance'''&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Baseline: Yay, we have physics! ...somewhat.'''&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Excellent&lt;br /&gt;
|Laptop, netbook, or embedded&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Typical (CPU-only BulletSim or ODE on desktops, single-CPU servers, etc.)'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Few (10s)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Acceptable&lt;br /&gt;
|Commodity desktop or small server&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Not currently possible for most individuals and small businesses'''&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
|Poor&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Poor&lt;br /&gt;
|Large server (multi-CPU) '''OR''' GPU-accelerated&lt;br /&gt;
|-&lt;br /&gt;
!colspan=&amp;quot;8&amp;quot;|'''Possible in the future with GPU acceleration'''&lt;br /&gt;
|-&lt;br /&gt;
|Extreme&lt;br /&gt;
|Many (hundreds or thousands)&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|-&lt;br /&gt;
|Good&lt;br /&gt;
|Hundreds of thousands or millions&lt;br /&gt;
|Awful&lt;br /&gt;
|High-end GPU or multiple GPUs; impractical with non-supercomputer CPUs&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
Since we already have a physics backend that uses [http://bulletphysics.org Bullet Physics Engine], and since Bullet upstream itself is developing a GPU-accelerated physics pipeline, &amp;quot;all&amp;quot; we have to do is to take advantage of that pipeline in our code. Successful implementations will notice reduced CPU usage, the possibility of increased region density, or the ability to remove restrictions on tenants, like, &amp;quot;make sure you have no more than 10 physical objects at any time&amp;quot; (for example).&lt;br /&gt;
&lt;br /&gt;
== General Observations ==&lt;br /&gt;
&lt;br /&gt;
* In recent years, both Intel and AMD have started shipping [http://ark.intel.com/products/65719/ desktop] and [http://ark.intel.com/products/75464 server] CPUs which contain an IGPU (Integrated Graphics Processing Unit).&lt;br /&gt;
* The capabilities of IGPUs have been rapidly accelerating -- in fact, they have been increasing at a much higher rate than the CPU part of the chip. GPU performance is still roughly following Moore's Law, while CPU performance is leveling off in a huge way.&lt;br /&gt;
* Many computers running OpenSimulator, whether a spare desktop in someone's home or a dedicated server in a datacenter, have either an IGPU or a DGPU (Discrete Graphics Processing Unit) which is, to a greater or lesser extent, underutilized -- meaning that the resources are available, but are sitting entirely or mostly idle.&lt;br /&gt;
* The state of the art of graphics drivers has advanced significantly, to the point that IGPUs and DGPUs by AMD, Intel and Nvidia have available [http://www.khronos.org/opencl/ OpenCL 1.1] implementations on major platforms (Windows, Mac, and Linux). &lt;br /&gt;
* The Bullet Physics Engine development community is gradually shifting their own focus towards improving and optimizing Bullet for GPUs, and offering more physics operations being accelerated by the GPU rather than the CPU.&lt;br /&gt;
* While Bullet supports DirectX and CUDA to various extents (these are also APIs to access the GPU), it also supports OpenCL. OpenCL is one of, if not '''the''' only industry-standard, general-purpose GPU computing language that is available on all the platforms that OpenSimulator officially supports (Windows, Mac and Linux), and on all the major GPU vendor hardware (Intel, AMD, and Nvidia).&lt;br /&gt;
&lt;br /&gt;
== Conclusion ==&lt;br /&gt;
&lt;br /&gt;
Enabling GPU-accelerated Bullet physics via OpenCL is the obvious path forward to unlocking the next level of scalability and/or precision of physics simulations in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
= Scope of Work =&lt;br /&gt;
&lt;br /&gt;
== Brainstorming ==&lt;br /&gt;
&lt;br /&gt;
If you can answer any of these questions, please [http://opensimulator.org/index.php?title=Feature_Proposals/BulletSim_OpenCL&amp;amp;action=edit edit this page] and fill in an answer beneath each question!&lt;br /&gt;
&lt;br /&gt;
0. Let's assume that we're going to target the latest Bullet code from version control, and evolve our code to match as Bullet evolves. We should do this ''at least'' until Bullet 3.0 is released as stable, because major improvements to the OpenCL rigid body pipeline are available in git that are not in the latest stable release as of this writing.&lt;br /&gt;
1. What parts of Bullet are currently GPU-accelerated in the 3.x preview codebase?&lt;br /&gt;
2. Of the parts of Bullet that are GPU-accelerated, does OpenSimulator use any of them?&lt;br /&gt;
3. What configuration or API usage changes are required of OpenSimulator's use of Bullet in order to use the GPU-accelerated features?&lt;br /&gt;
3(a). Can we simply enable Bullet's GPU acceleration by changing a configuration setting, or an initialization flag?&lt;br /&gt;
3(b). Do we have to use entire new classes in the Bullet C++ API to use the GPU-accelerated features?&lt;br /&gt;
3(c). Do we have to change our entire approach to using Bullet in the BulletSim physics backend to use the GPU-accelerated features?&lt;br /&gt;
4. What hardware and software configurations should we test on?&lt;br /&gt;
5. What is the minimum hardware specification that would actually yield a performance improvement over the CPU pipeline?&lt;br /&gt;
6. Even if we successfully accelerate Bullet to a high degree, are we still bottlenecked by disk, memory bandwidth, locking primitives in OpenSimulator, or the .NET runtime, inhibiting our scalability past a certain point? If so, how far can we go before we hit this wall? Does GPU acceleration buy us anything, or are we already ''against'' that wall with the capabilities of CPU-based physics?&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:Allquixotic</id>
		<title>User:Allquixotic</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:Allquixotic"/>
				<updated>2013-09-10T15:30:11Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Me ==&lt;br /&gt;
&lt;br /&gt;
* 27 years old&lt;br /&gt;
* Male&lt;br /&gt;
* From Maryland, USA&lt;br /&gt;
* Software Engineer / Information Security Engineer&lt;br /&gt;
* Wide array of interests spanning most software development domains&lt;br /&gt;
* Focussed knowledge in GNU/Linux, Gstreamer, GTK+, Java, C#, and TCP/IP networking and protocols&lt;br /&gt;
* Working in application security testing as a day job&lt;br /&gt;
* Have worked in a software engineering company for smartphones&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
* IRC (freenode): allquixotic&lt;br /&gt;
* Email: smcnam. Oh, you were wondering what domain I'm at, too, weren't you? Well, you'd have be a pretty smart spambot to get this far! I use Google's e-mail service -- the shortened version of &amp;quot;googlemail&amp;quot;.&lt;br /&gt;
* Yahoo: Same as IRC&lt;br /&gt;
* Google Talk/Jabber: Same as Email&lt;br /&gt;
* Secondlife (Agni) and OSgrid: Tiyuk Quellmalz&lt;br /&gt;
&lt;br /&gt;
== Why? ==&lt;br /&gt;
&lt;br /&gt;
Why am I interested in OpenSim? Because it's very hackable, being a high-level language with automatic memory management and objects, and written in a very modular way; and because I run a bunch of sims on OSgrid that I want to help flourish. Turns out we could really use certain features to get our sims working well, so I'm willing to put in the effort.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T15:27:37Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;6&amp;quot;|Basic Information&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposal Name'''&lt;br /&gt;
|BulletSim GPU Acceleration Using OpenCL&lt;br /&gt;
|'''Date Proposed'''&lt;br /&gt;
|September 10, 2013&lt;br /&gt;
|-&lt;br /&gt;
|'''Status'''&lt;br /&gt;
|Draft&lt;br /&gt;
|-&lt;br /&gt;
|'''Proposer'''&lt;br /&gt;
|[[User:Allquixotic]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
A summary of what this feature is about.&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The text of the proposal.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals</id>
		<title>Feature Proposals</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals"/>
				<updated>2013-09-10T15:22:08Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: Add feature proposal for BulletSim_OpenCL&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Feature Proposals==&lt;br /&gt;
If you want to propose a feature, you should do so on the opensim-dev mailing list. If there is interest or if you plan to write the code yourself, you can create a page here. Please do not propose features in the Mantis bug tracker. Please do not propose features if you don't have a clear idea of how they would work on a technical level. Please do not propose features expecting other people to do the implementation work without convincing them first - this will not happen.&lt;br /&gt;
&lt;br /&gt;
Feature proposals must be created in conjunction with a post to the opensim-dev mailing list - if they are just created here then it's possible they will not get seen by other developers.&lt;br /&gt;
&lt;br /&gt;
If you're adding a proposal here, please do it with a page name of Feature_Proposals/&amp;lt;name of service&amp;gt;. For example Feature_Proposals/AutoBackup.&lt;br /&gt;
&lt;br /&gt;
=== Templates ===&lt;br /&gt;
&lt;br /&gt;
* [[Feature Proposal Template]] - Use this template for your document.&lt;br /&gt;
&lt;br /&gt;
=== Present ===&lt;br /&gt;
&lt;br /&gt;
* [[Feature Proposals/Dynamic Attributes in Scene Objects]]&lt;br /&gt;
* [[Feature Proposals/Deduplicating Asset Service]]&lt;br /&gt;
* [[Feature Proposals/Improve Groups Service]]&lt;br /&gt;
* [[Feature Proposals/BulletSim_OpenCL]]&lt;br /&gt;
* [[IntegrationService]]&lt;br /&gt;
* [[RemoteAdmin:RemoteAdmin_Proposals]] - proposals for additional [[RemoteAdmin]] external methods.&lt;br /&gt;
&lt;br /&gt;
=== Past ===&lt;br /&gt;
&lt;br /&gt;
* [[Feature Proposals/Multi-Region OARs]]&lt;br /&gt;
* [[Feature Proposals/AutoBackup|AutoBackup]]&lt;br /&gt;
* [[Statistics Server]] - Proposal for a statistics server in OpenSimulator.&lt;br /&gt;
* [[OpenID]] - Proposal for using OpenID in OpenSimulator&lt;br /&gt;
* [[AssetServerProposal]] - Proposal for a distributed asset server&lt;br /&gt;
* [[A better SimCrossing]] - A work in progress about implementing a smooth simcrossing&lt;br /&gt;
* [[Creating profiles not used for login]] - RFC for alternative ways of creating profiles that will never be used for login&lt;br /&gt;
* [[OpenSim Profile Anchors]] - a mechanism for retaining creator information for offline item transfers&lt;br /&gt;
* [[Explicit Object Serialization]] - a proposal to explicitly serialize scene objects rather than using automatic .NET XML serialization&lt;br /&gt;
* [[Opensim: 0.5 Release Target Discussion]]&lt;br /&gt;
* [[Opensim: 0.6 Release Target Discussion]]&lt;br /&gt;
* [[Opensim: Future Release Discussion]]&lt;br /&gt;
* [[OpenWiredux: Taking the next step]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Development]]&lt;br /&gt;
[[Category:Proposal]]&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL</id>
		<title>Feature Proposals/BulletSim OpenCL</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/BulletSim_OpenCL"/>
				<updated>2013-09-10T15:21:33Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: Template import&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Date=&lt;br /&gt;
&lt;br /&gt;
Date of this proposal.&lt;br /&gt;
&lt;br /&gt;
= Status (draft, in progress, done or abandoned) =&lt;br /&gt;
&lt;br /&gt;
Status of the proposal. No set form as of yet, but could be draft/in progress/done/abandoned.&lt;br /&gt;
&lt;br /&gt;
= Proposers =&lt;br /&gt;
&lt;br /&gt;
The names of the people proposing this feature.&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
A summary of what this feature is about.&lt;br /&gt;
&lt;br /&gt;
= Proposal =&lt;br /&gt;
&lt;br /&gt;
The text of the proposal.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Development_Team</id>
		<title>Development Team</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Development_Team"/>
				<updated>2011-05-16T10:40:12Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Additional Developers/Testers/Contributors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ {{Template:Quicklinks}} &lt;br /&gt;
&lt;br /&gt;
[[Technical Reference|Technical Reference]] -&amp;amp;gt; [[Technical Reference/terms|Terms]] -&amp;amp;gt; [[Development Team|Core Development Team]] &lt;br /&gt;
&lt;br /&gt;
== Active Core Developers  ==&lt;br /&gt;
&lt;br /&gt;
Developers who have commit access to our central server, are [http://www.ohloh.net/projects/4753/contributors regular contributors] to the codebase, and have voting rights over development and process issues of the OpenSimulator project. See [[Organization]].&lt;br /&gt;
&lt;br /&gt;
* '''Only voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name&lt;br /&gt;
! SL Avatar&lt;br /&gt;
! Other Grid&lt;br /&gt;
! Time Zone&amp;lt;br&amp;gt;(UTC)&lt;br /&gt;
! Org&lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Adam Frisby|Adam Frisby]]&lt;br /&gt;
| Adam Frisby&lt;br /&gt;
| Adam Zaius&lt;br /&gt;
| &lt;br /&gt;
| +8&lt;br /&gt;
| DeepThink Pty Ltd&lt;br /&gt;
| Terrain, Performance&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Chi11ken|chi11ken]]&lt;br /&gt;
| Jeff Ames&lt;br /&gt;
| Chillken Proto&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| +9&lt;br /&gt;
| [http://www.genkii.com Genkii]&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Justincc|justincc]]&lt;br /&gt;
| Justin Clark-Casey&lt;br /&gt;
| Lulworth Beaumont&lt;br /&gt;
| Justin Clark-Casey (all other grids)&lt;br /&gt;
| 0&lt;br /&gt;
| OSVW Consulting&amp;lt;br&amp;gt;[http://justincc.org/blog justincc's OpenSim blog]&lt;br /&gt;
| Grid, performance &amp;amp;amp; reliability, inventory (avatar and object), assets, scenes, OARs, etc.  Generally speaking, my main interest is to create infrastructure that other people can build on top of.&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Dahlia|dahlia]]&lt;br /&gt;
| T. Hoff&lt;br /&gt;
| Dahlia Trimble&lt;br /&gt;
| &lt;br /&gt;
| -8 / -7&lt;br /&gt;
| Independent&lt;br /&gt;
| Collision geometry, various math and physics issues, occasional bug fixes and random enhancements&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Melanie T|Melanie_T]]&lt;br /&gt;
| Melanie&lt;br /&gt;
| Melanie Milland&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| +1&lt;br /&gt;
| Independent&lt;br /&gt;
| Scripting, Prims/Scene, Life, The Universe, and Everything&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Diva|Diva]]&lt;br /&gt;
| Crista Lopes&lt;br /&gt;
| Diva Canto&lt;br /&gt;
| Crista Lopes / Diva Canto&lt;br /&gt;
| -8&lt;br /&gt;
| University of California, Irvine&lt;br /&gt;
| Everything, except databases&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| jhurliman&lt;br /&gt;
| John Hurliman&lt;br /&gt;
| John Hurliman&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| Intel&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| dslake&lt;br /&gt;
| Dan Lake&lt;br /&gt;
| Dan Lake&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| Intel&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Marck|Marck00]]&lt;br /&gt;
| M. Kirsch&lt;br /&gt;
| Marck Kjeller&lt;br /&gt;
| &lt;br /&gt;
| +1&lt;br /&gt;
| Independent&lt;br /&gt;
| Everything that catches my attention and that I can get my head around.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:BlueWall|BlueWall]]&lt;br /&gt;
| James Hughes&lt;br /&gt;
| BlueWall Slade&lt;br /&gt;
| BlueWall Slade&lt;br /&gt;
| -5&lt;br /&gt;
| BlueWall Information Technologies, LLC&lt;br /&gt;
| Various parts&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Core Developers Following the White Rabbit ==&lt;br /&gt;
&lt;br /&gt;
Core developers who have temporarily (we hope) gone chasing the white rabbit. They are in all similar to the active core developers, except that they haven't been that active lately, so their voting rights are awaiting their come back. &lt;br /&gt;
&lt;br /&gt;
* '''Only voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name&lt;br /&gt;
! SL Avatar&lt;br /&gt;
! Other Grid&lt;br /&gt;
! Time Zone&amp;lt;br&amp;gt;(UTC)&lt;br /&gt;
! Org&lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Lbsa71|lbsa71]]&lt;br /&gt;
| Stefan Andersson&lt;br /&gt;
| Tribal Skytower&lt;br /&gt;
| OSG:Stefan Andersson&amp;lt;br&amp;gt;TN:Stefan Andersson&lt;br /&gt;
| +1&lt;br /&gt;
| [http://tribalmedia.se/ Tribal Media AB]&lt;br /&gt;
| Web Integration&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:MW|MW]]&lt;br /&gt;
| Darren&lt;br /&gt;
| Wright Juran&lt;br /&gt;
| &lt;br /&gt;
| 0&lt;br /&gt;
| &lt;br /&gt;
| Everything&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| ckrinke&lt;br /&gt;
| Charles&amp;amp;nbsp;Krinke&lt;br /&gt;
| Charlesk&amp;amp;nbsp;Bing&lt;br /&gt;
| &lt;br /&gt;
| -8&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
| Reliability/Grid servers/ll-functions&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Mikem|mikem]]&lt;br /&gt;
| Mike Mazur&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| +9&lt;br /&gt;
| Independent&lt;br /&gt;
| Patches, scripting improvements, LSL compiler&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:HomerHorwitz|homerh]]&lt;br /&gt;
| Homer Horwitz&lt;br /&gt;
| Homer Horwitz&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| +2&lt;br /&gt;
| Independent&lt;br /&gt;
| Rev. engineering, &amp;quot;now, that's funny&amp;quot; problems, but still interested in all parts of it&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Nlin|nlin]]&lt;br /&gt;
| N Lin&lt;br /&gt;
| Standard Drucker&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| +9&lt;br /&gt;
| [http://www.3di.jp/en/ 3Di Inc, Japan]&amp;lt;br&amp;gt;http://www.3di.jp/en/&lt;br /&gt;
| Physics, scripting, more to come&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Arthursv|arthursv]]&lt;br /&gt;
| Arthur Valadares&lt;br /&gt;
| &lt;br /&gt;
| NONE&lt;br /&gt;
| -8&lt;br /&gt;
| University of California, Irvine&lt;br /&gt;
| Unit testing, database plugins, bug fixes, general &lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:DrScofield|drscofld]]&lt;br /&gt;
| Dirk Husemann&lt;br /&gt;
| Dr Scofield&lt;br /&gt;
| &lt;br /&gt;
| +1&lt;br /&gt;
| [http://xyzzyxyzzy.net/ xyzzyxyzzy.net]&lt;br /&gt;
| Reliability, networking protocols, inventory, assets, remote control, voice, and pretty much everything else&amp;amp;nbsp;:-)&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:Teravus|Teravus]]&lt;br /&gt;
| Daniel Olivares&lt;br /&gt;
| Teravus Ousley&lt;br /&gt;
| &lt;br /&gt;
| -5&lt;br /&gt;
| W3z&lt;br /&gt;
| Physics &amp;amp;amp; Admin tools, A working sim.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Retired Core Developers ==&lt;br /&gt;
&lt;br /&gt;
Core developers who have transcended our mortal plane, i.e. they are no longer directly engaged with the project. Thank you forever for your contributions!&lt;br /&gt;
&lt;br /&gt;
* '''Only formerly voted in developers are listed here, please do not list yourself'''&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;2&amp;quot; cellspacing=&amp;quot;0&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name&lt;br /&gt;
! SL Avatar&lt;br /&gt;
! Other Grid&lt;br /&gt;
! Time Zone&amp;lt;br&amp;gt;(UTC)&lt;br /&gt;
! Org&lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Babblefrog|babblefrog]]&lt;br /&gt;
| Brian McBee&lt;br /&gt;
| Dogen Coldstream&lt;br /&gt;
| Babblefrog Ballistic (osgrid)&lt;br /&gt;
| -8&lt;br /&gt;
| Disorganized&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Danx0r|danx0r]]&lt;br /&gt;
| Dan Miller&lt;br /&gt;
| Albert Pascal&lt;br /&gt;
| &lt;br /&gt;
| -8&lt;br /&gt;
| squiggle.com&lt;br /&gt;
| PHEEZIKS; everything&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Tleiades&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
| Tleiades&amp;amp;nbsp;Hax&lt;br /&gt;
| &lt;br /&gt;
| +1&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
| Grid servers/Database&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Darok|Darok]]&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
| Darok Kaminski&lt;br /&gt;
| &lt;br /&gt;
| +1&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
| Physics engines (especially BulletX)&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Gareth / Gwen&lt;br /&gt;
| Gareth Nelson&lt;br /&gt;
| Gareth Ellison&lt;br /&gt;
| Gareth Nelson (on everywhere but SL)&lt;br /&gt;
| BST (UTC+1)&lt;br /&gt;
| Litesim Ltd&lt;br /&gt;
| Grid servers, sim border crossing, avatar animations&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Dalien|dalien]]&lt;br /&gt;
| Dalien Talbot&lt;br /&gt;
| Dalien Talbot&lt;br /&gt;
| &lt;br /&gt;
| +1&lt;br /&gt;
| Mostly TCP-based&lt;br /&gt;
| Small fixes; rev.eng./prototyping; nightlies; git-keeper &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[Alondria]]&lt;br /&gt;
| &lt;br /&gt;
| Alondria LeFay&lt;br /&gt;
| Alondria LeFay (OSGrid)&lt;br /&gt;
| -8&lt;br /&gt;
| Independent&lt;br /&gt;
| Implementation of LSL functions and other scripting tidbits.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:SeanDague|sdague]]&lt;br /&gt;
| Sean Dague&lt;br /&gt;
| Neas Bade&lt;br /&gt;
| &lt;br /&gt;
| -5&lt;br /&gt;
| IBM&lt;br /&gt;
| Database, Linux, Testing, Misc&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| [[User:MingChen|MingChen]]&lt;br /&gt;
| Mike/Michael Ortman&lt;br /&gt;
| Ming Chen&lt;br /&gt;
| &lt;br /&gt;
| -6 (-5 in Summer)&lt;br /&gt;
| DeepThink Pty Ltd&lt;br /&gt;
| Estate/Parcel Support/Modules/Keeping things all neat and tidy.&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Tedd|Tedd]]&lt;br /&gt;
| Tedd Hansen&lt;br /&gt;
| Tedd Maa&lt;br /&gt;
| &lt;br /&gt;
| +1&lt;br /&gt;
| Tedd Hansen&lt;br /&gt;
| Programming/Scripting/Architecture&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Adjohn|adjohn]]&lt;br /&gt;
| Adam Johnson&lt;br /&gt;
| Zeuz Zenovka&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| +9&lt;br /&gt;
| [http://www.genkii.com Genkii]&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| [[User:Joha1|joha1]]&lt;br /&gt;
| Johan Berntsson&lt;br /&gt;
| Joppi Brandenburg&lt;br /&gt;
| &amp;lt;br&amp;gt;&lt;br /&gt;
| +9&lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
| Performance, packet handling/libSL&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Additional Developers/Testers/Contributors  ==&lt;br /&gt;
&lt;br /&gt;
These people have contributed and/or are contributing bug reports, patches, testing, and all sorts of other goodies to the project. &amp;lt;br&amp;gt; '''New comers please add yourself to bottom of the list!''' &amp;lt;br&amp;gt; &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! IRC Nick &lt;br /&gt;
! Name &lt;br /&gt;
! SL Avatar &lt;br /&gt;
! Other Grid &lt;br /&gt;
! Time Zone&amp;lt;br&amp;gt;(UTC) &lt;br /&gt;
! Org &lt;br /&gt;
! Areas of Interest&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nebadon|Nebadon]] &lt;br /&gt;
| Michael Cerquoni &lt;br /&gt;
| Nebadon Izumi &lt;br /&gt;
| Nebadon Izumi &lt;br /&gt;
| -7 Arizona &lt;br /&gt;
| Oni Kenkon Creations &lt;br /&gt;
| Building, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jtclark48|jclark4]] &lt;br /&gt;
| Jay Clark &lt;br /&gt;
| Jay Clarke &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Physics, Grid Host, AI, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:AdamStevenson|BigFootAg]] &lt;br /&gt;
| Adam Stevenson &lt;br /&gt;
| Adamus Petrov &lt;br /&gt;
| &lt;br /&gt;
| -6 &lt;br /&gt;
| Texas A&amp;amp;amp;M University &lt;br /&gt;
| AI, Skynet, Evolving Systems, Biology&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jeff1564|Jeff1564]] &lt;br /&gt;
| Jeff &lt;br /&gt;
| Potter Taurog &lt;br /&gt;
| Potter Taurog &lt;br /&gt;
| -8 &lt;br /&gt;
| http://myopengrid.com &lt;br /&gt;
| Building, Scripting, Testing&lt;br /&gt;
|-&lt;br /&gt;
| Rock_Vacirca &lt;br /&gt;
| Colin Withers &lt;br /&gt;
| Rock Vacirca &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +1 &lt;br /&gt;
| http://rock-vacirca.blogspot.com &lt;br /&gt;
| Testing, building, scripting, maintaining an opensim blog.&lt;br /&gt;
|-&lt;br /&gt;
| simsim &lt;br /&gt;
| caocao &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +9 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Testing whole functions of OpenSim system,working with OpenSim-Engine,reporting on OpenSim&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Vicero Lambert|Vicero Lambert]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Magi|Magi]] &lt;br /&gt;
| Andy Agnew &lt;br /&gt;
| Magi Merlin &lt;br /&gt;
| &lt;br /&gt;
| +10 &lt;br /&gt;
| Spun Pty Ltd &lt;br /&gt;
| 3D Web Integration, Database stuff and playing with the odds and ends box.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:ClarkZone|ClarkZone]] &lt;br /&gt;
| Troy Admin(@ClarkZone) &lt;br /&gt;
| Troy Childs &lt;br /&gt;
| Troy Admin (ClarkZone) &lt;br /&gt;
| -5 &lt;br /&gt;
| Http://clarkzone.dyndns.org &lt;br /&gt;
| Tester and Grid Host&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Aiaustin|aiaustin]] &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| Ai Austin &lt;br /&gt;
| +0 &lt;br /&gt;
| AIAI, Virtual University of Edinburgh&amp;lt;br&amp;gt;http://www.aiai.ed.ac.uk/~ai/&amp;lt;br&amp;gt;http://vue.ed.ac.uk/openvue/ &lt;br /&gt;
| Windows tests&amp;lt;br&amp;gt;Content testing&amp;lt;br&amp;gt;Use of multiple VWs&lt;br /&gt;
|-&lt;br /&gt;
| Marc Manders &lt;br /&gt;
| Marc Manders &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| +6 &lt;br /&gt;
| marcmanders@gmail.com &lt;br /&gt;
| Creative features&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Balthazar|balthazar]] &lt;br /&gt;
| Trevor Brooks &lt;br /&gt;
| Balthazar Sin &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| None &lt;br /&gt;
| Terrains, testing and some small coding tasks&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Jimbo2120|jimbo2120]] &lt;br /&gt;
| Michael Osias &lt;br /&gt;
| Illuminous Beltran &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Grid, AI, Skynet, coding and testing&lt;br /&gt;
|-&lt;br /&gt;
| ZeroPoint &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Guilderoy&amp;amp;nbsp;Dench &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Programming/Database&lt;br /&gt;
|-&lt;br /&gt;
| [[User:DerekTang|DerekTang]] &lt;br /&gt;
| Derek Tang &lt;br /&gt;
| Derek Timeless &lt;br /&gt;
| Derek Tang (ChineseGrid) &lt;br /&gt;
| +8 &lt;br /&gt;
| http://ChineseGrid.net &lt;br /&gt;
| Running a public WINDOWS sim for testing, Docs, Helping Chinese users to enjoy OpenSim; building Chinese OpenSim communities. In construction...&lt;br /&gt;
|-&lt;br /&gt;
| [[User:TayB|TayB]] &lt;br /&gt;
| Earl Balai &lt;br /&gt;
| Taylor Dae &lt;br /&gt;
| &lt;br /&gt;
| -10 &lt;br /&gt;
| WhynGrid &lt;br /&gt;
| Grid Host,Networking,Contributions &amp;amp;amp; Testing.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:JamieDav|JamieDav]] &lt;br /&gt;
| Jamie David &lt;br /&gt;
| Jamie David &lt;br /&gt;
| &lt;br /&gt;
| +7 &lt;br /&gt;
| Forum &lt;br /&gt;
| Grid, Sim, Avitar, Functionality&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Krtaylor|Krtaylor]] &lt;br /&gt;
| Kurt Taylor &lt;br /&gt;
| Kurt Stringer &lt;br /&gt;
| &lt;br /&gt;
| -6 &lt;br /&gt;
| IBM &lt;br /&gt;
| Grid, Networking, Monitoring, Scripting, Inventory, Testing&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nink|Nink]] &lt;br /&gt;
| Peter Finn &lt;br /&gt;
| Nink Noonan &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| IBM &lt;br /&gt;
| Disruptive Influence.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Bruce|Bruce]] &lt;br /&gt;
| Bruce Meerson &lt;br /&gt;
| Bruce Meerson &lt;br /&gt;
| &lt;br /&gt;
| +8 &lt;br /&gt;
| HiPiHi &lt;br /&gt;
| Watching.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Darb|DarbD]] &lt;br /&gt;
| Brian B. Quinn &lt;br /&gt;
| Darb Dabney &lt;br /&gt;
| regions&amp;lt;br&amp;gt;near Marin &lt;br /&gt;
| PST/SLT (-7 or -8) &lt;br /&gt;
| County of Marin, California&amp;lt;br&amp;gt; http://blog.3dmap.me &lt;br /&gt;
| LiDAR-based sculpties, real-world terrain, &amp;lt;br&amp;gt;pursuit of civic paraverses, virtual Emergency Operations Centers&lt;br /&gt;
|-&lt;br /&gt;
| [[CharlieO]] &lt;br /&gt;
| Dan &lt;br /&gt;
| Charlie Omega &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Mild coding/tweaking/simple feature adds, Stress testing/break stuff, Testing limits of existing code. Making sure [[LSL Status]] is up to date&lt;br /&gt;
|-&lt;br /&gt;
| oobscure &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Opensource Obscure &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.opensim.it &lt;br /&gt;
| Running a public Linux sim for testing, Docs, Helping italian users, Building opensim communities, Watching&lt;br /&gt;
|-&lt;br /&gt;
| pitman &lt;br /&gt;
| Mike Pitman &lt;br /&gt;
| Rez Tone &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| IBM &lt;br /&gt;
| Scientific visualization schemes, virt world product design, persistant workspaces, virt world based big biz&lt;br /&gt;
|-&lt;br /&gt;
| Shenlei &lt;br /&gt;
| Shenlei Winkler &lt;br /&gt;
| Shenlei Flasheart, Shenlei Winkler &lt;br /&gt;
| &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Fashion Research Institute &lt;br /&gt;
| Product Design and Development, Apparel industry, and o yes, I wrote the book&amp;amp;nbsp;;)&lt;br /&gt;
|-&lt;br /&gt;
| cmu &lt;br /&gt;
| Christopher Mumme &lt;br /&gt;
| Snook Destiny &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.cmu-develop.de/ and research group &amp;quot;Collaboration Systems and CSCW&amp;quot; at Clausthal University of Technology &lt;br /&gt;
| Testing OpenSim, working with OpenSim-Engine, reporting on OpenSim&lt;br /&gt;
|-&lt;br /&gt;
| [[Silpol]] &lt;br /&gt;
| Andriy Tymchenko &lt;br /&gt;
| Andy Tir &lt;br /&gt;
| &lt;br /&gt;
| EET (+2/3) &lt;br /&gt;
| http://silpol.blogspot.com/ (also visible at Nokia) &lt;br /&gt;
| Highly uncoordinated mess with elements of palace games, under-table diplomacy, rebellion, coup d'état and mutiny. optionally pirate&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Grumly|Grumly]] &lt;br /&gt;
| &lt;br /&gt;
| Forest Klaar &lt;br /&gt;
| Grumly TheBear &lt;br /&gt;
| GMT+1 &lt;br /&gt;
| .NET MCAD Dev/Arch/Trainer http://www.devoteam.com &lt;br /&gt;
| Trying to get into OpenSim code for now. Particularly interrested in data persistence. blog (Hello, Avatar!): http://lslblog.free.fr&lt;br /&gt;
|-&lt;br /&gt;
| [[DaTwitch]] &lt;br /&gt;
| James G. Stallings II &lt;br /&gt;
| &amp;lt;br&amp;gt;Lazarus Longstaff &lt;br /&gt;
| Hiro Protagonist (OSGrid) &lt;br /&gt;
| -5 &lt;br /&gt;
| House Husband &lt;br /&gt;
| OSGrid Region owner, OSGrid Operator,&amp;lt;br&amp;gt;Forum Admin, sometime wiki editor&lt;br /&gt;
|-&lt;br /&gt;
| gryc &lt;br /&gt;
| Gryc Ueusp &lt;br /&gt;
| Gryc Uriza &lt;br /&gt;
| Gryc Uriza(OSGrid) &lt;br /&gt;
| -6 &lt;br /&gt;
| &lt;br /&gt;
| PHP scripting, web interfaces, interconnectivity, cross-platformedness&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Phrearch|Phrearch]] &lt;br /&gt;
| Jeroen van Veen &lt;br /&gt;
| Phrearch Miles &lt;br /&gt;
| Phrearch Miles(OSGrid) &lt;br /&gt;
| Amsterdam/Paris &lt;br /&gt;
| &lt;br /&gt;
| HWIOS, WiXTD, Wikidoc, Moo, User interfaces&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Burnman|Burnman]] &lt;br /&gt;
| Allen &lt;br /&gt;
| Burnman Bedlam &lt;br /&gt;
| &lt;br /&gt;
| Boston, USA &lt;br /&gt;
| &lt;br /&gt;
| Testing, testing, and more testing! Getting familiar with the source, interested in all aspects of the project.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Krisbfunk|krisbfunk]] &lt;br /&gt;
| Kris Bulman &lt;br /&gt;
| Krisbfunk Vought &lt;br /&gt;
| Krisbfunk Nocturnal(OSGrid) &lt;br /&gt;
| PE, Canada (-4) &lt;br /&gt;
| Edactive Technologies&amp;lt;br&amp;gt;NocturnalEye Productions&amp;lt;br&amp;gt;UPEI &lt;br /&gt;
| Currently: Testing, bug reports, wiki updating, building on OSGrid&lt;br /&gt;
|-&lt;br /&gt;
| [[User:HashBox|HashBox]] &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Sibariel Darkstone &lt;br /&gt;
| Sibariel Darkstone (OSGrid) &lt;br /&gt;
| New Zealand (+12) &lt;br /&gt;
| &lt;br /&gt;
| Testing, bug reports, and updating the wiki.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Kinoc|Kinoc]] &lt;br /&gt;
| Kino Coursey &lt;br /&gt;
| Daxxon Jaxxon &lt;br /&gt;
| Daxxon Kinoc (OSgrid) &lt;br /&gt;
| -6 &lt;br /&gt;
| Daxtron Laboratories &amp;lt;br&amp;gt; http://www.daxtron.com&amp;lt;br&amp;gt; University of North Texas &lt;br /&gt;
| AI, Semantic web, Ontologies, Natural Laanguage Processing, Cyc, Bots, NPC&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Trapuh|trapuh]] &lt;br /&gt;
| Pedro Ribeiro &lt;br /&gt;
| Vaiten Forder &lt;br /&gt;
| &lt;br /&gt;
| GMT &lt;br /&gt;
| University Student, Escola Superior de Educação de Viseu, Portugal &lt;br /&gt;
| Testing, eventual bug reports and wiki. Music, web/digital arts and php+sql.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:SonicViz|SonicViz]] &lt;br /&gt;
| Paul Cohen &lt;br /&gt;
| Komuso Tokugawa &lt;br /&gt;
| &lt;br /&gt;
| +9 &lt;br /&gt;
| Http://sonicviz.com &lt;br /&gt;
| Audio/Music, Interactive Music, Control Protocols, Interfaces, VisualFX, Procedural animation/Generative systems + testing and general dev&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mokele|mokele]] &lt;br /&gt;
| Scott Norman &lt;br /&gt;
| Mokelembembe Mokeev &lt;br /&gt;
| &lt;br /&gt;
| -8 (Southern California) &lt;br /&gt;
| Web Developer (PHP and MySQL) &lt;br /&gt;
| Interested in seeing running on PowerPC Macs which it is. So, when I can, I'll compile and test on PowerPC Mac (PowerBook G4) and submit reports and then update the wiki if need on installing on Mac. Also have a Ubuntu 7.10 server that I can do testing on too.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Devalnor|devalnor]] &lt;br /&gt;
| Devalnor &lt;br /&gt;
| M. Watkin &lt;br /&gt;
| &lt;br /&gt;
| +1 (Belgium) &lt;br /&gt;
| &lt;br /&gt;
| Small Patch code, bug reports, and updating the wiki.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Ezekiel|Ezekiel]] &lt;br /&gt;
| Ezekiel &lt;br /&gt;
| Ezekiel Zabelin &lt;br /&gt;
| &lt;br /&gt;
| +1 &lt;br /&gt;
| http://www.yosims.com &lt;br /&gt;
| Concepts, business aspects of virtual worlds - web developer (PHP, MySQL, Javascript, LSL)&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Buggmaster|Buggmaster]] &lt;br /&gt;
| Mike D &lt;br /&gt;
| Bug Master &lt;br /&gt;
| None &lt;br /&gt;
| -8 &lt;br /&gt;
| http://www.adultmetaverse.com &lt;br /&gt;
| Grid, Data/Web PHP/PERL/MySQL&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Nixnerd|nixnerd]] &lt;br /&gt;
| &lt;br /&gt;
| Dangerously Moody &lt;br /&gt;
| None &lt;br /&gt;
| GMT &lt;br /&gt;
| http://www.integratedtechnologies.eu &lt;br /&gt;
| Cross Platform Testing, Feedback, Bug Reporting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MoHax|mohax]] &lt;br /&gt;
| Mo Hax &lt;br /&gt;
| Mo Hax &lt;br /&gt;
| &lt;br /&gt;
| -5 Eastern &lt;br /&gt;
| IBM &lt;br /&gt;
| Testing, Feedback, Content Contributions, Bug Reporting, Documenting, Development&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Webmage|webmage]] &lt;br /&gt;
| webmage &lt;br /&gt;
| Leyla Masala &lt;br /&gt;
| Web Mage &lt;br /&gt;
| +1 &lt;br /&gt;
| IBM &lt;br /&gt;
| Testing, terrain&lt;br /&gt;
|-&lt;br /&gt;
| [[User:NLStitch|NLStitch]] &lt;br /&gt;
| Marijn Oosterveld &lt;br /&gt;
| Stitch Seale &lt;br /&gt;
| NYA &lt;br /&gt;
| GMT +1 Amsterdam &lt;br /&gt;
| Twingate Systems (http://www.twingate.nl)&amp;lt;br&amp;gt;HanzeHogeschool Groningen, Netherlands &lt;br /&gt;
| Programming, Photography, AI&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Ideia Boa|Ideia Boa]] &lt;br /&gt;
| Joao Lopes &lt;br /&gt;
| Ideia Boa &lt;br /&gt;
| Ideia Boa or Boa Ideia in some grids &lt;br /&gt;
| GTM+1 Stockholm/Sweden &lt;br /&gt;
| WorldSimTERRA - Virtual World that speaks Portuguese too&amp;lt;br&amp;gt;http://www.worldsimterra.com &lt;br /&gt;
| Testing and more testing! Updating the original wiki and translating the OpenSim Wiki into Portuguese and reporting on OpenSim&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Lulurun|lulurun]] &lt;br /&gt;
| liu &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| +9 &lt;br /&gt;
| 3Di Inc, Japan &amp;lt;br&amp;gt;http://www.3di.jp &lt;br /&gt;
| Patches, openid, server performance, UGAI&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Carlosroundel|Carlosrounde]] &lt;br /&gt;
| Carlosroundel &lt;br /&gt;
| Carlos Roundel &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Cyberlandia Italy&amp;lt;br&amp;gt;http://www.cyberlandia.net &lt;br /&gt;
| Grid, programmer, database, tester&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mikebert|Mikebert]] &lt;br /&gt;
| Michael Strunck &lt;br /&gt;
| Mikebert Miles &lt;br /&gt;
| Mikebert M34 &lt;br /&gt;
| +1 &lt;br /&gt;
| OpenSIM Wiki, Germany&amp;lt;br&amp;gt;http://www.opensim.de &lt;br /&gt;
| German Wiki, Translater, Server Performance (Linux/Windows), Tester, Feedback, Bug Reporting, Server-Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Fly-man-|Fly-Man-]] &lt;br /&gt;
| Laurence &lt;br /&gt;
| &lt;br /&gt;
| Fly Man &lt;br /&gt;
| +1 &lt;br /&gt;
| &lt;br /&gt;
| Testing, OpenSimSearch, OpenSimProfile&lt;br /&gt;
|-&lt;br /&gt;
| Taoki &lt;br /&gt;
| Mircea Kitsune / Taoki Vixen &lt;br /&gt;
| Mircea Kitsune (OSGrid) / Mircea Lobo (LL grid) &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| GMT +2 &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| Usually testing and bug reporting but I also make smaller patches where I know what to do.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Patnad|Patnad]] &lt;br /&gt;
| Patrick &lt;br /&gt;
| Patnad Babii &lt;br /&gt;
| Patnad Babii (OSGrid) &lt;br /&gt;
| GMT -5 &lt;br /&gt;
| RezzMe Technologies&amp;lt;br&amp;gt;http://www.rezzme.com &lt;br /&gt;
| Bug testing and reporting, I code C# and have submitted a few patches&lt;br /&gt;
|-&lt;br /&gt;
| [[User:^DarkMan|^DarkMan]] &lt;br /&gt;
| Brian Adair &lt;br /&gt;
| Patrick Ouachita &lt;br /&gt;
| Brian Adair &amp;amp;#124; Patrick Meta &lt;br /&gt;
| -6 CST &lt;br /&gt;
| RealMetaLife &amp;amp;#124; B&amp;amp;amp;H Networking &lt;br /&gt;
| Building, Scripting, Testing, etc.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Tlaukkan|Tommi Laukkanen]] &lt;br /&gt;
| Tommi Laukkanen &lt;br /&gt;
| &amp;amp;nbsp; &lt;br /&gt;
| Tommi Laukkanen &lt;br /&gt;
| +2 GMT &lt;br /&gt;
| http://www.bubblecloud.org &lt;br /&gt;
| Protocols ([http://www.bubblecloud.org MXP]), NHibernate, Scrip API, Map Generation, Bug Fixes, Grid Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mystical|Mystical]] &lt;br /&gt;
| Kevin Tweedy &lt;br /&gt;
| Mystical Demina &lt;br /&gt;
| Mystical Demina &lt;br /&gt;
| -5 &lt;br /&gt;
| Extreme Reality Grid&amp;lt;br&amp;gt;http://www.XRGrid.com &lt;br /&gt;
| Windows Communication Framework, Windows Workflow,Entity Framework, MSSQL&amp;lt;br&amp;gt;Enhancements,Commerce, Content,DotNetNuke based portal, development services&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Godfrey|Godfrey]] &lt;br /&gt;
| Jeff Lee &lt;br /&gt;
| Warin Cascabel &lt;br /&gt;
| &lt;br /&gt;
| -5 (EST5EDT) &lt;br /&gt;
| &lt;br /&gt;
| Testing, minor bugfixes. Scripting, building, animating&lt;br /&gt;
|-&lt;br /&gt;
| Jamenai &lt;br /&gt;
| Christopher Händler &lt;br /&gt;
| Jamenai Luik &lt;br /&gt;
| Jamenai Luik &lt;br /&gt;
| +1 &lt;br /&gt;
| Playneko Grid &amp;amp;#124; XIMDEX Jamenai&amp;lt;br&amp;gt;http://www.playneko.de&amp;lt;br&amp;gt;http://www.ximdex.de &lt;br /&gt;
| Performance,Bug Reporting, Hosting, Grid-Owner,(PHP, MySQL, Perl, JavaScript, LSL)&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Bikcmp|bikcmp]] &lt;br /&gt;
| Jason &lt;br /&gt;
| Jake1500 Allen &lt;br /&gt;
| Jason Helios (The Helios Grid) &lt;br /&gt;
| EST &lt;br /&gt;
| Blue Software &lt;br /&gt;
| Search, groups, land, and currency&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Mark.malewski|Slipaway]] &lt;br /&gt;
| Mark Malewski &lt;br /&gt;
| Chris Rock &lt;br /&gt;
| &lt;br /&gt;
| -6 (-5 during summer - CDT) &lt;br /&gt;
| NexTECH / Joopla &lt;br /&gt;
| Web development &amp;amp;amp; systems integration, terrain, WIKI documentation, tutorials, testing, bug reporting and feedback.&lt;br /&gt;
|-&lt;br /&gt;
| barakademi &lt;br /&gt;
| Steve Topp &lt;br /&gt;
| barakademi Barzane &lt;br /&gt;
| same avi on baragrid OSgrid Grid4us sciencesim &lt;br /&gt;
| utc+1 (CET) paris &lt;br /&gt;
| http://xbot-sl.barakademi.org http://vps.barakademi.org/oswi http://vps.barakademi.org/oswi/loginscreen.php &lt;br /&gt;
| Music LiveMusic MetaverseMusic Opensim Libomv Mono-2.4 Linux (suse,debian,ubuntu) Admin Scripting Automating Development Intergration php mysql bash nant +++&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Robert d|robert_d]] &lt;br /&gt;
| Robert Dzikowski &lt;br /&gt;
| &lt;br /&gt;
| OSGrid: robert_d 13 &lt;br /&gt;
| UTC+1 &lt;br /&gt;
| [http://blog.rd-it.net http://blog.rd-it.net] &lt;br /&gt;
| Region Modules, Tutorials&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Snoopy2|Snoopy2]] &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
| Snoopy Pfeffer &lt;br /&gt;
| &lt;br /&gt;
| [http://www.3dmetaverse.com/ http://www.3dmetaverse.com/] &lt;br /&gt;
| Region Hosting, Open Metaverse, 3D Web, server and viewers, service management&lt;br /&gt;
|-&lt;br /&gt;
| john_ &lt;br /&gt;
| John&amp;amp;nbsp;Moyer &lt;br /&gt;
| VAJohn&amp;amp;nbsp;GeekSquad or&amp;amp;nbsp;Matthew&amp;amp;nbsp;Kendal &lt;br /&gt;
| &lt;br /&gt;
| -5 &lt;br /&gt;
| Best&amp;amp;nbsp;Buy/Geek&amp;amp;nbsp;Squad &lt;br /&gt;
| Tester&lt;br /&gt;
|-&lt;br /&gt;
| [[User:W!cKeD|_WicKeD]] &lt;br /&gt;
| Maik &lt;br /&gt;
| Maik Galaxy &lt;br /&gt;
| El Diablo &lt;br /&gt;
| +1 Germany &lt;br /&gt;
| Creatio Inc. / [http://www.OpenSimGerman.us/ OpenSimGerman.us] &lt;br /&gt;
| German Support, Translator, Building, Scripting, Testing, Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Stevie Wakowski|Stevie Wakowksi]] &lt;br /&gt;
| Steve Roberts &lt;br /&gt;
| Stevie Wakowski &lt;br /&gt;
| &lt;br /&gt;
| +10 Australia &lt;br /&gt;
| IBM &lt;br /&gt;
| OpenSim builds, Linux, Modrex, bug reporting, evangalist for OpenSim in business applications.&lt;br /&gt;
|-&lt;br /&gt;
| Revolution &lt;br /&gt;
| Matthew &lt;br /&gt;
| Revolution Smythe &lt;br /&gt;
| Revolution Smythe &lt;br /&gt;
| -6 Central USA &lt;br /&gt;
| None &lt;br /&gt;
| Script engine, physics engine, general odd bugs, interesting and odd things&lt;br /&gt;
|-&lt;br /&gt;
| [[User:ClemsonGS|clemsonGS]] &lt;br /&gt;
| Brian Cass &lt;br /&gt;
| BC Sands &lt;br /&gt;
| Brian Cass (VWC Grid) &lt;br /&gt;
| -5 &lt;br /&gt;
| http://www.cvwconline.org/ &lt;br /&gt;
| Developing virtual worlds for use in higher education&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| AlexRa &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Independent &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Robert Adams &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Looking Glass Viewer &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Mikko Pallari &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Realxtend &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| StrawberryFride &lt;br /&gt;
| Chris Hart &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| ReactionGrid &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| [[User:RemedyTomm|RemedyTomm]] &lt;br /&gt;
| Tom Grimshaw &lt;br /&gt;
| Tomm Remedy &lt;br /&gt;
| KGrid: Casper Warden OSGrid: Tomm Remedy &lt;br /&gt;
| UTC+0 (BST) &lt;br /&gt;
| Remedy Communications &lt;br /&gt;
| Texture pipeline, Groups, ObjectUpdates&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| Rob Smart &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| IBM &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| MicheilMerlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| Micheil Merlin &lt;br /&gt;
| -6 &lt;br /&gt;
| Independent &amp;lt;br&amp;gt; [http://www.iliveisl.com/ http://www.iliveisl.com/] &lt;br /&gt;
| Scripting, patches, and testcases&lt;br /&gt;
|-&lt;br /&gt;
| Pato Donald &lt;br /&gt;
| Pato Donald &lt;br /&gt;
| Morgam Biedermann &lt;br /&gt;
| Pato Donald &lt;br /&gt;
| -3 &lt;br /&gt;
| Independent [http://www.matheusmk3.co.cc/ http://www.matheusmk3.co.cc/ &lt;br /&gt;
| Groups, Scripts, Physics, Communication, Integration&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Apelles|Apelles]] &lt;br /&gt;
| Apelles Noel &lt;br /&gt;
| Sungo Inshan &lt;br /&gt;
| amrssc - soon &lt;br /&gt;
| -5 Eastern &lt;br /&gt;
| http://amrssc.com &lt;br /&gt;
| Developing Virtual Worlds For Use In Education - Learning - Inventor++&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Sera Marx &lt;br /&gt;
| Darkfire Soulstar &lt;br /&gt;
| &lt;br /&gt;
| +12 &lt;br /&gt;
| Radiance promotions &lt;br /&gt;
| Grid Host, Commissioner. ~ Anyone looking for work related to the development of Opensimulator or Viewers please contact me. Any work undertaken for me will be returned to Opensimulator unless made strictly for my Grid&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Doug Osborn &lt;br /&gt;
| &lt;br /&gt;
| Doug Osborn @ScienceSim &lt;br /&gt;
| PST/SLT (-7 or -8) &lt;br /&gt;
| CTO, F.R.I. &lt;br /&gt;
| Performance testing, scripting, high prim count builds, bots, and running in-world conferences.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Hallow Palmer|Hallow Palmer]] &lt;br /&gt;
| Markus &lt;br /&gt;
| Hallow Palmer &lt;br /&gt;
| &amp;lt;br&amp;gt; &lt;br /&gt;
| +1 &lt;br /&gt;
| Grid4Us&amp;lt;br&amp;gt;http://www.grid4us.net &lt;br /&gt;
| Server Performance (Windows), Tester, Feedback, Business concepts,Bug Reporting, Server-Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:LenaVanilli|LenaVanilli]] &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| Lena Vanilli &lt;br /&gt;
| +1 Germany &lt;br /&gt;
| [http://www.hypergrid.org http://www.hypergrid.org] &lt;br /&gt;
| Grid-Management, Testing Testing Testing, Region Hosting&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Aduffy70|aduffy70]] &lt;br /&gt;
| Aaron Duffy &lt;br /&gt;
| Aeran Stipe &lt;br /&gt;
| Aaron Duffy @ScienceSim &lt;br /&gt;
| -7 &lt;br /&gt;
| USU &lt;br /&gt;
| Scientific visualization &amp;amp;amp; education, Region modules, Heavily scripted regions&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| Erich Bremer &lt;br /&gt;
| Erich Bremer &lt;br /&gt;
| &lt;br /&gt;
Erich Bremer@OSGrid &lt;br /&gt;
&lt;br /&gt;
| -5 &lt;br /&gt;
| http://www.ebremer.com &lt;br /&gt;
| Semantic Web, Data Visualization&lt;br /&gt;
|-&lt;br /&gt;
| [[User:MarkIdcas|MarkIdcas]] &lt;br /&gt;
| Mark Bannon&lt;br /&gt;
| Mark IDCAS &lt;br /&gt;
| 3D Grid Association, AtMeeting and IDCAS. &lt;br /&gt;
| GMT&lt;br /&gt;
| [http://www.atmeeting.com http://www.atmeeting.com] &lt;br /&gt;
| Grid Management &amp;amp; systems integration. Scripting. WIKI documentation, tutorials, bug reporting and feedback.&lt;br /&gt;
|-&lt;br /&gt;
| [[User:Allquixotic|allquixotic]] &lt;br /&gt;
| Sean McNamara&lt;br /&gt;
| Tiyuk Quellmalz&lt;br /&gt;
| OSG: Tiyuk Quellmalz&lt;br /&gt;
| -5&lt;br /&gt;
| None &lt;br /&gt;
| Bugfixing; networking; performance; data integrity; LSL; auto-backup; null DB (eventual consistency).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
[[Category:Main]] [[Category:Development]] [[Category:Tech_Reference]] [[Category:Help]]&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Build_Instructions</id>
		<title>Build Instructions</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Build_Instructions"/>
				<updated>2011-05-12T11:43:35Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
This page covers building OpenSim from source code on multiple platforms.  Please help us keep this page up to date as the project progresses. If you just want to run OpenSimulator, [[Download]] and [[Dependencies|run]] the binary build instead. In the most cases, you should be fine with binaries.&lt;br /&gt;
&lt;br /&gt;
==Download OpenSim ==&lt;br /&gt;
&lt;br /&gt;
Check out the [[Download]] page for instructions on obtaining an OpenSim source release.&lt;br /&gt;
&lt;br /&gt;
==General Notes==&lt;br /&gt;
&lt;br /&gt;
Although this page is long, building is generally quite simple.  See the BUILDING.txt file in the distribution itself for simplified instructions. This page discusses what you need to do before actual building. &lt;br /&gt;
&lt;br /&gt;
===Setting Files===&lt;br /&gt;
&lt;br /&gt;
Unlike binary distributions, OpenSimulator source distributions are delivered without default configuration files, i.e, '''OpenSim.ini''' and '''StandaloneCommon.ini'''. Therefore you'll need to create them by yourself. Look carefully at [[Configuration]] page not to suffer from the errors like ''&amp;quot;APPLICATION EXCEPTION DETECTED: System.UnhandledExceptionEventArgs Exception: System.Exception: Configuration file is missing the [SimulationDataStore] section&amp;quot;''(= missing &amp;quot;OpenSim.ini&amp;quot;) or ''&amp;quot;Error loading plugin from OpenSim.Services.FriendsService.dll, exception System.Exception: No StorageProvider configured&amp;quot;''(= missing &amp;quot;*Common.ini&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
===Crash Course on Linux===&lt;br /&gt;
&lt;br /&gt;
The easiest platform to get running on the Linux side is Ubuntu 32bit.  This is what most of the developers running Linux use.  If you are looking for the quick path, start [[#Ubuntu|there]].&lt;br /&gt;
&lt;br /&gt;
'''Many distros (including Ubuntu) ship with only the &amp;quot;mono-runtime&amp;quot; package installed, however you need to install &amp;quot;mono-complete&amp;quot; for some OpenSimulator features such as LSL script commands.'''&lt;br /&gt;
&lt;br /&gt;
== MS Windows  ==&lt;br /&gt;
&lt;br /&gt;
OpenSim requires either the [http://msdn.microsoft.com/en-us/netframework/cc378097 .Net Framework version 3.5], or [http://www.go-mono.com/mono-downloads/download.html Mono 2.4.3 or newer]. &lt;br /&gt;
&lt;br /&gt;
=== Supported Compilers === &lt;br /&gt;
* Visual Studio 2010&lt;br /&gt;
* Visual Studio 2008&lt;br /&gt;
:Any editions should work fine, including free [http://www.microsoft.com/express/downloads/ Microsoft Visual C# Express Edition]. Note that OpenSimulator is written in C#, not C++.&lt;br /&gt;
:Note that Visual Studio 2005 or earlier are no longer supported([http://www.mail-archive.com/opensim-dev@lists.berlios.de/msg02674.html opensim-dev proposal], [http://www.mail-archive.com/opensim-dev@lists.berlios.de/msg02673.html opensim-dev approved]).&lt;br /&gt;
*[http://www.go-mono.com/mono-downloads/download.html Mono for Windows]&lt;br /&gt;
&lt;br /&gt;
=== Compiling in IDE ===&lt;br /&gt;
# Run &amp;quot;runprebuild.bat&amp;quot;(if 2008) or &amp;quot;runprebuild2010.bat&amp;quot;(if 2010).&lt;br /&gt;
# Open the resulting &amp;quot;OpenSim.sln&amp;quot; in any Visual Studio IDE.&lt;br /&gt;
# Build -&amp;gt; Build Solution.&lt;br /&gt;
&lt;br /&gt;
=== Compiling in Command Prompt ===&lt;br /&gt;
# Run &amp;quot;runprebuild.bat&amp;quot;.&lt;br /&gt;
# Run the resulting &amp;quot;compile.bat&amp;quot; file or run &amp;quot;nant&amp;quot;. This will build the executable using MSBuild(the former) or nant(the latter).&lt;br /&gt;
&lt;br /&gt;
=== Additional Notes===&lt;br /&gt;
&lt;br /&gt;
* It is possible to develop on Windows Vista 64 bits with the following tweaks: &lt;br /&gt;
#Select OpenSim project properties from solution and choose platform to be x86. Rebuild solution. &lt;br /&gt;
#Select OpenSim.exe properties under solution bin folder and choose windows xp sp 2 compatibility mode + run as administrator.&lt;br /&gt;
&lt;br /&gt;
*For those that use a Cygwin shell, you may need to fix DLLs permissions issue by typing &amp;quot;&amp;lt;tt&amp;gt;chmod 755 *.dll *.exe&amp;lt;/tt&amp;gt;&amp;quot; in the &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; directory.&lt;br /&gt;
&lt;br /&gt;
== Mac OS X ==&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10.5 and later, Intel ===&lt;br /&gt;
&lt;br /&gt;
Only you have to do is to get :&lt;br /&gt;
* Mono SDK from [http://www.go-mono.com/mono-downloads/download.html Mono Download Page]&lt;br /&gt;
* MonoDevelop package from [http://monodevelop.com/Download MonoDevelop Download Page] &lt;br /&gt;
and then install them - now no need to install XCode nor MacPort (you can still install mono dev libraries and nant with MacPort though).&lt;br /&gt;
&lt;br /&gt;
When you run nano to build OpenSimulator, it may show an error like &amp;quot;Unable to locate 'mono' module using pkg-config. Download the Mono &lt;br /&gt;
development packages&amp;quot;. I suspect XCode or MacPort causes something wrong (since it worked fine after I removed both), but I'm not sure. Anyway, insert a line into '''/usr/bin/nant''' script file to manage this problem :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Libraries/pkgconfig    # add this!&lt;br /&gt;
exec /Library/Frameworks/Mono.framework/Versions/2.10.2/bin/mono \&lt;br /&gt;
    /Library/Frameworks/Mono.framework/Versions/2.10.2/share/NAnt/bin/NAnt.exe &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can even compile and debug OpenSimulator with MonoDevelop IDE after running &amp;quot;runprebuild.sh&amp;quot;. Open the solution file(*.sln) with MonoDevelop IDE then select Build -&amp;gt; Build All from the menu.&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10.4/10.5 on PowerPC ===&lt;br /&gt;
OpenSim can run on PowerPC Macs (such as G4, G5). These instructions were tested on 10.5.8.  Note that two libraries must also be built from source. Caveat: the OpenSim app was only briefly tested in self-contained mode. There may well be issues with this build. Feel free to note any issues you find below (or in a new wiki page? discussion?). &lt;br /&gt;
&lt;br /&gt;
Unfortunately, the OpenSim version used here must be compiled on one version of Mono (2.6.7) and run on another (2.8.2). This means either upgrading Mono after the build, or having both versions installed and accessing the older version when you want to build. These instructions let you have both versions installed.&lt;br /&gt;
&lt;br /&gt;
* Install Xcode 3.1.4 Developer Tools from from http://developer.apple.com/. You must have a free Apple developer account to access the downloads. 3.1.4 was the last PowerPC Xcode.&lt;br /&gt;
&lt;br /&gt;
* (10.4 only) Install X11 from the Optional Install (or see if it's a Customize option when you install Xcode). 10.5 gets X11 by default (''from OS X or dev tools?'').&lt;br /&gt;
* Install Mono 2.6.7 PowerPC Framework from here: http://www.go-mono.com/mono-downloads/download.html (binary OS X Framework, no need to build from source)&lt;br /&gt;
* Then install Mono 2.8.2 PowerPC framework. For these instructions to work, you must first install 2.6.7, THEN 2.8.2. (The old framework is not deleted, but &amp;quot;Current&amp;quot; symlinks are updated).&lt;br /&gt;
* Download OpenSim 0.7.0.2 source tarball: http://dist.opensimulator.org/opensim-0.7.0.2-source.tar.gz Expand to a suitable folder for development and running.&lt;br /&gt;
** Feel free to try a newer version of OpenSim (the repository is on git now).&lt;br /&gt;
** If you used a newer OpenSim version, check BUILDING.txt for any changes to build instructions (we fall under &amp;quot;Linux&amp;quot;)&lt;br /&gt;
* Edit or create .profile or .bash_profile in your OS X home folder, with the following lines:&lt;br /&gt;
 # remember real PATH&lt;br /&gt;
 export OSIM_HACK_ORIG_PATH=$PATH&lt;br /&gt;
 &lt;br /&gt;
 # normal path for running OpenSim&lt;br /&gt;
 export PATH=$PATH:/Library/Frameworks/Mono.framework/Versions/Current/bin:/usr/local/mysql/bin&lt;br /&gt;
 &lt;br /&gt;
 # Just for nant:&lt;br /&gt;
 export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/Versions/2.6.7/lib/pkgconfig&lt;br /&gt;
 alias oldpath=&amp;quot;export PATH=$OSIM_HACK_ORIG_PATH:/Library/Frameworks/Mono.framework/Versions/2.6.7/bin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
* Open a new Terminal window, and cd to your uncompressed OpenSim source folder (shortcut: type &amp;quot;cd &amp;quot; then drag the folder to the Terminal window). The enter these commands:&lt;br /&gt;
 oldpath&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
* nant should take around 10 minutes to compile your OpenSim. If you get through that without errors, you're halfway there! (I did get 234 warnings).&lt;br /&gt;
* *Important* Before we forget, open a new Terminal window (necessary to avoid the effects of &amp;quot;oldpath&amp;quot;).&lt;br /&gt;
* Now we need PowerPC versions of two libraries. Build each one and replace the compiled .dylib files in the opensim/bin folder. &lt;br /&gt;
** libode.dylib http://cdnetworks-us-1.dl.sourceforge.net/project/opende/ODE/0.11.1/ode-0.11.1.zip&lt;br /&gt;
** libopenjpeg-dotnet-2.1.3.0-dotnet-1.dylib (checked out with svn:)&lt;br /&gt;
 svn co http://libopenmetaverse.googlecode.com/svn/libopenmetaverse/trunk/openjpeg-dotnet libopenmetaverse-read-only&lt;br /&gt;
 cd libopenmetaverse-read-only&lt;br /&gt;
** To build, remove the Makefile file, which is for Linux, and rename Makefile.osx to just Makefile, then give the command: make )&lt;br /&gt;
** Remove the other versions of the two libraries (similar names, different extensions, like &amp;quot;libode-x86_64.so&amp;quot;. Two libode's and three libopenjpeg's).&lt;br /&gt;
* Configure your sim: Copy OpenSim.ini.example to OpenSim.ini and customize it per its comments.&lt;br /&gt;
* Likewise copy and customize StandaloneCommon.ini in bin/config-include&lt;br /&gt;
* Note that the comments say that the current SQLite plugin doesn't work on OS X. Either solve that, or install MySQL, which requires no compiling and is relatively easy to set up:&lt;br /&gt;
** From http://downloads.mysql.com/archives.php?p=mysql-5.1&amp;amp;v=5.1.40, download MySQL 5.1.40 for 10.5 PowerPC (installer, not 64-bit) &lt;br /&gt;
** Run the installer. (which installs to /usr/local)&lt;br /&gt;
** Install MySQL.prefPane into System Preferences by double-clicking it.&lt;br /&gt;
** Open the pref pane and start MySQL.&lt;br /&gt;
** (Optional:) For unattended startup, install MySQLStartupItem (doesn't always work for me).&lt;br /&gt;
** (Recommended:) In Terminal, do the one-time setup of MySQL with this command: mysql_secure_installation&lt;br /&gt;
** In MySQL, create the opensim user per the comments in OpenSim.ini. Give it all the create privileges.&lt;br /&gt;
*** Since this is a Mac, you could use Sequel Pro (donationware) to do that in a nice GUI. Standard connection, host: 127.0.0.1 (if on the same Mac)&lt;br /&gt;
* You're ready to run OpenSim. In that new Terminal window, cd to your OpenSim-source/bin folder.&lt;br /&gt;
 mono OpenSim.exe&lt;br /&gt;
* If all is well, you will be prompted &amp;quot;New region name []: &amp;quot;&lt;br /&gt;
* Turn to &amp;quot;Running OpenSim for the first time&amp;quot; on wiki page [[Configuration]]&lt;br /&gt;
* When fully up and running, the prompt is &amp;quot;Region (&amp;lt;region-name&amp;gt;) #&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
For Ubuntu users on older distributions (7.10, 8.04, 9.10 etc.) '''you need''' to upgrade your version of mono to at least 2.4.3. For anyone who needs to upgrade their Mono, see [[Update Mono on Ubuntu]].&lt;br /&gt;
&lt;br /&gt;
Ubuntu Karmic (9.10) includes mono 2.4.2.3 packages.&lt;br /&gt;
&lt;br /&gt;
Ubuntu Lucid (10.04) includes mono 2.4.4 packages.&lt;br /&gt;
&lt;br /&gt;
Ubuntu Maverick (10.10) includes mono 2.6.7 packages.&lt;br /&gt;
&lt;br /&gt;
Ubuntu Natty (11.04) includes mono 2.6.7 packages.&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 10.04 and later ===&lt;br /&gt;
&lt;br /&gt;
In this version, one only needs to install mono-complete - this will pull down all the other required packages as dependencies. Thus, to build:&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install mono-complete&lt;br /&gt;
 [[Download]] opensim (if you want to build a version from git, also install the '''git-core''' package by adding it to the apt-get install command above.)&lt;br /&gt;
 cd opensim&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 xbuild&lt;br /&gt;
&lt;br /&gt;
'''OPTIONAL (for developers):''' To run the regression test suite, you will also need to install nunit-console, like so&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install nunit-console&lt;br /&gt;
 nant test&lt;br /&gt;
&lt;br /&gt;
{{anchor|CentOS}}{{anchor|RedHat}}{{anchor|RHEL}}{{anchor|Fedora}}&lt;br /&gt;
== RHEL, Fedora, CentOS or other RedHats ==&lt;br /&gt;
&lt;br /&gt;
After getting run your OpenSimulator binary distributions, you'll need to get mono development library and install nant to build OpenSimulator from the source. See both sections below.&lt;br /&gt;
&lt;br /&gt;
=== Getting Mono Libraries ===&lt;br /&gt;
&lt;br /&gt;
If you have installed mono packages from the core repository for your distributions [[Dependencies#RedHat|when you run OpenSim.exe binary distribusion]], just type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install mono-devel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If not, just type (given that [[Dependencies#Installing from Mono Repository|you have already set up yum repository for mono]]) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install mono-addon-devel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both command will install its dependencies as well.&lt;br /&gt;
&lt;br /&gt;
=== Installing NAnt ===&lt;br /&gt;
&lt;br /&gt;
Run &amp;quot;yum info nant&amp;quot; to check the version of nant package. If you find the package, then just type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install nant&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can now run nant out-of-the-box.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you can't find nant package in yum repository, or you feel its version is too early for building OpenSimulator, obtain NAnt from [http://nant.sourceforge.net/ NAnt Project Site]. See User Manual there for detailed instruction. As of 0.90, you will need to create startup script like that (given you have expanded NAnt to /usr/local/nant) :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo vi /usr/bin/nant&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Then inside this file :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
exec mono /usr/local/nant/bin/NAnt.exe &amp;quot;$@&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
After that, make it executable :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo chmod +x /usr/bin/nant&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can now run runprebuild.sh and nant to compile OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
== openSUSE ==&lt;br /&gt;
&lt;br /&gt;
Install an openSUSE 11.1, 11 or 10.3 with its default options, add the online repositories&lt;br /&gt;
when finished installing do an online update with all the latest packages.&lt;br /&gt;
&lt;br /&gt;
In yast install these packages, for running Opensim in standalone mode.&lt;br /&gt;
(there is a slight diffrence between 10.3 and 11/11.1 but following should be same)&lt;br /&gt;
 subversion&lt;br /&gt;
 nant&lt;br /&gt;
 mono-jscript&lt;br /&gt;
 - check that mono-core is installed&lt;br /&gt;
&lt;br /&gt;
just in case you do not already have it installed &lt;br /&gt;
&lt;br /&gt;
  sudo zypper install mono-data-oracle&lt;br /&gt;
&lt;br /&gt;
A tip for OpenSuSE 11.1 users - you can install packages from the command line using the 'zypper' tool.  For example, to install 'nant', use this command:&lt;br /&gt;
&lt;br /&gt;
  sudo zypper install nant&lt;br /&gt;
&lt;br /&gt;
If you just want to use SQLite then jump to last section &lt;br /&gt;
within this post.&lt;br /&gt;
&lt;br /&gt;
* Optional mysql - for Opensim running in Grid mode:&lt;br /&gt;
Install these mysql packages via yast&lt;br /&gt;
  mysql&lt;br /&gt;
  mysql-client&lt;br /&gt;
  mysql-administrator&lt;br /&gt;
  mysql-gui-tools&lt;br /&gt;
  mysql-query-browser&lt;br /&gt;
&lt;br /&gt;
(note that selecting mysql in the Yast2 Installer will select the other packages automatically)&lt;br /&gt;
&lt;br /&gt;
Before building create the mysql database.&lt;br /&gt;
 /etc/init.d/mysql start&lt;br /&gt;
 mysql -u root -p -h localhost&lt;br /&gt;
 (when asked for password just hit enter)&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; create database opensim;&lt;br /&gt;
 mysql&amp;gt; use opensim;&lt;br /&gt;
 mysql&amp;gt; create user 'opensim'@'localhost' identified by 'thePassword';&lt;br /&gt;
 mysql&amp;gt; grant all on *.* to 'opensim'@'localhost';&lt;br /&gt;
 mysql&amp;gt; quit&lt;br /&gt;
&lt;br /&gt;
*note that the '''grant all''' command may differ if you're adding the opensim database to an existing mysql installation.&lt;br /&gt;
&lt;br /&gt;
On current builds set the connection string inside bin/OpenSim.ini after coppying the OpenSim.ini.example file.&lt;br /&gt;
If you are changing to MySQL from SQLite, the connection string for mysql also exists in the bin/Region/*xml files.&lt;br /&gt;
* It is '''important''' to remember this if you start out using the built-in SQLite database engine.&lt;br /&gt;
&lt;br /&gt;
Build after installation of above in bash terminal. I save it in /opt&lt;br /&gt;
&lt;br /&gt;
 su -&lt;br /&gt;
 cd /opt&lt;br /&gt;
 [[Download]] opensim&lt;br /&gt;
 cd opensim&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
Or, if you have a current (0.6+), you can simply execute:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
After this you should be able to continue on starting the diffrent Servers, look in the mysql-config section,or&lt;br /&gt;
just run your OpenSim as a Standalone.&lt;br /&gt;
&lt;br /&gt;
== FreeBSD ==&lt;br /&gt;
&lt;br /&gt;
On FreeBSD 6.2,&lt;br /&gt;
&lt;br /&gt;
 su&lt;br /&gt;
 cd /usr/ports/devel/subversion/ &amp;amp;&amp;amp; make install clean (you may also need to rebuild apr-svn if this step fails)&lt;br /&gt;
 cd /usr/ports/lang/mono/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/devel/nant/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/databases/sqlite3/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/x11-toolkits/libgdiplus/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /opensim/installation/directory/&lt;br /&gt;
 [[Download]] opensim&lt;br /&gt;
 cd opensim&lt;br /&gt;
 ./runprebuild.sh&lt;br /&gt;
 nant&lt;br /&gt;
&lt;br /&gt;
 Note: [[Troubleshooting#System.DllNotFoundException:_..2Flibopenjpeg-libsl-2.1.2.0.so|Follow the instructions on the FAQ to fix the]]&lt;br /&gt;
 &amp;quot;System.DllNotFoundException: ./libopenjpeg-libsl-2.1.2.0.so&amp;quot; issue, but use &amp;quot;gmake&amp;quot; instead of &amp;quot;make&amp;quot;&lt;br /&gt;
&lt;br /&gt;
For ODE Physics you must do the following:&lt;br /&gt;
 cd /usr/ports/graphics/libGL/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /usr/ports/graphics/libGLU/ &amp;amp;&amp;amp; make install clean&lt;br /&gt;
 cd /opensim/installation/directory/&lt;br /&gt;
 svn co http://opensimulator.org/svn/opensim-libs/trunk opensim-libs&lt;br /&gt;
 cd opensim-libs/unmanaged/OpenDynamicsEngine2/&lt;br /&gt;
 sh autogen.sh&lt;br /&gt;
 ./configure --enable-shared --enable-release --disable-demos&lt;br /&gt;
 make&lt;br /&gt;
 mv ./ode/src/.libs/libode.so /opensim/installation/directory/opensim/bin/&lt;br /&gt;
&lt;br /&gt;
== Debian ==&lt;br /&gt;
&lt;br /&gt;
=== Debian 4 ===&lt;br /&gt;
&lt;br /&gt;
For detailed instructions please see [[Debian 4 Build Instructions]]&lt;br /&gt;
&lt;br /&gt;
=== Debian 5 ===&lt;br /&gt;
&lt;br /&gt;
1. Install Debian in the usual way. In the package list choose just the last option - 'Standard system' Leave all other install options unchecked unless you have other reason to install them.&lt;br /&gt;
&lt;br /&gt;
2. Log in as your root user make sure it works.&lt;br /&gt;
&lt;br /&gt;
3. type: aptitude update (or apt-get update)&lt;br /&gt;
&lt;br /&gt;
4. type: aptitude install nant and answer 'y' to 'Do you want to continue'- This will install nant and all of its dependancies.&lt;br /&gt;
&lt;br /&gt;
5. type: apt-get install git-core and answer 'y' to 'Do you want to continue'.&lt;br /&gt;
&lt;br /&gt;
6. type: aptitude install build-essential swig autoconf gawk mono-common binfmt-support bison libglib2.0-dev gettext and answer 'y' to 'Do you want to continue'&lt;br /&gt;
&lt;br /&gt;
7. type: wget http://ftp.novell.com/pub/mono/sources/mono/mono-2.4.3.tar.bz2 to download mono&lt;br /&gt;
&lt;br /&gt;
8. type: tar xf mono-2.4.3.tar.bz2 to extract the mono source code to a directory (substitute the latest build)&lt;br /&gt;
&lt;br /&gt;
9. type: cd mono-2.4.3 to change int the directory you just created&lt;br /&gt;
&lt;br /&gt;
10. type: ./configure --with-libgdiplus=yes - wait for it to finish&lt;br /&gt;
&lt;br /&gt;
11. type: make - and wait some more as this takes a bit - moreso on older machines&lt;br /&gt;
&lt;br /&gt;
12. type: make install&lt;br /&gt;
&lt;br /&gt;
13. type: cd /&lt;br /&gt;
&lt;br /&gt;
14 type: git clone git://opensimulator.org/git/opensim&lt;br /&gt;
&lt;br /&gt;
15 type: cd opensim&lt;br /&gt;
&lt;br /&gt;
16. type: git checkout -b 0.6.8-post-fixes origin/0.6.8-post-fixes (substitute the latest build)&lt;br /&gt;
&lt;br /&gt;
17. type: git pull&lt;br /&gt;
&lt;br /&gt;
18. type: apt-get -u upgrade and answer 'y' to 'do you want to continue?'. This will update all packages to their latest versions via apt (it will not upgrade opensim or mono as they were compiled seperately)&lt;br /&gt;
&lt;br /&gt;
19. Reboot, just to make sure it all comes up cleanly (type: shutdown -r now)&lt;br /&gt;
&lt;br /&gt;
20. Login, type: cd /&lt;br /&gt;
&lt;br /&gt;
21. type: cd opensim&lt;br /&gt;
&lt;br /&gt;
22. type: ./runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
23 type: nant - wait for this to finish&lt;br /&gt;
&lt;br /&gt;
24. type: cd bin&lt;br /&gt;
&lt;br /&gt;
25. type: cp OpenSim.ini.example OpenSim.ini&lt;br /&gt;
&lt;br /&gt;
26. type: mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
27. Answer the onscreen wizard promts and Opensim will start in standalone mode.&lt;br /&gt;
&lt;br /&gt;
To add MySql support type: apt-get install mysql-server and answer 'y' to 'Do you want to Continue'. You will be prompted for a password for the MySQL root user, enter it twice as requested. Edit OpenSim.ini to use MySql as directed elsewhere.&lt;br /&gt;
&lt;br /&gt;
=== Debian testing/unstable (will be Debian 7)  ===&lt;br /&gt;
&lt;br /&gt;
Updated 2011 April 19 &lt;br /&gt;
&lt;br /&gt;
#Get root access on a Debian/Linux machine or install a fresh copy yourself. see http://www.debian.org/ This is the most difficult and longest step in our list, but there are many resources to help you through if this is your first time. &lt;br /&gt;
#Log in as your root user. &lt;br /&gt;
#Check &amp;lt;tt&amp;gt;/etc/debian_version&amp;lt;/tt&amp;gt; to be sure of what release you are working with, by typing: `&amp;lt;tt&amp;gt;cat /etc/debian_version&amp;lt;/tt&amp;gt;'. As of this writing it should reply &amp;quot;&amp;lt;tt&amp;gt;wheezy/sid&amp;lt;/tt&amp;gt;&amp;quot;. &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;apt-get update&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;apt-get dist-upgrade&amp;lt;/tt&amp;gt;' This will upgrade all packages to their latest versions and will handle conflicts which may arise. See: `&amp;lt;tt&amp;gt;man apt-get&amp;lt;/tt&amp;gt;' for more information. If you did not install from scratch this will bring the system up to date. For more information about running and maintaining a Debian system enter: `&amp;lt;tt&amp;gt;apt-get install debian-reference&amp;lt;/tt&amp;gt;' and point a web browser at &amp;lt;tt&amp;gt;/usr/share/doc/debian-reference-common/html/index.en.html&amp;lt;/tt&amp;gt; This is a book length document (read it later). &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;apt-get install mono-complete nant git build-essential swig autoconf gawk binfmt-support bison gettext&amp;lt;/tt&amp;gt;' and answer 'y' to 'Do you want to continue'. &lt;br /&gt;
#Reboot, just to make sure it all comes up cleanly (type: `&amp;lt;tt&amp;gt;shutdown -r now&amp;lt;/tt&amp;gt;') &lt;br /&gt;
#Login again, type: `&amp;lt;tt&amp;gt;cd /usr/src&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;git clone git://opensimulator.org/git/opensim&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;cd opensim&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;git branch -r&amp;lt;/tt&amp;gt;' will show you the available branches in the remote repository. You want the most recent release which will be listed as something like &amp;quot;&amp;lt;tt&amp;gt;origin/0.7.0.2-release&amp;lt;/tt&amp;gt;&amp;quot; &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;git checkout -b 0.7.0.2-release origin/0.7.0.2-release&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;git pull&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;./runprebuild.sh&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;nant&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;cd bin&amp;lt;/tt&amp;gt;' to switch directories to &amp;lt;tt&amp;gt;/usr/src/opensim/bin&amp;lt;/tt&amp;gt; &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;cp OpenSim.ini.example OpenSim.ini&amp;lt;/tt&amp;gt;' (The &amp;lt;tt&amp;gt;[Architecture]&amp;lt;/tt&amp;gt; section is what determines if you will be running a standalone or grid server. You want the default standalone variant to get started with.) &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;cd config-include&amp;lt;/tt&amp;gt;' you are now in &amp;lt;tt&amp;gt;/usr/src/opensim/bin/config-include&amp;lt;/tt&amp;gt; &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;cp StandaloneCommon.ini.example StandaloneCommon.ini&amp;lt;/tt&amp;gt;' See [[Configuration]] for more information on configuring OpenSim. &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;cd ..&amp;lt;/tt&amp;gt;' to change directories back to &amp;lt;tt&amp;gt;/usr/src/opensim/bin&amp;lt;/tt&amp;gt; &lt;br /&gt;
#type: `&amp;lt;tt&amp;gt;mono OpenSim.exe&amp;lt;/tt&amp;gt;' &lt;br /&gt;
#The startup wizard will ask you a number of questions. The defaults are fine but you can fill these in to your taste:&lt;br /&gt;
&lt;br /&gt;
region name, estate name, owner first name, owner last name, owner password, and owner email &lt;br /&gt;
&lt;br /&gt;
Remember the external host name and port number, you need these to construct the login URI to connect to with your client. http://hostname:portnumber/ &lt;br /&gt;
&lt;br /&gt;
Opensim will then finish starting and leave you at a prompt which looks like: &lt;br /&gt;
&lt;br /&gt;
 Region (regionName) #&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Where to go from here: &lt;br /&gt;
&lt;br /&gt;
*[[Connecting]] to your server using a client.&lt;br /&gt;
&lt;br /&gt;
*[[Upgrading]] to mySQL from mySQLite.&lt;br /&gt;
&lt;br /&gt;
*[[Server Commands]] for creating users and controlling the system.&lt;br /&gt;
&lt;br /&gt;
*Fix the bent knees bug: [[FAQ#Why_are_my_knees_bent_when_I_stand_idle.3F]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
[[Category:Getting Started]]&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Dependencies</id>
		<title>Dependencies</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Dependencies"/>
				<updated>2011-05-12T11:33:38Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Quicklinks}}&lt;br /&gt;
&lt;br /&gt;
In addition to the OpenSim code itself, certain other packages need to be installed on different platforms in order to get OpenSim binaries to run. &lt;br /&gt;
&lt;br /&gt;
As well as the information on this page (which should be expanded), you may find more information on dependencies in [[Build Instructions]] though this will also contain dependencies required only for building. This are also more hints in [[Troubleshooting]] &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Windows  =&lt;br /&gt;
&lt;br /&gt;
OpenSim now requires '''.NET Framework 3.5''' when running under Windows.  If you run OpenSimulator on '''Windows 7''' or '''Windows Server 2008 R2''', it is already bundled so you can run OpenSim 0.7.1 out-of-the-box. On '''Windows Vista''', '''Windows Server 2008''', '''Windows Server 2003''' or '''Windows XP''', you'll need to upgrade it to 3.5(or later, but NET Framework 4.0 not officially supported by OpenSim yet), downloading from [http://msdn.microsoft.com/en-us/netframework/cc378097 Microsoft .NET Framework Download Page@.NET Framework Developer Center]. Note that prior versions of Windows(ex. NT or 2000) are NOT supported.&lt;br /&gt;
&lt;br /&gt;
If you run on Windows XP ensure it is updated to at least Service Pack 2 (SP2). &lt;br /&gt;
&lt;br /&gt;
Double-click or execute on command prompt:&lt;br /&gt;
*32-bit version of Windows: '''OpenSim.exe'''&lt;br /&gt;
*64-bit version of Windows: '''OpenSim.32BitLaunch.exe'''&lt;br /&gt;
Depending on your installation, you may have to run the program as administrator(right click -&amp;gt; 'Run as administrator'). It will pop up a window asking permission, select &amp;quot;Allow&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Linux  =&lt;br /&gt;
&lt;br /&gt;
OpenSimulator requires Mono 2.4.3 or later. '''WARNING:''' OpenSim is known to have significant performance and scalability problems with Mono versions 2.8.x, 2.10.0 and 2.10.1. As of Mono 2.10.2, the scalability problems appear to have been resolved. Therefore you should either use Mono 2.6.x or Mono 2.10.2 or later. You can also use Mono 2.4.3, but it is fairly old now.&lt;br /&gt;
&lt;br /&gt;
== Ubuntu ==&lt;br /&gt;
&lt;br /&gt;
 sudo apt-get install mono-complete git-core&lt;br /&gt;
&lt;br /&gt;
'''xbuild''' or '''nant''' is required if you need to build OpenSim. As of mono 2.6 series, xbuild works well enough to drive a complete build of OpenSim. Since xbuild is included within the '''mono-complete''' package on Ubuntu, you don't have to install any additional packages if you don't have any particular reason to prefer nant over xbuild. They are just two different build systems that invoke the same C# compiler based on two different build script formats.&lt;br /&gt;
&lt;br /&gt;
'''git''' is required if you need to check out OpenSimulator from source code. The '''git-core''' package provides this on Ubuntu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{anchor|CentOS}}{{anchor|RedHat}}{{anchor|RHEL}}{{anchor|Fedora}}&lt;br /&gt;
== RHEL, Fedora, CentOS or Any Other RedHat-based Distributions  ==&lt;br /&gt;
&lt;br /&gt;
First, run &amp;quot;yum info mono-core&amp;quot; to see the version of the mono packages in the core repository for your distribution. If it shows '''2.4.3''' or later, proceed to [[#Installing from Core Repository]]. If not, skip to [[#Installing from Mono Repository]]. Note that the current version you can get from yum repository for some distributions is lower than requirement (ex. '''1.2.4''' on CentOS). Unlike Ubuntu, RedHat-based distributions should be always conservative, therefore it is natural that they don't so often update their repository. What you can do to manage this problem is to add an extra repository for mono.&lt;br /&gt;
&lt;br /&gt;
=== Installing from Core Repository ===&lt;br /&gt;
&lt;br /&gt;
Just type:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install  mono-core mono-data-sqlite mono-extras libgdiplus&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
It will also install dependent modules. After that you can launch OpenSim.exe with mono out-of-the-box.&lt;br /&gt;
&lt;br /&gt;
=== Installing from Mono Repository ===&lt;br /&gt;
&lt;br /&gt;
This procedure is tested on CentOS 5.5 &amp;amp; 5.6 box with OpenSim 0.7.1.&lt;br /&gt;
&lt;br /&gt;
Go to yum config file folder and create new one for mono.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /etc/yum.repos.d&lt;br /&gt;
sudo vi mono.repo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And then in mono.repo :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[mono]&lt;br /&gt;
name = novell-mono&lt;br /&gt;
baseurl=http://ftp.novell.com/pub/mono/download-stable/RHEL_5/&lt;br /&gt;
enabled=1&lt;br /&gt;
gpgcheck=0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now, you can yum install the later version of mono from this repository. Additional note that make sure all of mono packages are i386(not IA64 build). If your box is 32bit, don't care and you can even install properly without &amp;quot;.i386&amp;quot; suffix.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo yum install mono-addon-core.i386 mono-addon-data.i386 mono-addon-data-sqlite.i386  \&lt;br /&gt;
      mono-addon-extras.i386 mono-addon-web.i386 mono-addon-winforms.i386 mono-addon-libgdiplus0.i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Yum will install mono into /opt/novell/mono, so you can create a symbolic link to /usr/bin :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo ln -s /opt/novell/mono/bin/mono /usr/bin/mono&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After that, you should be able to launch OpenSim.exe without any errors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Mac OS X =&lt;br /&gt;
&lt;br /&gt;
All you have to do is to fetch Mono '''Runtime''' package from [http://www.go-mono.com/mono-downloads/download.html Mono Download Page] and install it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Locales and Regional Settings =&lt;br /&gt;
OpenSimulator will only work properly when you run it with an English locale or regional setting. With other settings than English, you are likely to see a variety of issues, ranging from misbehaving scripts to crashes.&lt;br /&gt;
&lt;br /&gt;
== Linux ==&lt;br /&gt;
In Linux, you can easily use the standard &amp;quot;C&amp;quot; locale just for running OpenSim.exe, as explained in [[Troubleshooting#ScriptEngine Issues]]:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
env LANG=C mono OpenSim.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For information about changing your locale in a more general way, see [[Troubleshooting#Locales Issues]]&lt;br /&gt;
&lt;br /&gt;
== Windows ==&lt;br /&gt;
If you are not using an English regional setting in Windows by default, then there is not a solution as easy as for Linux, unfortunately. I did it with an additional user account that I created just for OpenSim in which I set the regional setting to &amp;quot;English (US)&amp;quot;. I run OpenSim.exe from my normal user account with &amp;quot;Run as...&amp;quot; (or check &amp;quot;Run with different credentials&amp;quot; in a shortcut's advanced properties) and specify the OpenSim account as the one to be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Additional Resources  =&lt;br /&gt;
&lt;br /&gt;
OSGrid Technical Support Forum with many installation tutorials:&amp;amp;nbsp; [http://osgrid.org/forums/viewforum.php?f=14 osgrid.org/forums/viewforum.php] &lt;br /&gt;
&lt;br /&gt;
MONO&amp;amp;nbsp;Project:&amp;amp;nbsp; [http://www.mono-project.com/Main_Page www.mono-project.com/Main_Page]&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-05-12T04:08:35Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Basic Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic], [http://opensimulator.org/wiki/User:Justincc justincc]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Status''': Committed to git master as of May 12, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': Maintained in OpenSim git master&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': Only the OpenSimDefaults.ini has to be modified to add the disable by default setting, outside of the AutoBackupModule code itself.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
** AutoBackupModuleEnabled: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Global (in '''OpenSim.ini''') '''or''' Per-Region (in '''Regions/Regions.ini''' under the region's name's section)&lt;br /&gt;
* '''IMPORTANT:''' Settings declared per-region in Regions/Regions.ini override settings in OpenSim.ini. Settings in OpenSim.ini, in turn, override hard-coded defaults.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
** AutoBackupDilationThreshold: float. Default: 0.5. Lower bound on time dilation required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the time dilation is below this value, don't take a backup right now.&lt;br /&gt;
** AutoBackupAgentThreshold: int. Default: 10. Upper bound on # of agents in region required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the number of agents is greater than this value, don't take a backup right now.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
'''Implementation note''': As of May 2, we don't halve the interval each time we PROCRASTINATE. Not sure if we need to worry about this.&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-05-02T08:24:05Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Configuration Settings */ -- Another bump to the settings layout of AutoBackup. See http://opensimulator.org/mantis/view.php?id=5440&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic], [http://opensimulator.org/wiki/User:Justincc justincc]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Status''': Active development as of May 2, 2011 (Beta)&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': Only the OpenSimDefaults.ini has to be modified to add the disable by default setting, outside of the AutoBackupModule code itself.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
** AutoBackupModuleEnabled: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Global (in '''OpenSim.ini''') '''or''' Per-Region (in '''Regions/Regions.ini''' under the region's name's section)&lt;br /&gt;
* '''IMPORTANT:''' Settings declared per-region in Regions/Regions.ini override settings in OpenSim.ini. Settings in OpenSim.ini, in turn, override hard-coded defaults.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
** AutoBackupDilationThreshold: float. Default: 0.5. Lower bound on time dilation required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the time dilation is below this value, don't take a backup right now.&lt;br /&gt;
** AutoBackupAgentThreshold: int. Default: 10. Upper bound on # of agents in region required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the number of agents is greater than this value, don't take a backup right now.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
'''Implementation note''': As of May 2, we don't halve the interval each time we PROCRASTINATE. Not sure if we need to worry about this.&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-05-02T08:19:58Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Busy Heuristics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic], [http://opensimulator.org/wiki/User:Justincc justincc]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Status''': Active development as of May 2, 2011 (Beta)&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': Only the OpenSimDefaults.ini has to be modified to add the disable by default setting, outside of the AutoBackupModule code itself.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
** AutoBackupModuleEnabled: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Per Region (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
* '''IMPORTANT:''' These settings use &amp;quot;RegionName.Setting&amp;quot; notation to construct the key name. So, to specify the AutoBackupInterval key for region &amp;quot;Foo&amp;quot;, your key would be named '''Foo.AutoBackupInterval'''.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
** AutoBackupDilationThreshold: float. Default: 0.5. Lower bound on time dilation required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the time dilation is below this value, don't take a backup right now.&lt;br /&gt;
** AutoBackupAgentThreshold: int. Default: 10. Upper bound on # of agents in region required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the number of agents is greater than this value, don't take a backup right now.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
'''Implementation note''': As of May 2, we don't halve the interval each time we PROCRASTINATE. Not sure if we need to worry about this.&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-05-02T08:18:54Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Criteria */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic], [http://opensimulator.org/wiki/User:Justincc justincc]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Status''': Active development as of May 2, 2011 (Beta)&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': Only the OpenSimDefaults.ini has to be modified to add the disable by default setting, outside of the AutoBackupModule code itself.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
** AutoBackupModuleEnabled: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Per Region (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
* '''IMPORTANT:''' These settings use &amp;quot;RegionName.Setting&amp;quot; notation to construct the key name. So, to specify the AutoBackupInterval key for region &amp;quot;Foo&amp;quot;, your key would be named '''Foo.AutoBackupInterval'''.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
** AutoBackupDilationThreshold: float. Default: 0.5. Lower bound on time dilation required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the time dilation is below this value, don't take a backup right now.&lt;br /&gt;
** AutoBackupAgentThreshold: int. Default: 10. Upper bound on # of agents in region required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the number of agents is greater than this value, don't take a backup right now.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-05-02T08:17:11Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Basic Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic], [http://opensimulator.org/wiki/User:Justincc justincc]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Status''': Active development as of May 2, 2011 (Beta)&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
** AutoBackupModuleEnabled: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Per Region (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
* '''IMPORTANT:''' These settings use &amp;quot;RegionName.Setting&amp;quot; notation to construct the key name. So, to specify the AutoBackupInterval key for region &amp;quot;Foo&amp;quot;, your key would be named '''Foo.AutoBackupInterval'''.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
** AutoBackupDilationThreshold: float. Default: 0.5. Lower bound on time dilation required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the time dilation is below this value, don't take a backup right now.&lt;br /&gt;
** AutoBackupAgentThreshold: int. Default: 10. Upper bound on # of agents in region required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the number of agents is greater than this value, don't take a backup right now.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-04-27T12:39:31Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
** AutoBackupModuleEnabled: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Per Region (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
* '''IMPORTANT:''' These settings use &amp;quot;RegionName.Setting&amp;quot; notation to construct the key name. So, to specify the AutoBackupInterval key for region &amp;quot;Foo&amp;quot;, your key would be named '''Foo.AutoBackupInterval'''.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
** AutoBackupDilationThreshold: float. Default: 0.5. Lower bound on time dilation required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the time dilation is below this value, don't take a backup right now.&lt;br /&gt;
** AutoBackupAgentThreshold: int. Default: 10. Upper bound on # of agents in region required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the number of agents is greater than this value, don't take a backup right now.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Troubleshooting</id>
		<title>Troubleshooting</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Troubleshooting"/>
				<updated>2011-04-12T11:53:29Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: added info about NotImplementedException&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Quicklinks}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
This page gives any system-specific configuration settings that may be useful, and advice for problems that might be encountered.&lt;br /&gt;
__TOC__&lt;br /&gt;
{{clear}}&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
&lt;br /&gt;
== General tips ==&lt;br /&gt;
&lt;br /&gt;
If OpenSim does startup to a point where you can type commands in the region console, then you can find out what your current configuration is by using the &amp;quot;config get&amp;quot; and &amp;quot;config save&amp;quot; commands as detailed at [[Server_Commands]] (and by typing help on the console).&lt;br /&gt;
&lt;br /&gt;
This can be useful for eliminating a bad configuration when diagnosing some issues.&lt;br /&gt;
&lt;br /&gt;
== System-specific configuration ==&lt;br /&gt;
=== CentOS 5 ===&lt;br /&gt;
&lt;br /&gt;
To install mono and nant, you can use the &amp;quot;Linux Installer for x86&amp;quot; found at http://www.mono-project.com/Downloads.&lt;br /&gt;
&lt;br /&gt;
SVN can be installed by:&lt;br /&gt;
&lt;br /&gt;
 yum install subversion&lt;br /&gt;
&lt;br /&gt;
Mono defaults to installing into &amp;lt;tt&amp;gt;/opt&amp;lt;/tt&amp;gt;, so you may have to add this path to your environment variables, for example, in your &amp;lt;tt&amp;gt;~/.bashrc&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 export PATH=&amp;quot;/opt/mono-1.2.5/bin:$PATH&amp;quot;&lt;br /&gt;
 export PKG_CONFIG_PATH=&amp;quot;/opt/mono-1.2.5/lib/pkgconfig:$PKG_CONFIG_PATH&amp;quot;&lt;br /&gt;
 export MANPATH=&amp;quot;/opt/mono-1.2.5/share/man:$MANPATH&amp;quot;&lt;br /&gt;
 export LD_LIBRARY_PATH=&amp;quot;/opt/mono-1.2.5/lib:$LD_LIBRARY_PATH&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After changing &amp;lt;tt&amp;gt;LD_LIBRARY_PATH&amp;lt;/tt&amp;gt;, you should update the dynamic linker cache:&lt;br /&gt;
&lt;br /&gt;
 ldconfig&lt;br /&gt;
&lt;br /&gt;
You may still encounter the &amp;quot;The current runtime framework 'mono-2.0' is not correctly configured in the NAnt configuration file.&amp;quot; error listed below.  In that case, this may fix this:&lt;br /&gt;
&lt;br /&gt;
 yum install glib&lt;br /&gt;
&lt;br /&gt;
If you are running a firewall as well (i.e., if &amp;lt;tt&amp;gt;iptables -L&amp;lt;/tt&amp;gt; shows a list of ACCEPT and REJECT rules), you'll have to open the necessary ports if you want to access the sim from other machines.  For standalone mode:&lt;br /&gt;
&lt;br /&gt;
 iptables -I RH-Firewall-1-INPUT -p tcp --dport 9000 -j ACCEPT&lt;br /&gt;
 iptables -I RH-Firewall-1-INPUT -p udp --dport 9000 -j ACCEPT&lt;br /&gt;
&lt;br /&gt;
If you are running Mono 2.2 compiled from source on CentOS 5.2 64bit (not sure if it applies to other scenarios as well), you need to take these steps:&lt;br /&gt;
 sudo yum install libgdiplus&lt;br /&gt;
 sudo yum install libexif&lt;br /&gt;
 sudo ln -s /usr/lib64/libgdiplus.so.0 /usr/lib64/libgdiplus.so&lt;br /&gt;
 ldconfig&lt;br /&gt;
&lt;br /&gt;
That finally enabled me to run OpenSim without errors, and even connect to other grids.&lt;br /&gt;
&lt;br /&gt;
=== Debian 4.0r0 ===&lt;br /&gt;
&lt;br /&gt;
If you set your system to use unstable sources, and then install some packages listed below, everything should just work.  To use unstable sources, modify your &amp;lt;tt&amp;gt;/etc/apt/sources.list&amp;lt;/tt&amp;gt; file, replacing 'etch' or 'stable' with 'unstable':&lt;br /&gt;
&lt;br /&gt;
 deb ftp://ftp.debian.org/debian/ unstable main&lt;br /&gt;
 deb-src ftp://ftp.debian.org/debian/ unstable main&lt;br /&gt;
&lt;br /&gt;
Then update your packages to the new versions:&lt;br /&gt;
&lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get dist-upgrade&lt;br /&gt;
&lt;br /&gt;
This will probably change a large number of packages, and may break things.&lt;br /&gt;
In my experience, however, if you do not use unstable sources then the packages are not up to date enough, and you run into version issues, which lead to two DllNotFoundException errors below appearing in the console output: gdiplus.dll and libopenjpeg-libsl-2.1.2.0.so.&lt;br /&gt;
&lt;br /&gt;
Once the sources are updated, we need to install the necessary packages to be able to build OpenSim:&lt;br /&gt;
&lt;br /&gt;
 apt-get install subversion mono nant mono-gmcs mono-mjs libmono-microsoft8.0-cil libmono-system-runtime2.0-cil&lt;br /&gt;
&lt;br /&gt;
If any of these packages are missing, you'll probably encounter one of the errors listed below.  However, with these packages, OpenSim should build cleanly.&lt;br /&gt;
&lt;br /&gt;
Please note: If you are using mysql as storage on unstable you may get the following error:-&lt;br /&gt;
&lt;br /&gt;
 Exception: System.NotSupportedException: CodePage 1252 not supported&lt;br /&gt;
  at System.Text.Encoding.GetEncoding (Int32 codePage) [0x00000] &lt;br /&gt;
&lt;br /&gt;
To get it to work, try installing the libmono-i18n2.0-cil package&lt;br /&gt;
&lt;br /&gt;
 apt-get install libmono-i18n2.0-cil&lt;br /&gt;
&lt;br /&gt;
=== Gentoo ===&lt;br /&gt;
some Mono dependency &amp;amp; latest Mono itself may use &amp;quot;~x86&amp;quot; masked packages (assuming x86 is your platform, change may be made to reflect your ex:&amp;quot;~amd64&amp;quot; for 64bits). You could check for USE parameter with:&lt;br /&gt;
&lt;br /&gt;
 ACCEPT_KEYWORDS=&amp;quot;~x86&amp;quot; emerge -vp subversion nant mono libgdiplus&lt;br /&gt;
&lt;br /&gt;
Then install with:&lt;br /&gt;
&lt;br /&gt;
 ACCEPT_KEYWORDS=&amp;quot;~x86&amp;quot; emerge subversion nant mono libgdiplus&lt;br /&gt;
&lt;br /&gt;
N.B: The ACCEPT_KEYWORDS=&amp;quot;~x86&amp;quot; can be set in Gentoo /etc/make.conf file, but that turn up all the emerges in testing/unstable, using it at the begining of emerge command line use it only for current emerge process&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
This assumes you're using the universal binary for mono from the [http://www.mono-project.com/ Mono Project] site.&lt;br /&gt;
&lt;br /&gt;
If you are using OS X 10.4, you should also install X11 from the OS X install CDs.&lt;br /&gt;
In OS X 10.5, this is not required.&lt;br /&gt;
&lt;br /&gt;
If you get errors about the 2.0 framework not being supported, you may need to update your &amp;lt;tt&amp;gt;pkg-config&amp;lt;/tt&amp;gt; path.&lt;br /&gt;
I set this in &amp;lt;tt&amp;gt;~/.bash_profile&amp;lt;/tt&amp;gt;:&lt;br /&gt;
 export PKG_CONFIG_PATH=&amp;quot;/Library/Frameworks/Mono.framework/Versions/Current/lib/pkgconfig/:${PKG_CONFIG_PATH}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Errors and fixes  ==&lt;br /&gt;
&lt;br /&gt;
=== Build workarounds due to non-functionality or bugs:  ===&lt;br /&gt;
&lt;br /&gt;
==== Disappearing prims due to duplicate UID's  ====&lt;br /&gt;
&lt;br /&gt;
Generally this problem occurs when a save-xml/load-xml file is loaded into the same sim without using the -newUID switch to generate new UUID's for the objects. See [[Server_Commands]] for detailed information. (&amp;lt;nowiki&amp;gt;load-xml &amp;lt;filename&amp;gt; -newUID&amp;lt;/nowiki&amp;gt;). But if this does not work, the other way is to shift-copy your build and drag it up into the air.. then delete the one in the air, (which is actually the copy). This will generate new UID's on all your prims.. you can now leave that build, and load your original load-xml file in another region. &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
=== Exception and loss of ode physics (System.EntryPointNotFoundException: dSpaceLockQuery)  ===&lt;br /&gt;
&lt;br /&gt;
The following error is usually caused by using the wrong version of ''libode'': &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: none repeat scroll 0% 0% LavenderBlush; color: black;&amp;quot; | &lt;br /&gt;
[SCENE] [02-01 22:20:40] System.EntryPointNotFoundException: dSpaceLockQuery &lt;br /&gt;
&lt;br /&gt;
:at (wrapper managed-to-native) Ode.NET.d:SpaceLockQuery (intptr) &lt;br /&gt;
:at OpenSim.Region.Physics.OdePlugin.OdeScene.waitForSpaceUnlock (IntPtr space) [0x00000] &lt;br /&gt;
:at OpenSim.Region.Physics.OdePlugin.OdeCharacter.AvatarGeomAndBodyCreation (Single npositionX, Single npositionY, Single npositionZ, Single tensor) [0x00000] &lt;br /&gt;
:at OpenSim.Region.Physics.OdePlugin.OdeCharacter..ctor (System.String avName, OpenSim.Region.Physics.OdePlugin.OdeScene parent_scene, OpenSim.Region.Physics.Manager.PhysicsVector pos) [0x00000] &lt;br /&gt;
:at OpenSim.Region.Physics.OdePlugin.OdeScene.AddAvatar (System.String avName, OpenSim.Region.Physics.Manager.PhysicsVector position) [0x00000] &lt;br /&gt;
:at OpenSim.Region.Environment.Scenes.ScenePresence.AddToPhysicalScene () [0x00000] &lt;br /&gt;
:at OpenSim.Region.Environment.Scenes.ScenePresence.MakeRootAgent (LLVector3 pos, Boolean isFlying) [0x00000] &lt;br /&gt;
:at OpenSim.Region.Environment.Scenes.Scene.AgentCrossing (UInt64 regionHandle, LLUUID agentID, LLVector3 position, Boolean isFlying) [0x00000]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
First try searching your filesystem to see if you have other copies of the ode physics engine: &lt;br /&gt;
&lt;br /&gt;
 find / -name &amp;quot;libode.so&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Then make sure you have the latest version. &lt;br /&gt;
&lt;br /&gt;
=== MySQL connection errors after about 6-8 hours  ===&lt;br /&gt;
&lt;br /&gt;
MySQL has a timeout which drops the connection after 28,800 seconds (8 hours) of inactivity, which will probably result in failure to login after the User server has been sitting idle for an extended period. If you have this problem, increase the timeout to something larger, like 604800 (1 week) or 31536000 (1 year). From the mysql console, type: &lt;br /&gt;
&lt;br /&gt;
 set global wait_timeout=604800;&lt;br /&gt;
&lt;br /&gt;
=== System.DllNotFoundException: gdiplus.dll  ===&lt;br /&gt;
&lt;br /&gt;
First, check to make sure that &amp;lt;tt&amp;gt;libgdiplus.so&amp;lt;/tt&amp;gt; is known to the dynamic linker: &lt;br /&gt;
&lt;br /&gt;
 /sbin/ldconfig -p | grep libgdiplus&lt;br /&gt;
&lt;br /&gt;
If nothing is found, make sure that the directory libgdiplus.so exists in is either in your &amp;lt;tt&amp;gt;LD_LIBRARY_PATH&amp;lt;/tt&amp;gt; environment variable or listed in a *.conf file (e.g., gdiplus.conf) in /etc/ld.so.conf.d/. Then run &amp;lt;tt&amp;gt;ldconfig&amp;lt;/tt&amp;gt; to update the cache. Then it should be able to find the library. &lt;br /&gt;
&lt;br /&gt;
You may still have the above error, however, since libgdiplus also depends on other dynamic libraries, and if they fail to load, libgdiplus will fail. To test for this, run OpenSim with debugging information turned on: &lt;br /&gt;
&lt;br /&gt;
 MONO_LOG_LEVEL=debug mono OpenSim.exe&lt;br /&gt;
&lt;br /&gt;
On Mac OS X - check the following file exists... /opt/local/lib/libgdiplus.dylib if it does then as root user edit the file /opt/local/etc/mono/config and add the line &lt;br /&gt;
&lt;br /&gt;
 &amp;lt;dllmap dll=&amp;quot;gdiplus.dll&amp;quot; target=&amp;quot;/opt/local/lib/libgdiplus.dylib&amp;quot; os=&amp;quot;!windows&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Migrating Opensim / MySQL database from Windows to Linux  ===&lt;br /&gt;
&lt;br /&gt;
==== MySql.Data.MySqlClient.MySqlException: Table 'opensim.UserAccounts' doesn't exist  ====&lt;br /&gt;
&lt;br /&gt;
'''Environment:''' Opensim Server 0.7.0.2 behind Linux Ubuntu 8.0.4 with mono 2.8 and MySQL 5.0 installed. &lt;br /&gt;
&lt;br /&gt;
When you migrates a Opensim 0.7 database working with MySQL 5.0 on Windows to Linux, when logging a user in Opensim server, you may receive the following exception in the Opensim server console: &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;background: none repeat scroll 0% 0% LavenderBlush; color: black;&amp;quot; | &lt;br /&gt;
  03:11:10 - [LLOGIN SERVICE]: Exception processing login for (user_name): MySql.Data.MySqlClient.MySqlException: Table 'opensim.UserAccounts' doesn't exist&lt;br /&gt;
 at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000] in &amp;lt;filename unknown&amp;gt;:0&lt;br /&gt;
 at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64&amp;amp;amp; affectedRows, System.Int64&amp;amp;amp; lastInsertId) [0x00000] in &amp;lt;filename unknown&amp;gt;:0&lt;br /&gt;
 at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000] in &amp;lt;filename unknown&amp;gt;:0&lt;br /&gt;
 at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000] in &amp;lt;filename unknown&amp;gt;:0    at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000] in &amp;lt;filename unknown&amp;gt;:0&lt;br /&gt;
 at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64&amp;amp;amp; affectedRows, System.Int64&amp;amp;amp; lastInsertId) [0x00000] in &amp;lt;filename unknown&amp;gt;:0&lt;br /&gt;
 at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000] in &amp;lt;filename unknown&amp;gt;:0&lt;br /&gt;
 at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000] in &amp;lt;filename unknown&amp;gt;:0&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On the client, you also receive the following error: &lt;br /&gt;
&lt;br /&gt;
 Login Failed&lt;br /&gt;
 Error generating Login Response&lt;br /&gt;
&lt;br /&gt;
This exception is caused by the way MySQL store the table names. On a Windows MySQL server, the table names are not case sensitive, but '''all tables in MySQL Linux are case sensitive by default''', so when OpenSim will find them in the database with names in first capital letters, it can not find it. &lt;br /&gt;
&lt;br /&gt;
One solution would be to change the names of the tables required by opensim (ALTER TABLE's), but the cleanest solution is changing MySQL config, checking the option “'''lower_case_sensitive = 1'''” in the file &amp;quot;'''/etc/mysql/my.cnf'''&amp;quot;, section '''[mysqld]'''. &lt;br /&gt;
&lt;br /&gt;
 # sudo nano /etc/mysql/my.cnf&lt;br /&gt;
 &lt;br /&gt;
 ..........................&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 ..........................&lt;br /&gt;
 lower_case_sensitive=1&lt;br /&gt;
 ..........................&lt;br /&gt;
&lt;br /&gt;
This makes MySQL translate to lowercase the table names automatically. After restarting MySQL server and OpenSim, the tables are loaded without problems. &lt;br /&gt;
&lt;br /&gt;
Warning: don’t try to clear the table '''migration''' to force opensim re-migrate your database, because '''it will provoke a blight on your database'''.&lt;br /&gt;
&lt;br /&gt;
=== Errors from incomplete data migrations  ===&lt;br /&gt;
&lt;br /&gt;
This can happen during version upgrades if for some reason a database migration fails when there is a change in the way OpenSim stores data. &lt;br /&gt;
&lt;br /&gt;
You may see errors on the OpenSim console like: &lt;br /&gt;
&lt;br /&gt;
  [LLOGIN SERVICE]: Exception processing login for [username]: MySql.Data.MySqlClient.MySqlException: Table 'opensim.UserAccounts' doesn't exist&lt;br /&gt;
  at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000] &lt;br /&gt;
  at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64&amp;amp;amp; affectedRows, System.Int64&amp;amp;amp; lastInsertId) [0x00000] &lt;br /&gt;
  at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000] &lt;br /&gt;
  at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000]    at MySql.Data.MySqlClient.MySqlStream.OpenPacket () [0x00000] &lt;br /&gt;
  at MySql.Data.MySqlClient.NativeDriver.ReadResult (System.UInt64&amp;amp;amp; affectedRows, System.Int64&amp;amp;amp; lastInsertId) [0x00000] &lt;br /&gt;
  at MySql.Data.MySqlClient.MySqlDataReader.GetResultSet () [0x00000] &lt;br /&gt;
  at MySql.Data.MySqlClient.MySqlDataReader.NextResult () [0x00000] &lt;br /&gt;
&lt;br /&gt;
In this case the 'users' table had not been migrated to the 'UserAccounts' table which OpenSim was expecting, also resulting in the viewerside error: &lt;br /&gt;
&lt;br /&gt;
  Login Failed&lt;br /&gt;
 Error generating Login Response&lt;br /&gt;
&lt;br /&gt;
I solved by fixing the filesystem permissions that were causing the migration to fail (on my Linux box '/var/lib/mysql/...' had got itself messed up), then dropping the 'migration' table and running the server again (from the [non-critical] migration warnings encountered there was probably a more precise way to do this, but I was fully backed up so I did it quick-and-dirty). Other than loosing terrain data refs. and current shape/clothing/attachment data (easily restored in-sim) all was now good for me.&lt;br /&gt;
&lt;br /&gt;
=== When installing mono or libgdiplus0 you may get dependency missing libexif.so.9 === &lt;br /&gt;
&lt;br /&gt;
This was noticed on Centos5 but may occur on other systems, download ftp://rpmfind.net/linux/conectiva/snapshot/i386/RPMS.extra/libexif9-0.5.12-47547cl.i386.rpm and install problem solved. You will now be able to install mono (as long as nothing else goes wrong )&lt;br /&gt;
&lt;br /&gt;
=== The assembly mscorlib.dll was not found or could not be loaded ===&lt;br /&gt;
&lt;br /&gt;
This indicates that you are missing one of the mscor libs that comes with nant.  This is easily solved by getting NAnt, which comes with both versions 1.0 and 2.0 of the required lib.&lt;br /&gt;
&lt;br /&gt;
 apt-get install nant&lt;br /&gt;
&lt;br /&gt;
=== External Program Failed: /usr/lib/pkgconfig/../../lib/mono/2.0/gmcs.exe === &lt;br /&gt;
&lt;br /&gt;
This is quickly fixed by retrieving mono-gmcs.&lt;br /&gt;
&lt;br /&gt;
 apt-get install mono-gmcs&lt;br /&gt;
&lt;br /&gt;
=== The type or namespace name JScript does not exist in the namespace Microsoft ===&lt;br /&gt;
&lt;br /&gt;
Note that it says JScript over and over again.  Hint perhaps?&lt;br /&gt;
&lt;br /&gt;
 apt-get install mono-mjs libmono-microsoft8.0-cil&lt;br /&gt;
&lt;br /&gt;
On Fedora and OpenSUSE, the needed package is &amp;quot;mono-jscript&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== The type or namespace name Tcp does not exist in the namespace System.Runtime.Remoting.Channels ===&lt;br /&gt;
&lt;br /&gt;
This one is taken care of with a quick install:&lt;br /&gt;
&lt;br /&gt;
 apt-get install libmono-system-runtime2.0-cil&lt;br /&gt;
&lt;br /&gt;
=== Missing: libopenjpeg-libsl-2.1.2.0-x86_64.so ===&lt;br /&gt;
&lt;br /&gt;
You are probably on a 64-bit linux machine and may need to follow these instructions:&lt;br /&gt;
&lt;br /&gt;
* [[Installing_and_running_on_x86-64 |Installing and running on x86-64 ]]&lt;br /&gt;
&lt;br /&gt;
=== error while loading shared libraries: libgthread-2.0.so.0: cannot open shared object file ===&lt;br /&gt;
&lt;br /&gt;
If you start with a base Debian system as we did at the top of the page, but instead of using the apt version of mono you use the installer from their website, then you may encounter this issue.&lt;br /&gt;
&lt;br /&gt;
After getting the .bin file from http://www.mono-project.com/Downloads, and executing it as per its instructions, upon finishing, you may find that if you try to run `mono --version` you are presented with this message. This one means you need to install libglib2.0-0.&lt;br /&gt;
&lt;br /&gt;
 apt-get install libglib2.0-0&lt;br /&gt;
&lt;br /&gt;
=== The current runtime framework 'mono-2.0' is not correctly configured in the NAnt configuration file. ===&lt;br /&gt;
&lt;br /&gt;
This one seems to be fixed by retrieving the apt version of nant.&lt;br /&gt;
&lt;br /&gt;
 apt-get install nant&lt;br /&gt;
&lt;br /&gt;
This can also be due to &amp;lt;tt&amp;gt;pkg-config&amp;lt;/tt&amp;gt; not being able to locate the &amp;lt;tt&amp;gt;mono.pc&amp;lt;/tt&amp;gt; file.  Adding the directory containing this file to the environment variable &amp;lt;tt&amp;gt;PKG_CONFIG_PATH&amp;lt;/tt&amp;gt; may solve this.&lt;br /&gt;
&lt;br /&gt;
== Networking and config issues ==&lt;br /&gt;
&lt;br /&gt;
See also the wiki page:&lt;br /&gt;
* [[Network Settings]]&lt;br /&gt;
* [[Configuration]]&lt;br /&gt;
&lt;br /&gt;
=== You are able to log in, but not connect to a Region from a remote client ===&lt;br /&gt;
&lt;br /&gt;
Look in your OpenSimulator/bin/Regions folder: &lt;br /&gt;
&lt;br /&gt;
In 0.6.7 or later,&lt;br /&gt;
# Try '''0.0.0.0''' for the InternalAddress in your Regions.ini file.&lt;br /&gt;
# '''ExternalHostName=127.0.0.1''' will be needed to change its name to the asscssable DNS name  such as &amp;quot;opensim.example-host.com&amp;quot; or &amp;quot;71.6.131.152&amp;quot; (your public accessable ip)&lt;br /&gt;
In 0.6.6 or earlier,&lt;br /&gt;
# Try '''0.0.0.0''' for the internal_ip_address in your region.xml(default.xml) file.&amp;lt;br&amp;gt;(you'll have one of these files for each region you have created)&lt;br /&gt;
# '''external_host_name=&amp;quot;127.0.0.1&amp;quot;''' will be needed to change its name to the accessable DNS name such as &amp;quot;opensim.example-host.com&amp;quot; or &amp;quot;71.6.131.152&amp;quot; (your public accessable ip)&lt;br /&gt;
&lt;br /&gt;
==Building OpenSim==&lt;br /&gt;
===I can't find any build files or solution files===&lt;br /&gt;
* If you're on Windows, run&lt;br /&gt;
 runprebuild.bat&lt;br /&gt;
* on Linux/Mac/FreeBSD, run &lt;br /&gt;
 runprebuild.sh&lt;br /&gt;
&lt;br /&gt;
=== VS2005 won't open the .sln file ===&lt;br /&gt;
* Try running VS2005 C#. You are probably running VS2005 C++. This is a C# project.&lt;br /&gt;
&lt;br /&gt;
==Running OpenSim==&lt;br /&gt;
=== Running OpenSim.exe from a Cygwin shell has access denied for some dll's ===&lt;br /&gt;
* Do a '&amp;lt;tt&amp;gt;cd bin&amp;lt;/tt&amp;gt;' followed by '&amp;lt;tt&amp;gt;chmod a+x *&amp;lt;/tt&amp;gt;' to make all dll files executable.&lt;br /&gt;
===I cannot start my sim===&lt;br /&gt;
* See [[Configuration]]&lt;br /&gt;
&lt;br /&gt;
==Something Has Gone Wrong!==&lt;br /&gt;
=== I get errors concerning 'owner_uuid' when starting up my grid after updating from svn beyond r3254 ===&lt;br /&gt;
When updating to recent revisions after r3254, we are now using the unused owner_uuid. There are some grids whose mysql tables were created during a time when this field was inadvertently removed from the .sql script that initializes the regions table. Logging in to your mysql instance and executing this SQL query to add the missing owner_uuid should solve this issue:&lt;br /&gt;
 alter table `regions` add column `owner_uuid` varchar(36) default '00000000-0000-0000-0000-000000000000' not null, comment 'Rev.2';&lt;br /&gt;
The punctuation around regions and owner_uuid is &amp;quot;grave accent&amp;quot;. The punctuation around the default value and the comment is the single quote. The &amp;quot;grave accent&amp;quot; is the one generally to the left of the One button, under the tilde and the single-quote, is, well, underneath the double quote. I think this matters to mysql.&lt;br /&gt;
&lt;br /&gt;
=== I get errors concerning 'State' when starting up my grid after updating from svn beyond r3786 ===&lt;br /&gt;
After r3786, a new 'State' field has been added to the 'primshapes' table on SQLite. This field is used to persist trees and grass.&lt;br /&gt;
You may have an empty region at startup, because OpenSim does not find this 'State' field and does not know what to do.&lt;br /&gt;
The best is to use SQLiteBrowser or another SQLite table editor (download it at [http://sqlitebrowser.sourceforge.net/ http://sqlitebrowser.sourceforge.net/]) to create the missing field:&lt;br /&gt;
 alter table primshapes add column State integer default 0&lt;br /&gt;
Just launch SQLiteBrowser, use File/Open database, then browse to OpenSim.db file and open it. Then, go to the &amp;quot;Execute SQL&amp;quot; tab, copy/paste the command above in the &amp;quot;SQL string&amp;quot; textbox, then hit the &amp;quot;Execute query&amp;quot; button.&lt;br /&gt;
&lt;br /&gt;
=== I get a timeout during region handshake ===&lt;br /&gt;
* Do you have the correct IP in your Regions\* config files?&lt;br /&gt;
* Do you have multiple interfaces on the server running OpenSim? OpenSim will not bind outgoing UDP packets to a specific IP, its default IP to reach you will be what the Region answers UDP with. If you have configured the region for another IP you will get a timeout during connect.&lt;br /&gt;
&lt;br /&gt;
=== I cannot connect to my OpenSim ===&lt;br /&gt;
* See [[OpenSim: Connecting]]&lt;br /&gt;
&lt;br /&gt;
===I can connect but cannot move===&lt;br /&gt;
If the client connects but the avatar can only spin in place and not move, then the sim is not correctly configured. It completed the initial login function, but packets are not being exchanged between the client and the sim, probably due to a network configuration error on the sim.&lt;br /&gt;
* See [[OpenSim: Configuration]]&lt;br /&gt;
&lt;br /&gt;
=== From time to time my Avatar seems to get stuck ===&lt;br /&gt;
Right now there is a bottle neck when syncing prims off to the database.  This will cause small (5 - 10 second) apparent hangs of the Avatar, but it will recover fine once the data is synced.  It is a known issue based on legacy architecture of some of the data storage code.  We hope this will be removed soon.&lt;br /&gt;
&lt;br /&gt;
=== I have problems with viewing the worldmap ===&lt;br /&gt;
* This may happen when running OpenSim on a Linux server, both in grid or standalone mode.&lt;br /&gt;
* Symptoms: when opening the worldmap window in the SL-viewer, the sims are not displayed grahically in the worldmap, the server console shows some error related to openjpeg, the current session freezes...&lt;br /&gt;
* Reason: your svn source trunk does not have the correct (or whatever...) &amp;lt;tt&amp;gt;libopenjpeg-libsl&amp;lt;/tt&amp;gt; library.&lt;br /&gt;
* Other reason: the file &amp;quot;defaultstripe.png&amp;quot; does not exists in the same OpenSim folder, or is corrupted.&lt;br /&gt;
* Solution: get the newest code from libsecondlife (&amp;lt;tt&amp;gt;svn co svn://opensecondlife.org/libsl/trunk&amp;lt;/tt&amp;gt;), '&amp;lt;tt&amp;gt;make&amp;lt;/tt&amp;gt;' manually in the subdir &amp;lt;tt&amp;gt;openjpeg-libsl&amp;lt;/tt&amp;gt;, and copy the resulting &amp;lt;tt&amp;gt;libopenjpeg-libsl-2.1.2.0.so&amp;lt;/tt&amp;gt; into your OpenSim &amp;lt;tt&amp;gt;bin&amp;lt;/tt&amp;gt; subdir, overwriting the existing one.&lt;br /&gt;
* Recompile &amp;amp; restart OpenSim&lt;br /&gt;
&lt;br /&gt;
==Exceptions on the Console==&lt;br /&gt;
This is a list of Exceptions that you may see on the console, what they mean, and if they are a problem.&lt;br /&gt;
&lt;br /&gt;
===System.DllNotFoundException: ./libopenjpeg-libsl-2.1.2.0.so===&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;background:LavenderBlush; color:black&amp;quot; |&lt;br /&gt;
Failed generating terrain map: System.DllNotFoundException: ./libopenjpeg-libsl-2.1.2.0.so&lt;br /&gt;
: at (wrapper managed-to-native) OpenJPEGNet.OpenJPEG:LibslAllocDecoded OpenJPEGNet.OpenJPEG/LibslImage&amp;amp;)&lt;br /&gt;
: at OpenJPEGNet.OpenJPEG.Encode (System.Byte[] decoded, Int32 width, Int32 height, Int32 components, Boolean lossless) [0x00000]&lt;br /&gt;
:at OpenJPEGNet.OpenJPEG.EncodeFromImage (System.Drawing.Bitmap bitmap, Boolean lossless) [0x00000]&lt;br /&gt;
:at OpenSim.Region.Terrain.TerrainEngine.ExportJpegImage (System.String gradientmap) [0x00000]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You are on Linux, and the native lib libopenjpeg-libsl-2.1.2.0.so is not compatible with your system for one of the following reasons:&lt;br /&gt;
* You have an old processor (libopenjpeg has been compiled with optimizations)&lt;br /&gt;
* You are running in 64bit mode (none of the native libs are built for 64bit)&lt;br /&gt;
&lt;br /&gt;
You can rebuild your own libopenjpeg from source, or run in a compatible environment.&lt;br /&gt;
You can do this by:&lt;br /&gt;
 svn co svn://openmv.org/libsl/libopenmetaverse/trunk libsl&lt;br /&gt;
 cd libsl/openjpeg-libsl/&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
then copy libopenjpeg-libsl-2.1.2.0.so into OpenSim bin-folder.&lt;br /&gt;
&lt;br /&gt;
=== System.NullReferenceException at OpenSim.Region.Communications.Local.LocalLoginService.PrepareLoginToRegion ===&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;background:LavenderBlush; color:black&amp;quot; |&lt;br /&gt;
[LOGIN END]: XMLRPC Login failed, System.NullReferenceException: Object reference not set to an instance of an object&lt;br /&gt;
:at OpenSim.Region.Communications.Local.LocalLoginService.PrepareLoginToRegion (OpenSim.Framework.RegionInfo regionInfo, OpenSim.Framework.UserProfileData user, OpenSim.Framework.Communications.LoginResponse response) [0x00000] in /home/sim/svn/opensim/OpenSim/Region/Communications/Local/LocalLoginService.cs:293&lt;br /&gt;
:at OpenSim.Region.Communications.Local.LocalLoginService.CustomiseResponse (OpenSim.Framework.Communications.LoginResponse response, OpenSim.Framework.UserProfileData theUser, System.String startLocationRequest) [0x00520] in /home/sim/svn/opensim/OpenSim/Region/Communications/Local/LocalLoginService.cs:253&lt;br /&gt;
:at OpenSim.Framework.Communications.LoginService.XmlRpcLoginMethod (Nwc.XmlRpc.XmlRpcRequest request) [0x00369] in /home/sim/svn/opensim/OpenSim/Framework/Communications/LoginService.cs:252&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Your first startup of OpenSim has failed for example due to giving non existent domain name when prompted for region external host name. This causes only partial initialization. You need to delete bin folder, do svn update, rebuild and purge database to resolve this issue.&lt;br /&gt;
&lt;br /&gt;
=== Exception: System.NotImplementedException: The requested feature is not implemented. ===&lt;br /&gt;
  &lt;br /&gt;
If your exception starts as follows:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;background:LavenderBlush; color:black&amp;quot; |&lt;br /&gt;
|Exception: System.NotImplementedException: The requested feature is not implemented.&lt;br /&gt;
  at (wrapper managed-to-native) System.Threading.Interlocked:Add (int&amp;amp;,int)&lt;br /&gt;
  at System.Threading.ReaderWriterLockSlim.TryEnterReadLock (Int32 millisecondsTimeout) [0x000e3] in&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
You probably unwittingly passed the option '''--optimize=-all''' to mono. The problem is that Mono compiles in an &amp;quot;optimized&amp;quot; version of the System.Threading.Interlocked class's methods; these optimizations are done using raw assembler for your architecture (automatically detected at build time). When you pass '''--optimize=-all''', the runtime detects that these functions are optimized, and disables them. So the next time a class tries to call these functions, the runtime finds that there is no native implementation of the methods! This affects almost all synchronization primitives System.Threading. Since OpenSimulator relies heavily on threading and locking mechanisms, we can't do without this functionality. Perhaps a future Mono version will allow you to pass '''--optimize=-all''', and provide an unoptimized implementation (e.g. pthreads), rather than throwing an exception.&lt;br /&gt;
&lt;br /&gt;
If you're looking to debug a low level problem with mono (such as an error in native code), passing '''--optimize=-all''' is not the way to go about it. Instead, set the environment variable MONO_LOG_LEVEL=debug and run your program with the '''--debug''' switch passed to mono. You can also run mono under gdb, just like any other process.&lt;br /&gt;
&lt;br /&gt;
==Grid Mode==&lt;br /&gt;
&lt;br /&gt;
=== I start the sim and it doesn't connect to any grid ===&lt;br /&gt;
&lt;br /&gt;
When OpenSim is first started, it needs configuration.&lt;br /&gt;
&lt;br /&gt;
* See [[OpenSim: Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== My grid works fine with one user but when two users login in the same time both get stuck ===&lt;br /&gt;
* Make sure you have export MONO_THREADS_PER_CPU=&amp;quot;100&amp;quot; in your environment&lt;br /&gt;
&lt;br /&gt;
=== After ~20 minutes my region starts to take 100% cpu and region(s) hang ===&lt;br /&gt;
* If you have mono 1.9.1 or lower upgrade to mono 2.2.&lt;br /&gt;
&lt;br /&gt;
==Hypergrid==&lt;br /&gt;
===After starting OpenSim with Hypergrid enabled my inventory wont load!===&lt;br /&gt;
*If you're running in grid mode, first check your OpenSim.ini to make sure that the dns names or addresses for your grid servers are accessible to both you and the public.&lt;br /&gt;
*Check the XML config files for your UGAIM servers to make sure that everything is running off of a publicly accessible IP address.&lt;br /&gt;
**If this is the case and you have to change your UGAIM addresses you will need to run a few quick and dirty SQL queries on your database in order to update your grid's user accounts so that they now point to the new IP addresses of your UGAIM.&lt;br /&gt;
&lt;br /&gt;
Log into your sql server and change over to the database for your grid.  The following will update your user's home inventory and asset URIs after changing the addresses of your UGAIM services in the XML configuration files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div align = center&amp;gt;&amp;lt;B&amp;gt;!!!!WARNING!!!! - Be smart!  Always make a backup of your databases before making any changes to OpenSim! - !!!!WARNING!!!!&amp;lt;/b&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     update users set userInventoryURI=&amp;quot;http://new.UGAIM.address:8004&amp;quot; where userInventoryURI = &amp;quot;http://old.UGAIM.address:8004&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     update users set userAssetURI=&amp;quot;http://new.UGAIM.address:8003&amp;quot; where userAssetURI = &amp;quot;http://old.UGAIM.address:8003&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
*If you're running in standalone mode... - Anyone familiar with standalone want to fill this in?  -&lt;br /&gt;
[[Category:Users]]&lt;br /&gt;
&lt;br /&gt;
== ScriptEngine Issues ==&lt;br /&gt;
=== Got &amp;quot;Primitive: Error compiling script: unknown char: . error&amp;quot; when compiling script ===&lt;br /&gt;
When trying to compile a script ( using [[DotNetEngine]] or [[XEngine]] ) you could have this error :&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;background:LavenderBlush; color:black&amp;quot; |&lt;br /&gt;
Primitive: Error compiling script:&lt;br /&gt;
unknown char: .&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
And on the console :&lt;br /&gt;
{|&lt;br /&gt;
| style=&amp;quot;background:LavenderBlush; color:black&amp;quot; |&lt;br /&gt;
11:06:37 - [ScriptEngine.DotNetEngine]: Unloading script&amp;lt;br&amp;gt;&lt;br /&gt;
11:06:37 - Exception in MaintenanceLoopThread. Thread will recover after 5 sec throttle. Exception: System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.&lt;br /&gt;
:at System.Collections.Generic.Dictionary`2[OpenSim.Region.ScriptEngine.Interfaces.IEventReceiver, OpenSim.Region.ScriptEngine.Shared.Api.Plugins.Dataserver].get_Item (IEventReceiver key) [0x00000]&lt;br /&gt;
:at OpenSim.Region.ScriptEngine.Shared.Api.AsyncCommandManager.RemoveScript (IEventReceiver engine, UInt32 localID, UUID itemID) [0x00000]&lt;br /&gt;
:at OpenSim.Region.ScriptEngine.DotNetEngine.ScriptManager._StopScript (UInt32 localID, UUID itemID) [0x00000]&lt;br /&gt;
:at OpenSim.Region.ScriptEngine.DotNetEngine.ScriptManager.DoScriptLoadUnload () [0x00000]&lt;br /&gt;
:at OpenSim.Region.ScriptEngine.DotNetEngine.MaintenanceThread.MaintenanceLoop () [0x00000]&lt;br /&gt;
11:06:37 - [ScriptEngine.DotNetEngine]: Loading script&amp;lt;br&amp;gt;&lt;br /&gt;
11:06:37 - [ScriptEngine.DotNetEngine]: ScriptManager StartScript: localID: 720001, itemID: 88c9d28c-6004-4609-a707-717190de044a&amp;lt;br&amp;gt;&lt;br /&gt;
11:06:37 - [Compiler]: Compiled new assembly for fad15951-f9aa-493f-be68-2aaf5ff8a3c9&amp;lt;br&amp;gt;&lt;br /&gt;
11:06:37 - [SCRIPT]: Compiled assetID fad15951-f9aa-493f-be68-2aaf5ff8a3c9: ScriptEngines/a83150da-1ab1-11dd-89fb-0014853ee9da/CommonCompiler_compiled_fad15951-f9aa-493f-be68-2aaf5ff8a3c9.dll&amp;lt;br&amp;gt;&lt;br /&gt;
11:06:37 - [ScriptEngine.DotNetEngine]: AppDomain Loading: OpenSim.Region.ScriptEngine.Shared, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This happens on '''linux''' when your locales are not set to default ( &amp;quot;C&amp;quot; ).&lt;br /&gt;
* You could refer to [http://opensimulator.org/mantis/view.php?id=2088 Mantis #2088] and [http://opensimulator.org/mantis/view.php?id=2015 Mantis #2015] for a workaround to run opensim.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
env LANG=C mono --debug OpenSim.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* You could also change your locale setup. Here is what I use in my '.bash_profile' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export LC_ALL=C&lt;br /&gt;
export LANG=C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
I know it's a ugly way to setup locales on a linux box, but it works fine on my '''Linux From Scratch''' box.&lt;br /&gt;
&lt;br /&gt;
'''Rq''': I saw Melanie has corrected some parts of the source code a few weeks ago to avoid such problems.&lt;br /&gt;
&lt;br /&gt;
=== Get &amp;quot;Primitive: Error compiling script: ApplicationName='gmcs', ...&amp;quot; when compiling script ===&lt;br /&gt;
When trying to compile a script ( using DotNetEngine or XEngine ) you have an error something like :&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
| style=&amp;quot;background:LavenderBlush; color:black&amp;quot; |&lt;br /&gt;
Primitive: Error compiling script:&amp;lt;br&amp;gt;&lt;br /&gt;
ApplicationName='gmcs', CommandLine='/target:library /debug+ /optimize- /out:&lt;br /&gt;
:&amp;quot;ScriptEngines/430c29d0-c5c6-11dd-ad8b-0800200c9a66/CommonCompiler_compiled_fbe5e682-afae-4f1a-805b-0125031101f7.dll&amp;quot; &lt;br /&gt;
:/r:&amp;quot;/usr/lib/opensim/bin/OpenSim.Region.ScriptEngine.Shared.dll&amp;quot;&lt;br /&gt;
:/r:&amp;quot;/usr/lib/opensim/bin/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.dll&amp;quot;  -- &lt;br /&gt;
:&amp;quot;/tmp/11b81aac/594d02ce.0.cs&amp;quot; ', CurrentDirectory=''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Other features include &amp;quot;Touch&amp;quot; being disabled on the right click menu wheel.&lt;br /&gt;
&lt;br /&gt;
You might have a broken mono install (i.e. discovered as mono but not gmcs installed on a Ubuntu 8.10 Intrepid machine.)&lt;br /&gt;
&lt;br /&gt;
Check mono-gmcs (sudo apt-get install mono-gmcs) is correctly installed.&lt;br /&gt;
&lt;br /&gt;
== Locales Issues ==&lt;br /&gt;
Well, some of us, OpenSim users, ran into random crash of the OpenSim Region server in grid mode ... &lt;br /&gt;
&lt;br /&gt;
I have made many tests to find a solution about that problem.&lt;br /&gt;
&lt;br /&gt;
I first ran into this problem with OpenSIM SVN.6660 ... Even if I have no users connected, my OpenSim region server randomly crash ( after 1 hour, or 5 hours, ... ).&lt;br /&gt;
&lt;br /&gt;
My first idea was to upgrade to the latest SVN release, no chance, same problem. So I made a test with a previous SVN release ( SVN.6575 ) which is running fine on another server ( same OS, same parameters, same mono release, ... ) : No chance, same problem.&lt;br /&gt;
&lt;br /&gt;
Then, I tried to play with locales, recompile the '''screen''' unix command line utility I use to run my servers, ... No chance again.&lt;br /&gt;
&lt;br /&gt;
So, I checked the memory usage on my Server, and I discovered that with the last SVN release, the amount of memory needed to run OpenSim server in multi-region/grid mode increased :) ... So, I have tuned my MySQL server to use less memory. Was better, but my OpenSim region server still randomly crash ( but could stay alive longer than before ).&lt;br /&gt;
&lt;br /&gt;
Then, trying to play with the '''screen''' command line options ... And all my tests shows that the '''--debug''' option impact the stability of the server.&lt;br /&gt;
&lt;br /&gt;
Initially, I used such command line to run OpenSim :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/screen -S Region-service -d -m --debug mono OpenSim.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Without the '''--debug''' option, everything seems to be more stable.&lt;br /&gt;
&lt;br /&gt;
About locales, if you read mantis and threads in opensim-dev / opensim-users, you know that there are issues on system that are not &amp;quot;en_US&amp;quot; or &amp;quot;C&amp;quot; local compliant.&lt;br /&gt;
&lt;br /&gt;
I have re-setup my server to be full &amp;quot;en_US.UTF8&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
On my Ubuntu 8.0.4 server :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /etc/default/locale&lt;br /&gt;
LANG=&amp;quot;en_US.UTF-8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# cat /var/lib/locales/supported.d/local&lt;br /&gt;
fr_FR.UTF-8 UTF-8&lt;br /&gt;
en_US.UTF-8 UTF-8&lt;br /&gt;
&lt;br /&gt;
# cat /etc/environment&lt;br /&gt;
PATH=&amp;quot;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games&amp;quot;&lt;br /&gt;
LANG=&amp;quot;en_US&amp;quot;&lt;br /&gt;
LANGUAGE=&amp;quot;en_US&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
And maybe you should need :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# sudo dpkg-reconfigure locales&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So, the resulting '''screen''' command line options should be :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
screen -S Region-service -d -m -U mono OpenSim.exe&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This allow me to run OpenSim SVN.6575 without crash during more than 48 hours, and also SVN.6735 ... &lt;br /&gt;
&lt;br /&gt;
Hope those informations could help peoples.&lt;br /&gt;
&lt;br /&gt;
Just for your information : &lt;br /&gt;
&lt;br /&gt;
Here is my '''OpenSim Startup script''' :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;User-Service...&amp;quot;&lt;br /&gt;
/usr/local/bin/screen -S User-service -d -m -U mono OpenSim.Grid.UserServer.exe&lt;br /&gt;
sleep 5&lt;br /&gt;
echo &amp;quot;Grid-Service...&amp;quot;&lt;br /&gt;
/usr/local/bin/screen -S Grid-service -d -m -U mono OpenSim.Grid.GridServer.exe&lt;br /&gt;
sleep 5&lt;br /&gt;
echo &amp;quot;Asset-Service...&amp;quot;&lt;br /&gt;
/usr/local/bin/screen -S Asset-service -d -m -U mono OpenSim.Grid.AssetServer.exe&lt;br /&gt;
sleep 10&lt;br /&gt;
echo &amp;quot;Inventory-Service...&amp;quot;&lt;br /&gt;
/usr/local/bin/screen -S Inventory-service -d -m -U mono OpenSim.Grid.InventoryServer.exe&lt;br /&gt;
sleep 5&lt;br /&gt;
echo &amp;quot;Region-Service...&amp;quot;&lt;br /&gt;
/usr/local/bin/screen -S Region-service -d -m -U mono OpenSim.exe&lt;br /&gt;
sleep 5&lt;br /&gt;
echo &amp;quot; &amp;quot;&lt;br /&gt;
echo &amp;quot; &amp;quot;&lt;br /&gt;
/usr/local/bin/screen -list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is also a small script that give you a menu to connect to the '''screen(s)''' sessions :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use Term::Menu;&lt;br /&gt;
&lt;br /&gt;
my $EXIT = 1;&lt;br /&gt;
&lt;br /&gt;
my $MainTitle = &amp;quot;+-----------------------------------------------------+\n&amp;quot;;&lt;br /&gt;
$MainTitle .= &amp;quot;|        Connexion SCREEN aux Serveurs OPENSIM        |\n&amp;quot;;&lt;br /&gt;
$MainTitle .= &amp;quot;|                                                     |\n&amp;quot;;&lt;br /&gt;
$MainTitle .= &amp;quot;|    ( Type CTRL+A+D to exit the Screen Console. )    |\n&amp;quot;;&lt;br /&gt;
$MainTitle .= &amp;quot;+-----------------------------------------------------+\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
while ( $EXIT == 1 )&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
  system(&amp;quot;screen -list | grep service &amp;gt; /tmp/osg.services&amp;quot;);&lt;br /&gt;
  my %LIST = ();&lt;br /&gt;
  open(IN, &amp;quot;/tmp/osg.services&amp;quot;);&lt;br /&gt;
  while ( my $i = &amp;lt;IN&amp;gt; )&lt;br /&gt;
  {&lt;br /&gt;
    chomp($i);&lt;br /&gt;
&lt;br /&gt;
    $i =~ s/\./#/g;&lt;br /&gt;
    $i =~ s/\-service\t/#/g;&lt;br /&gt;
    $i =~ s/\t//g;&lt;br /&gt;
    $i =~ s/\(//g;&lt;br /&gt;
    $i =~ s/\)//g;&lt;br /&gt;
&lt;br /&gt;
    my @STATUS = split(/#/, $i);&lt;br /&gt;
    $LIST{$STATUS[1]} = $STATUS[2];&lt;br /&gt;
  }&lt;br /&gt;
  close(IN);&lt;br /&gt;
&lt;br /&gt;
  my %LIST2 = ();&lt;br /&gt;
  my @indices = ('User', 'Grid', 'Asset', 'Inventory', 'Region');&lt;br /&gt;
&lt;br /&gt;
  foreach my $key ( @indices )&lt;br /&gt;
  {&lt;br /&gt;
    # print &amp;quot;$key --&amp;gt; $LIST{$key}\n&amp;quot;;&lt;br /&gt;
    if ( $LIST{$key} =~ /Attached/ )&lt;br /&gt;
    {&lt;br /&gt;
      $LIST2{$key} = &amp;quot;[X]&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
      $LIST2{$key} = &amp;quot;[ ]&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( $LIST{'User'} =~ /Attached/ )&lt;br /&gt;
  {&lt;br /&gt;
    $LIST2{'USER'} = &amp;quot;X&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  else&lt;br /&gt;
  {&lt;br /&gt;
    $LIST2{'USER'} = &amp;quot;-&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  system ('clear');&lt;br /&gt;
  my $prompt = new Term::Menu (&lt;br /&gt;
    spaces =&amp;gt; 3,&lt;br /&gt;
    aftertext =&amp;gt; &amp;quot;\nChoisir une option : &amp;quot;,&lt;br /&gt;
    beforetext =&amp;gt; ${MainTitle},&lt;br /&gt;
    delim =&amp;gt; &amp;quot;. &amp;quot;,&lt;br /&gt;
  );&lt;br /&gt;
&lt;br /&gt;
  my $SEP = &amp;quot;                   &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  my $answer = $prompt-&amp;gt;menu(&lt;br /&gt;
                osg_user       =&amp;gt; [&amp;quot;OpenSim User Server       $SEP$LIST2{'User'}&amp;quot;,  '1'],&lt;br /&gt;
                osg_grid       =&amp;gt; [&amp;quot;OpenSim Grid Server       $SEP$LIST2{'Grid'}&amp;quot;,  '2'],&lt;br /&gt;
                osg_asset      =&amp;gt; [&amp;quot;OpenSim Asset Server      $SEP$LIST2{'Asset'}&amp;quot;,  '3'],&lt;br /&gt;
                osg_inventory  =&amp;gt; [&amp;quot;OpenSim Inventory Server  $SEP$LIST2{'Inventory'}&amp;quot;,  '4'],&lt;br /&gt;
                osg_region     =&amp;gt; [&amp;quot;OpenSim Region Server     $SEP$LIST2{'Region'}\n&amp;quot;,  '5'],&lt;br /&gt;
                osg_shutdown   =&amp;gt; [&amp;quot;Shutdown Servers (Manual)&amp;quot;,'6'],&lt;br /&gt;
                osg_shutdown2  =&amp;gt; [&amp;quot;Shutdown Servers (Hard)\n&amp;quot;,'7'],&lt;br /&gt;
                quit    =&amp;gt; [&amp;quot;Quitter&amp;quot;, 'q'],&lt;br /&gt;
                            );&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;quit&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    $EXIT = 0;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;osg_user&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    system(&amp;quot;screen -d -r -S User-service&amp;quot;);&lt;br /&gt;
    $EXIT = 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;osg_grid&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Grid-service&amp;quot;);&lt;br /&gt;
    $EXIT = 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;osg_asset&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Asset-service&amp;quot;);&lt;br /&gt;
    $EXIT = 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;osg_inventory&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Inventory-service&amp;quot;);&lt;br /&gt;
    $EXIT = 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;osg_region&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Region-service&amp;quot;);&lt;br /&gt;
    $EXIT = 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;osg_shutdown&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Region-service&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Inventory-service&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Asset-service&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -d -r -S Grid-service&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -d -r -S User-service&amp;quot;);&lt;br /&gt;
    $EXIT = 1;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( &amp;quot;${answer}&amp;quot; eq &amp;quot;osg_shutdown2&amp;quot; )&lt;br /&gt;
  {&lt;br /&gt;
    # system(&amp;quot;/OPENSIM/shutdownGrid.py&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -S Region-service -r -m -X quit&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -S Inventory-service -r -m -X quit&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -S Asset-service -r -m -X quit&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -S Grid-service -r -m -X quit&amp;quot;);&lt;br /&gt;
    system(&amp;quot;screen -S User-service -r -m -X quit&amp;quot;);&lt;br /&gt;
    $EXIT = 0;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Regards, &lt;br /&gt;
Ursula Matova.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-02-28T16:49:27Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[Modules]''' section)&lt;br /&gt;
** AutoBackupModule: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Per Region (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
* '''IMPORTANT:''' These settings use &amp;quot;RegionName.Setting&amp;quot; notation to construct the key name. So, to specify the AutoBackupInterval key for region &amp;quot;Foo&amp;quot;, your key would be named '''Foo.AutoBackupInterval'''.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
** AutoBackupDilationThreshold: float. Default: 0.5. Lower bound on time dilation required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the time dilation is below this value, don't take a backup right now.&lt;br /&gt;
** AutoBackupAgentThreshold: int. Default: 10. Upper bound on # of agents in region required for BusyCheck heuristics to pass.&lt;br /&gt;
*** If the number of agents is greater than this value, don't take a backup right now.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-02-25T13:51:08Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Global (in '''OpenSim.ini''' under '''[Modules]''' section)&lt;br /&gt;
** AutoBackupModule: '''True/False'''. Default: False. If False, every function in the module is as no-op as possible: just return as soon as realizing that we're not enabled. Otherwise it will try to get as far as it can with auto backup for each region.&lt;br /&gt;
* Per Region (in '''OpenSim.ini''' under '''[AutoBackupModule]''' section)&lt;br /&gt;
* '''IMPORTANT:''' These settings use &amp;quot;RegionName.Setting&amp;quot; notation to construct the key name. So, to specify the AutoBackupInterval key for region &amp;quot;Foo&amp;quot;, your key would be named '''Foo.AutoBackupInterval'''.&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-02-19T14:37:50Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Per Region (in e.g. Regions/Regions.ini)&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupNaming: string. Default: Time.&lt;br /&gt;
*** One of three strings (case insensitive):&lt;br /&gt;
*** &amp;quot;Time&amp;quot;: Current timestamp is appended to file name. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Sequential&amp;quot;: A number is appended to the file name. So if RegionName_x.oar exists, we'll save to RegionName_{x+1}.oar next. An existing file will never be overwritten.&lt;br /&gt;
*** &amp;quot;Overwrite&amp;quot;: Always save to file named &amp;quot;RegionName.oar&amp;quot;, even if we have to overwrite an existing file.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-02-19T13:23:49Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Per Region (in e.g. Regions/Regions.ini)&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
** AutoBackupOverwrite: True/False. Default: False. If true, each auto-backup overwrites a single file named &amp;quot;${AutoBackupDir}/RegionName.oar&amp;quot;. If false, the current timestamp is appended to the file name, thus creating a new file each backup.&lt;br /&gt;
** AutoBackupDir: String. Default: &amp;quot;.&amp;quot; (the current directory).	A directory (absolute or relative) where backups should be saved. If the path is not a directory, or insufficient permissions are available, a warning will be printed to the console and no backups will be taken.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-02-19T11:46:12Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: /* Configuration Settings */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Per Region (in e.g. Regions/Regions.ini)&lt;br /&gt;
** AutoBackup: '''True/False'''. Default: False. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region, and all other AutoBackup* settings are ignored.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. Default: 720 (12 hours). The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. Default: True. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. Default: not specified (disabled). File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR. If the process can't be spawned for some reason (file not found, no execute permission, etc), write a warning to the console.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-02-19T11:41:44Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Configuration Settings ===&lt;br /&gt;
&lt;br /&gt;
* Per Region (in e.g. Regions/Regions.ini)&lt;br /&gt;
** AutoBackup: '''True/False'''. If True, activate auto backup functionality. This is the only '''required''' option for enabling auto-backup; the other options have sane defaults. If False, the auto-backup module becomes a no-op for the region.&lt;br /&gt;
** AutoBackupInterval: '''Integer''', non-negative value. The number of minutes between each backup attempt. If a negative or zero value is given, it is equivalent to setting AutoBackup = False.&lt;br /&gt;
** AutoBackupBusyCheck: '''True/False'''. If True, we will only take an auto-backup if a set of conditions are met. These conditions are heuristics to try and avoid taking a backup when the sim is busy.&lt;br /&gt;
** AutoBackupScript: '''String'''. File path to an executable script or binary to run when an automatic backup is taken. argv[1] of the executed file/script will be the file name of the generated OAR.&lt;br /&gt;
&lt;br /&gt;
=== Busy Heuristics ===&lt;br /&gt;
&lt;br /&gt;
PROCRASTINATE means &amp;quot;don't save an OAR right now; wait '''AutoBackupInterval / 2''' minutes and then try again.&amp;quot;&lt;br /&gt;
PROCEED means &amp;quot;try the next heuristic&amp;quot; -- all heuristic conditions must evaluate to &amp;quot;PROCEED&amp;quot; to actually save an OAR.&lt;br /&gt;
&lt;br /&gt;
* Ideas for busy heuristics include:&lt;br /&gt;
** Is the Time Dilation at the present time &amp;lt; 0.50? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupDilationThreshold''' to allow the user to set the minimum time dilation required for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Are there more than 10 Main Agents on the region right now? If so, PROCRASTINATE. Otherwise, PROCEED. At the risk of option bloat, introduce '''AutoBackupAgentThreshold''' to allow the user to set the maximum number of agents that can be present for a PROCEED on this heuristic. Implementation difficulty: '''Low'''. Performance cost: '''Low'''.&lt;br /&gt;
** Avatar &amp;quot;density&amp;quot; (calculated by the average proximity between avatars on the sim)? This seems expensive for a test to avoid a big performance hit, so we may not want to do this. But this would be a pretty good heuristic for smartly detecting meetings and events, since that usually involves avatars in relatively close proximity. Implementation difficulty: '''Medium'''. Performance cost: '''Unknown/High'''.&lt;br /&gt;
&lt;br /&gt;
=== Reducing Impact Of OAR Backup ===&lt;br /&gt;
&lt;br /&gt;
This is slightly out of the scope of this feature, but it could certainly ease acceptance of this feature and make the general practice of saving OARs more acceptable on busy sims, which would in turn reduce the need for the heuristics, and allow more users to set AutoBackupBusyCheck = False and not worry about it. Here are a few brainstormed ideas for improving the performance of OAR saving; this might even belong in its own feature proposal:&lt;br /&gt;
&lt;br /&gt;
* Faster compression. Use a lower compression ratio for Gzip, or use a faster algorithm like LZO. Reference credible papers on lossless compression performance; find the codec with a compatibly-licensed implementation (BSD/MIT) with the least compression performance cost; implement. Changing the OAR file format might require some kind of transition, e.g., detect which format the `load oar' is in, and automatically support both Gzip and the new format (whichever that turns out to be). That shouldn't be too hard with the use of extremely conspicuous file format magic numbers that are very common with these formats.&lt;br /&gt;
* JSON instead of XML. I've heard from sources in the embedded world that you can save quite a lot of CPU cycles by using JSON instead of XML, because there are fewer and less complex structural elements to parse  (on the read) and generate (on the write).&lt;br /&gt;
* Faster asset serialization -- this is probably where a lot of the time is consumed, writing out assets. We should really profile this code and figure out where most of the time is spent. Are images being encoded into compressed file formats, and then compressed again in the OAR? Note that compressing already-compressed data is a spectacular waste of time, because you bring out worst-case behavior in the outer compression codec as it tries to extract a little more entropy out of the already-compressed data. Usually it ends up making the file size even larger due to file format overhead.&lt;br /&gt;
** My recommendation is that we leave already-compressed assets as-is and just tar them up together, and have a .gz file inside the tar with the compressible data, like XML or JSON. This will minimize file size and possibly speed up compression, since the outer compression codec won't have to sweat the high-entropy compressed data.&lt;br /&gt;
* Use the operating system scheduler to our advantage. Instead of writing the GZipStream data as quickly as possible, use asynchronous writes, and put some yields in at appropriate places. This would effectively make the archive process take longer, but give up some scheduling slots for other threads to execute. The other option would be to offload the most resource-intensive parts of the operation to a separate process (e.g. compression), and set that process's scheduling priority to minimal. The improvement you'd see from this would be extremely dependent on the OS: on Windows, starting a process has an extremely high overhead, especially with virus scanners and having to load another instance of .NET. Recent Linux 2.6 is much more efficient at sharing data and spawning processes quickly, and low priority scheduling has a noticeable impact on resource usage on Linux.&lt;br /&gt;
* Amortize the cost of preparing data for archiving by using spare cycles to prepare the assets' memory stream. This could open up a whole different opportunity for activity-based backup scheduling: when the region is at a particularly low point of activity, you could just take a backup whenever you are able to reach a high level of confidence that things are not busy.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals</id>
		<title>Feature Proposals</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals"/>
				<updated>2011-02-18T14:41:38Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Feature Proposals =&lt;br /&gt;
&lt;br /&gt;
This is a list of feature proposals for future work on OpenSimulator. &lt;br /&gt;
&lt;br /&gt;
The purpose of feature proposals is to provide a semi-formal &amp;quot;write-up&amp;quot; of features that are actively being investigated/worked on, for developers and power users to read and provide feedback. The criteria for creating a Feature Proposal should be the following:&lt;br /&gt;
&lt;br /&gt;
* The feature should be as modular as possible, and designed in such a way as to have minimal intrusiveness on the rest of the system.&lt;br /&gt;
* The feature proposal should pertain only to OpenSimulator. You may mention how this will affect other software (such as viewers), but technical details and progress should remain focused on OpenSimulator.&lt;br /&gt;
* The feature should have at least one developer sponsor. Users (who are not also developers) wishing to request a new feature may do so on Mantis.&lt;br /&gt;
* The feature should be software-oriented, not content-oriented. Content creation has its own section on the Wiki and elsewhere.&lt;br /&gt;
* The feature should not describe a '''defect''' in the software. A defect is where a feature ''has'' been implemented, and ''should'' work correctly, but due to technical difficulties it doesn't work properly or at all.&lt;br /&gt;
* The feature should require at least a few hours of work for a seasoned developer. Items that can be trivially completed should be submitted as a bug on Mantis, or come up with a patch outright.&lt;br /&gt;
&lt;br /&gt;
The general process of developing a new feature can be described as follows:&lt;br /&gt;
&lt;br /&gt;
1. Get an idea.&lt;br /&gt;
&lt;br /&gt;
2. Refine the idea, and brainstorm on how it could be implemented technically.&lt;br /&gt;
&lt;br /&gt;
3. Write up a feature proposal describing in detail how you would implement the idea in OpenSimulator.&lt;br /&gt;
&lt;br /&gt;
4. Solicit user and developer feedback about the idea: is it generally useful? Is the design clean and modular? Is there sufficient interest to warrant the work, versus the implementation difficulty?&lt;br /&gt;
&lt;br /&gt;
5. Incorporate feedback into proposal as necessary.&lt;br /&gt;
&lt;br /&gt;
6. Implement feature, updating proposal as necessary.&lt;br /&gt;
&lt;br /&gt;
7. ???&lt;br /&gt;
&lt;br /&gt;
8. Get feature merged to trunk.&lt;br /&gt;
&lt;br /&gt;
9. Update feature proposal page one last time, indicating completion, and providing links (if any) to user documentation describing the final instructions for how to use the feature.&lt;br /&gt;
&lt;br /&gt;
== Active Feature Proposals ==&lt;br /&gt;
&lt;br /&gt;
These feature proposals are actively being worked on. This just means that the developer sponsor(s) consider the feature a work in progress; they intend to complete the feature; and we are still able to contact them. &amp;quot;Active&amp;quot; status has nothing to do with the frequency of code commits, and everything to do with the intentions of the developer sponsor(s).&lt;br /&gt;
&lt;br /&gt;
*[[Feature_Proposals/AutoBackup|AutoBackup]]&lt;br /&gt;
&lt;br /&gt;
== Stalled Feature Proposals ==&lt;br /&gt;
&lt;br /&gt;
These are feature proposals that have been abandoned, either voluntarily by the developer sponsor(s), or due to other reasons. A stalled feature proposal can and should be resumed by volunteer developers who find the proposal to be worthy of their time and effort, because we are reasonably certain that the original developer is no longer working on the feature.&lt;br /&gt;
&lt;br /&gt;
== Completed Feature Proposals ==&lt;br /&gt;
&lt;br /&gt;
The features listed below are here for historical reasons, but they are done and implemented into OpenSim in some form or another.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example Feature Proposal ==&lt;br /&gt;
&lt;br /&gt;
Here is an [[Feature_Proposals/Example|Example]] feature proposal. Feel free to deviate from this format, but I found that it works for me.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/AutoBackup</id>
		<title>Feature Proposals/AutoBackup</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/AutoBackup"/>
				<updated>2011-02-18T14:24:18Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: New page: = Automatic Region Backup =  == Basic Info ==  * '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini. * '''Developer Sponso...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Automatic Region Backup =&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': A new module for periodically saving per-region backup OARs according to rules defined in Regions.ini.&lt;br /&gt;
* '''Developer Sponsor(s)''': [http://opensimulator.org/wiki/User:Allquixotic allquixotic]&lt;br /&gt;
* '''Start Date''': February 18, 2011&lt;br /&gt;
* '''Branches Targeted''': git master&lt;br /&gt;
* '''Commercial''': No&lt;br /&gt;
* '''Code Repository''': https://github.com/allquixotic/opensim-autobackup&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
Currently, saving OARs in an organized manner requires significant hackery in the way of scripts or other external wrappers. This project is an attempt to get automatic OAR backup as a core capability of OpenSim.&lt;br /&gt;
&lt;br /&gt;
* On a '''Per-Region''' basis, we want to give the user the opportunity:&lt;br /&gt;
** To enable/disable automatic periodic backups of their region to an OAR.&lt;br /&gt;
** To specify the length of time between automatic backups.&lt;br /&gt;
** To invoke an external shell script or binary when a backup is taken (e.g. to transport to an offsite backup over FTP or S3).&lt;br /&gt;
** To choose between overwriting a single file over and over, or saving a series of files whose name includes the timestamp of the OAR.&lt;br /&gt;
** To enable or disable some simple logic that attempts to determine whether the sim is &amp;quot;busy&amp;quot;, in which case no backup will be taken (because starting a backup can cause performance degradation).&lt;br /&gt;
&lt;br /&gt;
Just to emphasize, all of these choices will be available completely separately for each region, regardless of whether the regions run in multiple instances or in one instance.&lt;br /&gt;
&lt;br /&gt;
Ideally, users will be able to customize these settings in Regions.ini to conveniently specify when to take backups, and for which regions.&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': The primary focus of the feature will be a new region module that keeps track of when regions need to be OARed, and other various state as gleaned from Regions.ini.&lt;br /&gt;
* '''Software Requirements''': No additional third-party dependencies or version bumps will be required.&lt;br /&gt;
* '''Impact''': The only existing modules that could conceivably be affected are the IRegionArchiverModule, and any files dealing with the options in the Regions.ini config file.&lt;br /&gt;
* '''Blockers''': No blockers yet, but I'm sure as time goes on...&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
* Proposed Module Name: IRegionAutoBackupModule&lt;br /&gt;
* Functionality Pseudocode:&lt;br /&gt;
** Parse out the options from Regions.ini for each region&lt;br /&gt;
** Set timers to wake up when the elapsed time for each region has expired. ''Optimization'': Merge timers into one with a list of regions to process if the time is the same. Cuts down on the number of timers.&lt;br /&gt;
** In a timer handler:&lt;br /&gt;
*** If the user wants us to check for busy conditions, then go through the conditions and make sure they all pass. Haven't determined what those conditions should be yet, but an obvious start is to set a reasonable avatar threshold, and examine the sim time dilation. If there are either &amp;quot;a lot&amp;quot; of avatars, or &amp;quot;a very low&amp;quot; time dilation, we probably don't want to kill the sim with an oar backup right now. But the user can bypass our logic if they want. Maybe we could add yet more options for the thresholds themselves, if we settle on e.g. time dilation and avatar count.&lt;br /&gt;
*** If we checked some conditions and one or more of them failed, put off the oar backup for (interval / 2) seconds and then try again, where &amp;quot;interval&amp;quot; is the original interval specified in Regions.ini, not the interval we were just asleep for.&lt;br /&gt;
*** Else: 1. Get the Scene object for the region(s) associated with this timer; get the IRegionArchiverModule interface; call HandleSaveOarConsoleCommand (or one of the other functions in the module?). The file name will either be the name of the region + &amp;quot;.oar&amp;quot;, or the name of the region + a friendly-formatted timestamp + &amp;quot;.oar&amp;quot;.&lt;br /&gt;
*** 2. Invoke the shell script associated with the region's backup event, as given in Regions.ini. Possible security issue, but then, allowing sysadmins to set threat level severe is not exactly secure...&lt;br /&gt;
*** 3. Reset the timer.&lt;br /&gt;
&lt;br /&gt;
The only functions that other modules need to call into this one will be the initialization stuff: creating the implementation object and setting it up to do its work. Then it basically runs in an infinite loop, periodically doing stuff. I anticipate being able to do everything in a single thread, but I'm not sure how threading is worked into the other modules. In particular, I need to know if IRegionArchiverModule is thread-safe, or if I need to enter into a specific thread or take some locks to use it.&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
This shouldn't be visible to end-users at all, but it will be very visible to OpenSim sysadmins. Sysadmins will edit Regions.ini to manage the config settings on a per-region basis. Maybe, for user-friendliness, we can have global config options in OpenSim.ini that serve as &amp;quot;default&amp;quot; options for the ones in Regions.ini, if they are not specified. The default will be to disable auto-backup altogether, but if a user enables auto-backup without specifying any other auto-backup config options, it'd be nice if they could set the rest of the options globally in OpenSim.ini. This would reduce the size of Regions.ini for very large numbers of regions, and make it trivial to merge the timers into one.&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
TBD! I am still learning about the OpenSim architecture, so pardon any layering violations / false assumptions I've made in my write-up :)&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:Allquixotic</id>
		<title>User:Allquixotic</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:Allquixotic"/>
				<updated>2011-02-18T13:55:56Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Me ==&lt;br /&gt;
&lt;br /&gt;
* 25 years old&lt;br /&gt;
* Male&lt;br /&gt;
* From Maryland, USA&lt;br /&gt;
* Software Engineer / Information Security Engineer&lt;br /&gt;
* Wide array of interests spanning most software development domains&lt;br /&gt;
* Focussed knowledge in GNU/Linux, Gstreamer, GTK+, Java, C#, and TCP/IP networking and protocols&lt;br /&gt;
* Have worked in a general IT setting; in a software engineering setting for smartphones; and presently in information security&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
* IRC (freenode): allquixotic&lt;br /&gt;
* Email: smcnam. Oh, you were wondering what domain I'm at, too, weren't you? Well, you'd have be a pretty smart spambot to get this far! I use Google's e-mail service -- the shortened version of &amp;quot;googlemail&amp;quot;.&lt;br /&gt;
* Yahoo: Same as IRC&lt;br /&gt;
* Google Talk/Jabber: Same as Email&lt;br /&gt;
* Secondlife (Agni) and OSgrid: Tiyuk Quellmalz&lt;br /&gt;
&lt;br /&gt;
== Why? ==&lt;br /&gt;
&lt;br /&gt;
Why am I interested in OpenSim? Because it's very hackable, being a high-level language with automatic memory management and objects, and written in a very modular way; and because I run a bunch of sims on OSgrid that I want to help flourish. Turns out we could really use certain features to get our sims working well, so I'm willing to put in the effort.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/User:Allquixotic</id>
		<title>User:Allquixotic</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/User:Allquixotic"/>
				<updated>2011-02-18T13:55:24Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: New page: == About Me ==  * 25 years old * Male * From Maryland, USA * Software Engineer / Information Security Engineer * Wide array of interests spanning most software development domains * Focuss...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== About Me ==&lt;br /&gt;
&lt;br /&gt;
* 25 years old&lt;br /&gt;
* Male&lt;br /&gt;
* From Maryland, USA&lt;br /&gt;
* Software Engineer / Information Security Engineer&lt;br /&gt;
* Wide array of interests spanning most software development domains&lt;br /&gt;
* Focussed knowledge in GNU/Linux, Gstreamer, GTK+, Java, C#, and TCP/IP networking and protocols&lt;br /&gt;
* Have worked in a general IT setting; in a software engineering setting for smartphones; and presently in information security&lt;br /&gt;
&lt;br /&gt;
== Contact ==&lt;br /&gt;
&lt;br /&gt;
* IRC (freenode): allquixotic&lt;br /&gt;
* Email: smcnam. Oh, you were wondering what domain I'm at, too, weren't you? Well, you'd have be a pretty smart spambot to get this far! I use Google's e-mail service -- the shortened version of &amp;quot;googlemail&amp;quot;.&lt;br /&gt;
* Yahoo: Same as IRC&lt;br /&gt;
* Google Talk/Jabber: Same as Email&lt;br /&gt;
&lt;br /&gt;
== Why? ==&lt;br /&gt;
&lt;br /&gt;
Why am I interested in OpenSim? Because it's very hackable, being a high-level language with automatic memory management and objects, and written in a very modular way; and because I run a bunch of sims on OSgrid that I want to help flourish. Turns out we could really use certain features to get our sims working well, so I'm willing to put in the effort.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/Example</id>
		<title>Feature Proposals/Example</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/Example"/>
				<updated>2011-02-18T13:36:51Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Example Feature =&lt;br /&gt;
&lt;br /&gt;
(''Guideline text is in italics like this.'')&lt;br /&gt;
&lt;br /&gt;
(''Please '''do not''' edit this example directly; instead, make a copy of the page from the edit window, and start your own page under the Feature_Proposals section!'')&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
(''You should be able to completely fill out this section during your first edit of your proposal.'')&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': (''A one- or two-sentence description of what your feature does. Be VERY brief!'')&lt;br /&gt;
* '''Developer Sponsor(s)''': (''Your Wiki name, email, etc.'')&lt;br /&gt;
* '''Start Date''': (''The date when you first started work on this feature'')&lt;br /&gt;
* '''Branches Targeted''': (''e.g. trunk, 0.6.x, etc.'')&lt;br /&gt;
* '''Commercial''': (''Yes/No: Is this feature directly driven by a business or commercial venture running on OpenSimulator?'')&lt;br /&gt;
* '''Code Repository''': (''A repository URL (SVN or Git preferred) where interested parties can get your code. If you haven't committed anything yet, that's fine; but please at least create your repository and make it public before you submit your proposal.'')&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
(''This is where you pitch your idea in detail. Paragraphs of prose, bullet points, and so forth are appropriate here. At a minimum, you should cover the following bases:&lt;br /&gt;
* What the purpose of the feature is&lt;br /&gt;
* Why users would want to use the feature&lt;br /&gt;
* Describe how users would use the feature in the ideal scenario&lt;br /&gt;
* Describe the status quo, i.e. what users currently have to live with'')&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
(''This is where you draw a box around the bounds of your project, letting us know where your feature starts and ends, how it impacts the rest of the system, etc. A few examples are provided.'')&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': (''Define what is and isn't within the scope of work you are willing to take on as part of the feature implementation.'')&lt;br /&gt;
* '''Software Requirements''': (''Mention any new third-party dependencies, version bumps or build system changes that would be necessary for implementation.'')&lt;br /&gt;
* '''Impact''': (''List which existing modules in the code-base may have to be modified to integrate with your feature.'')&lt;br /&gt;
* '''Blockers''': (''List any open issues, outside the scope of your feature, which may be required or strongly recommended before your feature can integrate with the rest of the system. Bonus points for links to Mantis bugs!'')&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
(''This is where you can start to think about things like: naming your module(s) and interface(s), defining an API, and describing how other modules in the system should change to work with your code. Including Unified Modelling Languages (UML) diagrams for complex systems is much appreciated!'')&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
(''How will the user interact with your feature? Assume that there is a compiled binary distribution of OpenSim with your fully-implemented feature, and assume an audience of a reasonably-experienced OpenSim sysadmin who is not necessarily experienced with software development. You should document things like console commands, configuration settings, script functions, etc. in this space.'')&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
(''Your actual code will be in your repository, but you can include additional details on design here if you want. For example, if your module exposes a complex API that other modules will want to use, you can list that API here. Other developers may be interested in working with you to revise the API before you start working on the implementation.'')&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals</id>
		<title>Feature Proposals</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals"/>
				<updated>2011-02-18T13:35:15Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: New page: = Feature Proposals =  This is a list of feature proposals for future work on OpenSimulator.   The purpose of feature proposals is to provide a semi-formal &amp;quot;write-up&amp;quot; of features that are ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Feature Proposals =&lt;br /&gt;
&lt;br /&gt;
This is a list of feature proposals for future work on OpenSimulator. &lt;br /&gt;
&lt;br /&gt;
The purpose of feature proposals is to provide a semi-formal &amp;quot;write-up&amp;quot; of features that are actively being investigated/worked on, for developers and power users to read and provide feedback. The criteria for creating a Feature Proposal should be the following:&lt;br /&gt;
&lt;br /&gt;
* The feature should be as modular as possible, and designed in such a way as to have minimal intrusiveness on the rest of the system.&lt;br /&gt;
* The feature proposal should pertain only to OpenSimulator. You may mention how this will affect other software (such as viewers), but technical details and progress should remain focused on OpenSimulator.&lt;br /&gt;
* The feature should have at least one developer sponsor. Users (who are not also developers) wishing to request a new feature may do so on Mantis.&lt;br /&gt;
* The feature should be software-oriented, not content-oriented. Content creation has its own section on the Wiki and elsewhere.&lt;br /&gt;
* The feature should not describe a '''defect''' in the software. A defect is where a feature ''has'' been implemented, and ''should'' work correctly, but due to technical difficulties it doesn't work properly or at all.&lt;br /&gt;
* The feature should require at least a few hours of work for a seasoned developer. Items that can be trivially completed should be submitted as a bug on Mantis, or come up with a patch outright.&lt;br /&gt;
&lt;br /&gt;
The general process of developing a new feature can be described as follows:&lt;br /&gt;
&lt;br /&gt;
1. Get an idea.&lt;br /&gt;
2. Refine the idea, and brainstorm on how it could be implemented technically.&lt;br /&gt;
3. Write up a feature proposal describing in detail how you would implement the idea in OpenSimulator.&lt;br /&gt;
4. Solicit user and developer feedback about the idea: is it generally useful? Is the design clean and modular? Is there sufficient interest to warrant the work, versus the implementation difficulty?&lt;br /&gt;
5. Incorporate feedback into proposal as necessary.&lt;br /&gt;
6. Implement feature, updating proposal as necessary.&lt;br /&gt;
7. ???&lt;br /&gt;
8. Get feature merged to trunk.&lt;br /&gt;
9. Update feature proposal page one last time, indicating completion, and providing links (if any) to user documentation describing the final instructions for how to use the feature.&lt;br /&gt;
&lt;br /&gt;
== Active Feature Proposals ==&lt;br /&gt;
&lt;br /&gt;
These feature proposals are actively being worked on. This just means that the developer sponsor(s) consider the feature a work in progress; they intend to complete the feature; and we are still able to contact them. &amp;quot;Active&amp;quot; status has nothing to do with the frequency of code commits, and everything to do with the intentions of the developer sponsor(s).&lt;br /&gt;
&lt;br /&gt;
*[[Feature_Proposals/AutoBackup|AutoBackup]]&lt;br /&gt;
&lt;br /&gt;
== Stalled Feature Proposals ==&lt;br /&gt;
&lt;br /&gt;
These are feature proposals that have been abandoned, either voluntarily by the developer sponsor(s), or due to other reasons. A stalled feature proposal can and should be resumed by volunteer developers who find the proposal to be worthy of their time and effort, because we are reasonably certain that the original developer is no longer working on the feature.&lt;br /&gt;
&lt;br /&gt;
== Completed Feature Proposals ==&lt;br /&gt;
&lt;br /&gt;
The features listed below are here for historical reasons, but they are done and implemented into OpenSim in some form or another.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Example Feature Proposal ==&lt;br /&gt;
&lt;br /&gt;
Here is an [[Feature_Proposals/Example|Example]] feature proposal. Feel free to deviate from this format, but I found that it works for me.&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	<entry>
		<id>http://opensimulator.org/wiki/Feature_Proposals/Example</id>
		<title>Feature Proposals/Example</title>
		<link rel="alternate" type="text/html" href="http://opensimulator.org/wiki/Feature_Proposals/Example"/>
				<updated>2011-02-18T13:34:56Z</updated>
		
		<summary type="html">&lt;p&gt;Allquixotic: Created example feature proposal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Example Feature =&lt;br /&gt;
&lt;br /&gt;
(''Guideline text is in italics like this.'')&lt;br /&gt;
&lt;br /&gt;
== Basic Info ==&lt;br /&gt;
&lt;br /&gt;
(''You should be able to completely fill out this section during your first edit of your proposal.'')&lt;br /&gt;
&lt;br /&gt;
* '''Summary''': (''A one- or two-sentence description of what your feature does. Be VERY brief!'')&lt;br /&gt;
* '''Developer Sponsor(s)''': (''Your Wiki name, email, etc.'')&lt;br /&gt;
* '''Start Date''': (''The date when you first started work on this feature'')&lt;br /&gt;
* '''Branches Targeted''': (''e.g. trunk, 0.6.x, etc.'')&lt;br /&gt;
* '''Commercial''': (''Yes/No: Is this feature directly driven by a business or commercial venture running on OpenSimulator?'')&lt;br /&gt;
* '''Code Repository''': (''A repository URL (SVN or Git preferred) where interested parties can get your code. If you haven't committed anything yet, that's fine; but please at least create your repository and make it public before you submit your proposal.'')&lt;br /&gt;
&lt;br /&gt;
== High-Level Design ==&lt;br /&gt;
&lt;br /&gt;
=== Idea ===&lt;br /&gt;
&lt;br /&gt;
(''This is where you pitch your idea in detail. Paragraphs of prose, bullet points, and so forth are appropriate here. At a minimum, you should cover the following bases:&lt;br /&gt;
* What the purpose of the feature is&lt;br /&gt;
* Why users would want to use the feature&lt;br /&gt;
* Describe how users would use the feature in the ideal scenario&lt;br /&gt;
* Describe the status quo, i.e. what users currently have to live with'')&lt;br /&gt;
&lt;br /&gt;
=== Criteria ===&lt;br /&gt;
&lt;br /&gt;
(''This is where you draw a box around the bounds of your project, letting us know where your feature starts and ends, how it impacts the rest of the system, etc. A few examples are provided.'')&lt;br /&gt;
&lt;br /&gt;
* '''Scope''': (''Define what is and isn't within the scope of work you are willing to take on as part of the feature implementation.'')&lt;br /&gt;
* '''Software Requirements''': (''Mention any new third-party dependencies, version bumps or build system changes that would be necessary for implementation.'')&lt;br /&gt;
* '''Impact''': (''List which existing modules in the code-base may have to be modified to integrate with your feature.'')&lt;br /&gt;
* '''Blockers''': (''List any open issues, outside the scope of your feature, which may be required or strongly recommended before your feature can integrate with the rest of the system. Bonus points for links to Mantis bugs!'')&lt;br /&gt;
&lt;br /&gt;
=== Implementation Overview ===&lt;br /&gt;
&lt;br /&gt;
(''This is where you can start to think about things like: naming your module(s) and interface(s), defining an API, and describing how other modules in the system should change to work with your code. Including Unified Modelling Languages (UML) diagrams for complex systems is much appreciated!'')&lt;br /&gt;
&lt;br /&gt;
=== User Experience ===&lt;br /&gt;
&lt;br /&gt;
(''How will the user interact with your feature? Assume that there is a compiled binary distribution of OpenSim with your fully-implemented feature, and assume an audience of a reasonably-experienced OpenSim sysadmin who is not necessarily experienced with software development. You should document things like console commands, configuration settings, script functions, etc. in this space.'')&lt;br /&gt;
&lt;br /&gt;
== Low-Level Design ==&lt;br /&gt;
&lt;br /&gt;
(''Your actual code will be in your repository, but you can include additional details on design here if you want. For example, if your module exposes a complex API that other modules will want to use, you can list that API here. Other developers may be interested in working with you to revise the API before you start working on the implementation.'')&lt;/div&gt;</summary>
		<author><name>Allquixotic</name></author>	</entry>

	</feed>