Rumah pangkalan data tutorial mysql cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题

cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题

Jun 07, 2016 pm 03:32 PM
Ingatan segerak mengurus benang soalan

//-------------------------------------------------------------------- // // CCPoolManager // //-------------------------------------------------------------------- /////【diff - begin】- by layne////// CCPoolManager* CCPoolManager::shared

//--------------------------------------------------------------------

//

// CCPoolManager

//

//--------------------------------------------------------------------


/////【diff - begin】- by layne//////


CCPoolManager* CCPoolManager::sharedPoolManager()

{

    if (s_pPoolManager == NULL)

    {

        s_pPoolManager = new CCPoolManager();

    }

    return s_pPoolManager;

}


void CCPoolManager::purgePoolManager()

{

    CC_SAFE_DELETE(s_pPoolManager);

}


CCPoolManager::CCPoolManager()

{

    //    m_pReleasePoolStack = new CCArray();   

    //    m_pReleasePoolStack->init();

    //    m_pCurReleasePool = 0;


    m_pReleasePoolMultiStack = new CCDictionary();

}


CCPoolManager::~CCPoolManager()

{


    //    finalize();


    //    // we only release the last autorelease pool here

    //    m_pCurReleasePool = 0;

    //    m_pReleasePoolStack->removeObjectAtIndex(0);

    //   

    //    CC_SAFE_DELETE(m_pReleasePoolStack);


    finalize();


    CC_SAFE_DELETE(m_pReleasePoolMultiStack);

}


void CCPoolManager::finalize()

{

    if(m_pReleasePoolMultiStack->count() > 0)

    {

        //CCAutoreleasePool* pReleasePool;

        CCObject* pkey = NULL;

        CCARRAY_FOREACH(m_pReleasePoolMultiStack->allKeys(), pkey)

        {

            if(!pkey)

                break;

            CCInteger *key = (CCInteger*)pkey;

            CCArray *poolStack = (CCArray *)m_pReleasePoolMultiStack->objectForKey(key->getValue());

            CCObject* pObj = NULL;

            CCARRAY_FOREACH(poolStack, pObj)

            {

                if(!pObj)

                    break;

                CCAutoreleasePool* pPool = (CCAutoreleasePool*)pObj;

                pPool->clear();

            }

        }

    }

}


void CCPoolManager::push()

{

    //    CCAutoreleasePool* pPool = new CCAutoreleasePool();       //ref = 1

    //    m_pCurReleasePool = pPool;

    //   

    //    m_pReleasePoolStack->addObject(pPool);                   //ref = 2

    //   

    //    pPool->release();                                       //ref = 1


    pthread_mutex_lock(&m_mutex);


    CCArray* pCurReleasePoolStack = getCurReleasePoolStack();

    CCAutoreleasePool* pPool = new CCAutoreleasePool();         //ref = 1

    pCurReleasePoolStack->addObject(pPool);                               //ref = 2

    pPool->release();                                           //ref = 1   


    pthread_mutex_unlock(&m_mutex);

}


void CCPoolManager::pop()

{

    //    if (! m_pCurReleasePool)

    //    {

    //        return;

    //    }

    //   

    //    int nCount = m_pReleasePoolStack->count();

    //   

    //    m_pCurReleasePool->clear();

    //   

    //    if(nCount > 1)

    //    {

    //        m_pReleasePoolStack->removeObjectAtIndex(nCount-1);

    //        

    //        //         if(nCount > 1)

    //        //         {

    //        //             m_pCurReleasePool = m_pReleasePoolStack->objectAtIndex(nCount - 2);

    //        //             return;

    //        //         }

    //        m_pCurReleasePool = (CCAutoreleasePool*)m_pReleasePoolStack->objectAtIndex(nCount - 2);

    //    }

    //   

    //    /*m_pCurReleasePool = NULL;*/


    pthread_mutex_lock(&m_mutex);   


    CCArray* pCurReleasePoolStack = getCurReleasePoolStack();

    CCAutoreleasePool* pCurReleasePool = getCurReleasePool();   

    if (pCurReleasePoolStack && pCurReleasePool)

    {

        int nCount = pCurReleasePoolStack->count();


        pCurReleasePool->clear();


        if(nCount > 1)

        {

            pCurReleasePoolStack->removeObject(pCurReleasePool);

        }

    }


    pthread_mutex_unlock(&m_mutex);

}


void CCPoolManager::removeObject(CCObject* pObject)

{

    //    CCAssert(m_pCurReleasePool, "current auto release pool should not be null");

    //   

    //    m_pCurReleasePool->removeObject(pObject);


    pthread_mutex_lock(&m_mutex);

    CCAutoreleasePool* pCurReleasePool = getCurReleasePool();

    CCAssert(pCurReleasePool, "current auto release pool should not be null");


    pCurReleasePool->removeObject(pObject);

    pthread_mutex_unlock(&m_mutex);   

}


void CCPoolManager::addObject(CCObject* pObject)

{

    //    getCurReleasePool()->addObject(pObject);


    pthread_mutex_lock(&m_mutex);   

    CCAutoreleasePool* pCurReleasePool = getCurReleasePool(true);

    CCAssert(pCurReleasePool, "current auto release pool should not be null");


    pCurReleasePool->addObject(pObject);

    pthread_mutex_unlock(&m_mutex);     

}


CCArray* CCPoolManager::getCurReleasePoolStack()

{

    CCArray* pPoolStack = NULL;

    pthread_t tid = pthread_self();

    if(m_pReleasePoolMultiStack->count() > 0)

    {

        pPoolStack = (CCArray*)m_pReleasePoolMultiStack->objectForKey((int)tid);

    }


    if (!pPoolStack) {

        pPoolStack = new CCArray();

        m_pReleasePoolMultiStack->setObject(pPoolStack, (int)tid);

        pPoolStack->release();

    }


    return pPoolStack;

}


CCAutoreleasePool* CCPoolManager::getCurReleasePool(bool autoCreate)

{

    //    if(!m_pCurReleasePool)

    //    {

    //        push();

    //    }

    //   

    //    CCAssert(m_pCurReleasePool, "current auto release pool should not be null");

    //   

    //    return m_pCurReleasePool;


    CCAutoreleasePool* pReleasePool = NULL;



    CCArray* pPoolStack = getCurReleasePoolStack();

    if(pPoolStack->count() > 0)

    {

        pReleasePool = (CCAutoreleasePool*)pPoolStack->lastObject();

    }


    if (!pReleasePool && autoCreate) {

        CCAutoreleasePool* pPool = new CCAutoreleasePool();         //ref = 1

        pPoolStack->addObject(pPool);                               //ref = 2

        pPool->release();                                           //ref = 1


        pReleasePool = pPool;

    }


    return pReleasePool;

}


/////【diff - end】- by layne//////

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Tag artikel panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Pengoptimuman memori yang besar, apakah yang perlu saya lakukan jika komputer menaik taraf kepada kelajuan memori 16g/32g dan tiada perubahan? Pengoptimuman memori yang besar, apakah yang perlu saya lakukan jika komputer menaik taraf kepada kelajuan memori 16g/32g dan tiada perubahan? Jun 18, 2024 pm 06:51 PM

Pengoptimuman memori yang besar, apakah yang perlu saya lakukan jika komputer menaik taraf kepada kelajuan memori 16g/32g dan tiada perubahan?

Bagaimana untuk menyemak penggunaan memori Xiaomi Mi 14Pro? Bagaimana untuk menyemak penggunaan memori Xiaomi Mi 14Pro? Mar 18, 2024 pm 02:19 PM

Bagaimana untuk menyemak penggunaan memori Xiaomi Mi 14Pro?

Satu atau lebih item dalam folder yang anda segerakkan tidak sepadan dengan ralat Outlook Satu atau lebih item dalam folder yang anda segerakkan tidak sepadan dengan ralat Outlook Mar 18, 2024 am 09:46 AM

Satu atau lebih item dalam folder yang anda segerakkan tidak sepadan dengan ralat Outlook

Samsung mengumumkan penyiapan pengesahan teknologi proses penyusunan ikatan hibrid 16 lapisan, yang dijangka digunakan secara meluas dalam memori HBM4 Samsung mengumumkan penyiapan pengesahan teknologi proses penyusunan ikatan hibrid 16 lapisan, yang dijangka digunakan secara meluas dalam memori HBM4 Apr 07, 2024 pm 09:19 PM

Samsung mengumumkan penyiapan pengesahan teknologi proses penyusunan ikatan hibrid 16 lapisan, yang dijangka digunakan secara meluas dalam memori HBM4

Micron: Memori HBM menggunakan 3 kali jumlah wafer, dan kapasiti pengeluaran pada dasarnya ditempah untuk tahun depan Micron: Memori HBM menggunakan 3 kali jumlah wafer, dan kapasiti pengeluaran pada dasarnya ditempah untuk tahun depan Mar 22, 2024 pm 08:16 PM

Micron: Memori HBM menggunakan 3 kali jumlah wafer, dan kapasiti pengeluaran pada dasarnya ditempah untuk tahun depan

Lexar melancarkan kit memori Ares Wings of War DDR5 7600 16GB x2: Hynix A-die particles, 1,299 yuan Lexar melancarkan kit memori Ares Wings of War DDR5 7600 16GB x2: Hynix A-die particles, 1,299 yuan May 07, 2024 am 08:13 AM

Lexar melancarkan kit memori Ares Wings of War DDR5 7600 16GB x2: Hynix A-die particles, 1,299 yuan

Sumber mengatakan Samsung Electronics dan SK Hynix akan mengkomersialkan memori mudah alih bertindan selepas 2026 Sumber mengatakan Samsung Electronics dan SK Hynix akan mengkomersialkan memori mudah alih bertindan selepas 2026 Sep 03, 2024 pm 02:15 PM

Sumber mengatakan Samsung Electronics dan SK Hynix akan mengkomersialkan memori mudah alih bertindan selepas 2026

Kingbang melancarkan memori DDR5 8600 baharu, tersedia dalam CAMM2, LPCAMM2 dan model biasa Kingbang melancarkan memori DDR5 8600 baharu, tersedia dalam CAMM2, LPCAMM2 dan model biasa Jun 08, 2024 pm 01:35 PM

Kingbang melancarkan memori DDR5 8600 baharu, tersedia dalam CAMM2, LPCAMM2 dan model biasa

See all articles