游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2582|回复: 1

Ogre的内存泄露吗?

[复制链接]

10

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2011-11-19 13:49:00 | 显示全部楼层 |阅读模式

下面这段代码我连续执行大概2000000多次,程序内存耗尽,达到2G,之后申请内存失败,我确实对创建和释放是否一一对应是有怀疑,但又不了解具体是哪里的问题,拜托各位帮我看看是那个地方可能没有释放?
我用了_CrtSetDbgFlag的函数来检测内存泄露,但是没有检测出来。

// 创建
m_pMaterial = MaterialManager::getSingleton().create( m_szName, ResourceGroupManager:EFAULT_RESOURCE_GROUP_NAME );
m_pMaterial->setLightingEnabled( false );
m_pPass = m_pMaterial->getTechnique(0)->getPass(0);
m_pPass->setSceneBlending( SBT_TRANSPARENT_ALPHA );

pTUS = m_pPass->createTextureUnitState( szFileName );
m_pTexture = pTUS->_getTexturePtr(0);
m_pBuffer = m_pTexture->getBuffer();
        m_pBuffer->lock( HardwareBuffer::HBL_DISCARD );
        const PixelBox &pb = m_pBuffer->getCurrentLock();
        w = pb.getWidth();
        h = pb.getHeight();
        m_pBuffer->unlock();

m_pOverlay = OverlayManager::getSingletonPtr()->create( m_szName );

m_pElement = (PanelOverlayElement*)OverlayManager::getSingleton().createOverlayElement( &quotanel", m_szName );
        m_pElement->setMetricsMode( GMM_PIXELS );
        m_pElement->setVerticalAlignment( GVA_TOP );
        m_pElement->setPosition( 0, 0 );
        m_pElement->setWidth( 1 );
        m_pElement->setHeight( 1 );
m_pOverlay->add2D( (OverlayContainer*)m_pOgreElement );
m_pOverlay->setZOrder( iZOrder );
m_pElement->SetMaterial( pMaterial );


// 释放
if( m_pTUS->getNumFrames() )
m_pTUS->deleteFrameTextureName( 0 );
m_pTexture.setNull();
m_pBuffer.setNull();
Ogre::TextureManager::getSingleton().remove( m_szName );
m_pPass->removeAllTextureUnitStates();
MaterialManager::getSingleton().remove( m_szName );//*(ResourcePtr*)&
m_pMaterial.setNull();

OverlayManager::getSingleton().destroyOverlayElement( m_pElement );
OverlayManager::getSingletonPtr()->destroy( m_szName );


为了进一步确定,我又做了一次删减后的测试。剩下下面的代码

// 创建
m_pMaterial = MaterialManager::getSingleton().create( m_szName, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME );
m_pMaterial->setLightingEnabled( false );
m_pPass = m_pMaterial->getTechnique(0)->getPass(0);
m_pPass->setSceneBlending( SBT_TRANSPARENT_ALPHA );

// 释放
m_pPass->removeAllTextureUnitStates();
MaterialManager::getSingleton().remove( m_szName );//*(ResourcePtr*)&
m_pMaterial.setNull();

这段代码要执行5000000多次才出现内存耗尽,但终归也是有内存泄露。我推断这一创建一释放之后似乎还有200多个字节的内存泄露,那到底是出在什么地方呢?

86

主题

2251

帖子

2384

积分

金牌会员

Rank: 6Rank: 6

积分
2384
QQ
发表于 2011-11-19 17:57:00 | 显示全部楼层

Re:Ogre的内存泄露吗?

内存耗尽和内存泄漏两把事

有时候创建释放本身有额外的内存消耗,这部分内存在内存分配器退出时才释放。

这种内存分配器不适合大规模的应用场景。

你先确定是不是真的在程序流程上有没释放的地方。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 18:16

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表