[ODE] ODE .NET

Jon Watte (ODE) hplus-ode at mindcontrol.org
Fri Jun 8 11:35:13 MST 2007


Those are managed arrays. Managed arrays can move around in memory. From 
what I understand, you need to pin those arrays for the duration of the 
geom lifetime.

Cheers,

          / h+


Manox wrote:
> Jason Perkins napsal(a):
>   
>> On 6/8/07, Manox <manoxik at seznam.cz> wrote:
>>     
>>> When I use trimesh geom, it throws : AccesViolationException - Attempted
>>> to read or write protected memory ....
>>>       
>> Be sure that you are keeping a reference to your mesh data in your
>> .NET code, otherwise it will get garbage collected. Sounds to me like
>> that is what is happening.
>>
>> HTH,
>>
>> Jason
>>
>>     
> No, I have class
>
> public class PhysicsSolver : IDisposable
>   {
>    ..
>     double[] vrcholy;
>     int[] indices;
>     IntPtr temp;
> ...
>
> Function
>
> public unsafe uint AddStaticBody(float[] data)
>     {
>       int count = data.Length / 10;
>
>       vrcholy = new double[count * 9];
>       indices = new int[count * 3];
>
>       for (int i = 0; i < count; i++)
>       {
>         vrcholy[9 * i] = data[10 * i + 1];
>         vrcholy[9 * i + 1] = data[10 * i + 3];
>         vrcholy[9 * i + 2] = data[10 * i + 2];
>
>         vrcholy[9 * i + 3] = data[10 * i + 4];
>         vrcholy[9 * i + 4] = data[10 * i + 6];
>         vrcholy[9 * i + 5] = data[10 * i + 5];
>
>         vrcholy[9 * i + 6] = data[10 * i + 7];
>         vrcholy[9 * i + 7] = data[10 * i + 9];
>         vrcholy[9 * i + 8] = data[10 * i + 8];
>
>         indices[3 * i] = (3 * i);
>         indices[3 * i + 1] = (3 * i + 1);
>         indices[3 * i + 2] = (3 * i + 2);
>       }
>
>       tricall = new d.TriCallback(TriCallback);
>       raycall = new d.TriRayCallback(TriRayCallback);
>       arraycall = new d.TriArrayCallback(TriArrayCallback);
>
>       temp = d.GeomTriMeshDataCreate();
>
>       d.GeomTriMeshDataBuildDouble(temp, vrcholy, 24, vrcholy.Length / 
> 3, indices, indices.Length, 12);
>       d.GeomTriMeshDataPreprocess(temp);
>
>       geom = d.CreateTriMesh(this._space, temp, tricall, arraycall, 
> raycall);
>
>       return AddStaticBody(geom);
>     }
>
> and coliision function. I don't call any Dispose, and data are defined 
> in class. I don't see any reason for garbage collector.
>
> The problem is in memory, but I don't know where :-(
> _______________________________________________
> ODE mailing list
> ODE at ode.org
> http://ode.org/mailman/listinfo/ode
>
>
>   


More information about the ODE mailing list