1

使用以下启动:

        BulletSharp.DefaultCollisionConstructionInfo collisionConstructionInfo =
            new BulletSharp.DefaultCollisionConstructionInfo();
        BulletSharp.DefaultCollisionConfiguration collisionConfiguration =
            new BulletSharp.DefaultCollisionConfiguration(
                collisionConstructionInfo );
        BulletSharp.Dispatcher collisionDispatcher =
            new BulletSharp.CollisionDispatcher(
                collisionConfiguration );
        BulletSharp.BroadphaseInterface broadPhaseCollisionInterface =
            new BulletSharp.SimpleBroadphase( );
        BulletSharp.CollisionWorld bulletCollisionWorld =
            new BulletSharp.CollisionWorld(
                collisionDispatcher,
                broadPhaseCollisionInterface,
                collisionConfiguration );

        BulletSharp.ConstraintSolver constraintSolver =
            new BulletSharp.SequentialImpulseConstraintSolver();
        BulletSharp.DynamicsWorld bulletDynamicsWorld =
            new BulletSharp.DiscreteDynamicsWorld(
                collisionDispatcher,
                broadPhaseCollisionInterface,
                constraintSolver,
                collisionConfiguration );

每秒运行 60 次:

bulletDynamicsWorld.StepSimulation( (float)deltaTime, 9, 1.0F / 40.0F );

然后在退出某个任意点时调用它们:

        Utility.SafeDispose( bulletDynamicsWorld );
        Utility.SafeDispose( constraintSolver );
        Utility.SafeDispose( broadPhaseCollisionInterface );
        Utility.SafeDispose( collisionDispatcher );
        Utility.SafeDispose( collisionConfiguration );
        Utility.SafeDispose( bulletCollisionWorld ); <<< The error happens here >>>

执行突出显示的行时出现以下错误:

“运行时遇到致命错误。错误地址位于线程 0x1378 上的 0x6b1c9704。错误代码为 0xc0000005。此错误可能是 CLR 中的错​​误,也可能是用户代码的不安全或不可验证部分中的错误。此错误的常见来源包括 COM-interop 或 PInvoke 的用户编组错误,这可能会损坏堆栈。”

笔记:

1)这就是所有的项目符号代码。未添加任何碰撞对象或动态对象。

2) Utility.SafeDispose() 采用 IDiposable,检查空值,如果有效则调用 .Dispose()。

3)语言是C#,说清楚。

4) Utility.SafeDispose( CollisionWorld ) 在 .SafeDispose 语句列表中的位置似乎没有效果。

为什么会崩溃,我该如何解决?

谢谢。

4

2 回答 2

2

在处理 bulletCollisionWorld 时,它将访问 broadPhaseCollisionInterface 以清除世界创建的任何碰撞对。由于您在处置世界之前显式处置了冲突接口,因此世界将访问无效指针。

所以解决方案是先处理两个世界,然后处理碰撞接口。

于 2012-10-26T22:20:44.870 回答
0

DiscreteDynamicsWorld 是一个碰撞世界。移除额外的碰撞世界不会导致错误;因此,问题可能在于有两个碰撞世界。似乎确实有一些全局变量。

于 2012-10-26T21:27:13.590 回答