Reduce AI/MP lags when removing models
Move load of removing OSG objects to the OSG pager thread
This commit is contained in:
parent
020d6a6363
commit
53e6c0ac5f
2 changed files with 32 additions and 3 deletions
|
@ -129,9 +129,7 @@ FGAIBase::FGAIBase(object_type ot, bool enableHot) :
|
|||
|
||||
FGAIBase::~FGAIBase() {
|
||||
// Unregister that one at the scenery manager
|
||||
if (globals->get_scenery()) {
|
||||
globals->get_scenery()->get_scene_graph()->removeChild(aip.getSceneGraph());
|
||||
}
|
||||
removeModel();
|
||||
|
||||
if (props) {
|
||||
SGPropertyNode* parent = props->getParent();
|
||||
|
@ -143,6 +141,29 @@ FGAIBase::~FGAIBase() {
|
|||
fp = 0;
|
||||
}
|
||||
|
||||
/** Cleanly remove the model
|
||||
* and let the scenery database pager do the clean-up work.
|
||||
*/
|
||||
void
|
||||
FGAIBase::removeModel()
|
||||
{
|
||||
FGScenery* pSceneryManager = globals->get_scenery();
|
||||
if (pSceneryManager)
|
||||
{
|
||||
osg::ref_ptr<osg::Object> temp = _model.get();
|
||||
pSceneryManager->get_scene_graph()->removeChild(aip.getSceneGraph());
|
||||
// withdraw from SGModelPlacement and drop own reference (unref)
|
||||
aip.init( 0 );
|
||||
_model = 0;
|
||||
// pass it on to the pager, to be be deleted in the pager thread
|
||||
pSceneryManager->getPagerSingleton()->queueDeleteRequest(temp);
|
||||
}
|
||||
else
|
||||
{
|
||||
SG_LOG(SG_AI, SG_ALERT, "AIBase: Could not unload model. Missing scenery manager!");
|
||||
}
|
||||
}
|
||||
|
||||
void FGAIBase::readFromScenario(SGPropertyNode* scFileNode)
|
||||
{
|
||||
if (!scFileNode)
|
||||
|
@ -248,6 +269,12 @@ bool FGAIBase::init(bool search_in_AI_path) {
|
|||
|
||||
osg::Node * mdl = SGModelLib::loadPagedModel(f, props, new FGNasalModelData(props));
|
||||
|
||||
if (_model.valid())
|
||||
{
|
||||
// reinit, dump the old model
|
||||
removeModel();
|
||||
}
|
||||
|
||||
_model = new osg::LOD;
|
||||
_model->setName("AI-model range animation node");
|
||||
|
||||
|
|
|
@ -216,6 +216,8 @@ protected:
|
|||
void CalculateMach();
|
||||
double UpdateRadar(FGAIManager* manager);
|
||||
|
||||
void removeModel();
|
||||
|
||||
static int _newAIModelID();
|
||||
|
||||
private:
|
||||
|
|
Loading…
Reference in a new issue