我要发帖 回复

正式会员

15

主题

62

积分

0

专家分

:

私信
发表时间 : 2009-2-9 15:05:58 | 浏览 : 1794    评论 : 1
我采用VR-LINK和Vega Prime1.2进行分布式仿真,创建了两个联邦成员:天空和地面
天空成员用来控制飞机
地面成员用来控制坦克
首先运行天空成员,然后运行地面成员
当地面成员加入联邦的时候,在地面成员当中动态添加一架飞机,在天空成员当中动态添加一辆坦克
当地面成员退出联邦的时候,在天空成员当中将坦克删除
问题是:
当地面成员退出联邦的时候,天空成员就会意外关闭,并且提示说:one of the components initialized vp ,but never shut it down
在天空成员当中删除坦克的时候,我添加了语句:obj->unref();
如果把这一句删除,那么当地面成员退出联邦的时候,天空成员不会意外关闭
但是当天空成员退出联邦的时候,就会出现内存泄漏
这是怎么回事啊
typedef struct obj_list
{
        vpObject* obj;
        DtObjectId id;
        obj_list* next;
};
obj_list* first = NULL;
obj_list* next  = NULL;
vpObject* CreateObject(DtObjectId id)
{
        vpObject* obj = new vpObject();
        obj->ref();
        obj->setFileName( "C://Program Files//MultiGen-Paradigm//resources//data//models//m1_tank.flt");
        obj->setName(id.string());
        obj->setCullMask(0x0FFFFFFFF);
        obj->setRenderMask(0x0FFFFFFFF);
        obj->setIsectMask(0x0FFFFFFFF);
        obj->setStrategyEnable( false );
        obj->setTranslate(0,0,0);
        obj->setRotate(0,0,0 );
        obj->setScale( 1.000000 ,  1.000000 ,  1.000000 );
        obj->setStaticEnable( false );
        vpScene *pScene = vpScene::get(0);
        assert(pScene);
        pScene->addChild(obj);
        return obj;
}
void UpdateObj(DtEntityStateRepository *esr,vpObject* obj)
{
    //更新实体的POS和HPR
}
void myPostUpdateCb(DtReflectedEntity* ent, void* usr)
{
        DtEntityStateRepository *esr = ent->entityStateRep();
        if (esr->entityType() == DtEntityType(DtPlatform, DtPlatformDomainLand,DtUnitedStates, DtFighter, DtM1, 0, 0))
        {
                bool i = false;
                if(first == NULL)
                {
                        first = new obj_list;
                        first->id = ent->id();
                        first->obj = CreateObject(ent->id());
                        first->next = NULL;
                        next = first;
               
                }
                for(obj_list* op= first;op!=NULL;op = op->next)
                {
                        if(ent->id() == op->id)
                        {
                                i = true;
                                UpdateObj(esr,op->obj);
                        }
                }
                if(i == false)
                {
                        next->next = new obj_list;
                        next = next->next;
                        next->id = ent->id();
                        next->obj = CreateObject(ent->id());
                        next->next = NULL;
                        UpdateObj(esr,next->obj);
                }
        }
}
void CB_EntityJoin(DtReflectedEntity* ent, void* userData)
{
        ent->addPostUpdateCallback(myPostUpdateCb, userData);
}
void CB_EntityLeave(DtReflectedEntity* ent, void* userData)
{
        DtEntityStateRepository *esr = ent->entityStateRep();
        if (esr->entityType() == DtEntityType(DtPlatform, DtPlatformDomainLand,DtUnitedStates, DtFighter, DtM1, 0, 0))
        {
                obj_list* fp;
                if( ent->id() == first->id)
                {
                        vpScene *pScene = vpScene::get(0);
                        assert(pScene);
                        pScene->removeChild(first->obj);
                        fp = first;
                        first = first->next;
                        next = first;
                        fp->obj->unref();
                        printf("GOODBYE %s\n", ent->id().string());
                        delete fp;
                }
                for(obj_list* op= first;op!=NULL;op = op->next)
                {
                        if(ent->id() == op->next->id)
                        {
                                vpScene *pScene = vpScene::get(0);
                                assert(pScene);
                                pScene->removeChild(op->next->obj);
                                fp = op->next;
                                op->next = fp->next;
                                fp->next = NULL;
                                fp->obj->unref();
                                delete fp;
                        }
                }
        }
}
int myApp::configure()
{
         。。。。。。
        rel = new DtReflectedEntityList( exConn );
        rel->addEntityAdditionCallback(CB_EntityJoin, NULL);
        rel->addEntityRemovalCallback(CB_EntityLeave, NULL);
         。。。。。。
        return vsgu::SUCCESS;
}


最近VR访客

Mulder 评论于2009-2-26 20:00:11
提示: 作者被禁止或删除 内容自动屏蔽

手机版|VR开发网 统计 津ICP备18009691号
网安备12019202000257

GMT+8, 2021-4-20 05:32 AM

返回顶部