- 积分
- 62
- 帖子
- 66
- 主题
- 15
- 精华
- 0
- 最后登录
- 2020-5-10
- 在线时间
- 77 小时
- 私信
|
发表时间 : 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;
}
|
|