디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

DX 2D비행슈팅강좌 25. Object Pool

Vita500갤로그로 이동합니다. 2009.09.25 00:15:13
조회 246 추천 0 댓글 2




====== DX 2D비행슈팅강좌 ======
===== 25. Object Pool =====
탄막슈팅처럼, 많은 오브젝트가 생성되고 삭제될때,
이것을 좀 더 빠르게 동작할 방법이 필요합니다.
그 방법으로 메모리풀을 이용하지만, 이또한
비용이 작은것이 아니므로, 효율이 낮습니다.

그래서, 오브젝트 단위로, Pool을 만들어서,
생성과 삭제를 빠르게 할필요가 있습니다.

기존에 총알이 사용하던 방법을 클래스로 모듈화 시켰다고 
보시면, 크게 차이가 없습니다.






1. 오브젝트풀의 생성
2. Pool의 원본넣기
3. 잉여자원으로 부터 오브젝트를 받기
4. 잉여자원으로 자원 환원하기
5. 삭제 락걸기
6. 모든 자원해제.
7. 기존의 데이터 관리를 바꾸기
8. 업뎃, 그리기, 충돌체크 등에서 오브젝트 풀사용
9. 오브젝트 풀 사용방법 요점정리
10. Pool로 관리할 오브젝트들 목록












1. 오브젝트풀의 생성

VOID SceneManager::Initialize(VOID)
{
        _pPool = new ObjectPool;
}

VOID SceneManager::Release(VOID)
{
        delete _pPool;
}

오브젝트 풀은 씬매니저가 시작을 할때 멤버로 시작되며
씬매니저가 끝날때 같이 사리집니다.
씬매니저와 생명을 같이 합니다.








2. Pool의 원본넣기
VOID ObjectPool::pushPool(Character* pObject, UINT uSize)
{
        _vOriginal.push_back(pObject);
        UINT uObject = _vOriginal.size() -1;
        _vOriginal[uObject]->setObjectPool_number(uObject);


        CharacterList listTemp;
        _vUse.push_back(listTemp);
        _vDelete.push_back(listTemp);
        _vSpare.push_back(listTemp);


        BOOL bTemp = FALSE;
        _vlockDelete.push_back(bTemp);


        // 오브젝트 여분을 만든다.
        Character* pNodeTemp = NULL;
        for ( UINT i=0; i<uSize; ++i )
        {
                pNodeTemp = _vOriginal[uObject]->Copy();
                _vSpare[uObject].push_back( pNodeTemp );
        }
}

원본을 넣어서 해당 오브젝트를 복사할수있게 합니다.
인자값으로 잉여자원을 몇개나 만들지 설정합니다.
그러면, 그개수만큼 리스트에 넣습니다.
나중에 이 개수만큼 화면상에서 재활용하는것이죠
그리고, 오브젝트풀에서 사용할 Character에 번호를 넣기
위한 함수가 추가 되었습니다.









3. 잉여자원으로 부터 오브젝트를 받기
Character* ObjectPool::New(UINT uObject)
{
        // 여분이 없으면 2배로 한다.
        if ( _vSpare[uObject].empty() == TRUE )
        {
                UINT uSize = _vUse[uObject].size();

                for (UINT i=0; i<uSize; ++i)
                        _vSpare[uObject].push_back( _vOriginal[uObject]->Copy() );

        }


        // 넘겨준다. 
        Character* pObject = NULL;
        pObject = *_vSpare[uObject].begin();
        _vSpare[uObject].pop_front();
        _vUse[uObject].push_back(pObject);

        return pObject;
}

잉여 오브젝트자원을 받습니다.
만약, 여분이 부족하면, 총개수의 2배만큼 여분을 생성합니다.












4. 잉여자원으로 자원 환원하기
VOID ObjectPool::Delete(Character* pObject)
{
        UINT uObject = pObject->getObjectPool_number();


        // 삭제 락이 있을때
        if ( _vlockDelete[uObject] == TRUE )
        {
                _vDelete[uObject].push_back( pObject );
                return;
        }



        // 여분에 넣는다.
        CharacterList::iterator it;
        for (it=_vUse[uObject].begin(); it!=_vUse[uObject].end(); ++it)
        {
                if ( pObject == *it )
                {
                        _vSpare[uObject].push_back(pObject);
                        _vUse[uObject].erase(it);
                        break;
                }
        }

}

자원이 필요없을때, 잉여자원으로 넣습니다.
만약에 락이 걸려있으면, 락을 해제할때 넣습니다.













5. 삭제 락걸기
VOID ObjectPool::lockDelete(UINT uObject)
{
        _vlockDelete[uObject] = TRUE;
}

VOID ObjectPool::unlockDelete(UINT uObject)
{
        // 락을 해제
        _vlockDelete[uObject] = FALSE;

        if ( _vDelete.empty() == TRUE )
                return;


        // 삭제 대기목록에 있던것을 삭제(여분에넣는다.) 한다.
        CharacterList::iterator it;
        for (it=_vDelete[uObject].begin(); it!=_vDelete[uObject].end(); ++it )
                Delete(*it);


        _vDelete[uObject].clear();
}

만약, for문을 돌고있는도중 삭제를 하게 된다면,
iterator가 엉키게 됩니다.
그래서 삭제시 락을걸고, 삭제할 리스트를 받아둡니다.
그리고, 락을 해제시, 그 삭제리스트의 오브젝트를 삭제(잉여자원으로 보냄)합니다.











6. 모든 자원해제.
VOID ObjectPool::Clear(VOID)
{
        UINT uSize = 0;

        // 원본데이터 삭제
        uSize = _vOriginal.size();
        for (UINT i=0; i<uSize; ++i)
        {
                _vOriginal[i]->Release();
                delete _vOriginal[i];
        }

        _vOriginal.clear();

        .....
}

모든 잉여자원을 해제합니다.
프로그램 종료시등에 사용합니다.










7. 기존의 데이터 관리를 바꾸기
//Character                _EnemyExplosion;
//CharacterList                _listEnemyExplosion;
//CharacterList                _listEnemyExplosion_delete;

기존의 오브젝트 리스트와 삭제리스트등이 하던것을
모듈화 시킨것이 오브젝트 풀입니다.
이제 그것을 주석화 시키고, 오브젝트풀로 옮깁니다.
적, 적의 폭팔, 플레이어의 총알, 플레이어등을 모두 옮깁니다.











8. 업뎃, 그리기, 충돌체크 등에서 오브젝트 풀사용
CharacterList::iterator it;
CharacterList *pList = NULL;
for (UINT i=0; i<POOL_Max; ++i)
{
        pList = _pPool->getUseList(i);
        for (it=pList->begin(); it!=pList->end(); ++it)
                (*it)->Draw();
}

그릴때, 오브젝트 풀로 부터 사용하는 리스트를 받아서 그립니다.
업데이트, 충돌체크 또한 마찬가지입니다.










9. 오브젝트 풀 사용방법 요점정리
  * 풀생성, 원본넣기 : _pPool->pushPool(pEnemy, 2);
  * new, 풀에서 잉여자원받기 : pEnemy1 = _pPool->New(POOL_Enemy);
  * delete, 풀로 잉여자원보내기 _pPool->Delete(pBullet);
  * 모든 자원업데이트 : pList = _pPool->getUseList(i);
  * 삭제가 될수있는 오브젝트 업데이트시
    _pPool->lockDelete( POOL_EnemyExplosion );
    for(..)
    pPool->unlockDelete( POOL_EnemyExplosion );
  



10. Pool로 관리할 오브젝트들 목록
enum POOL_Number
{
        POOL_Enemy = 0,
        POOL_EnemyExplosion,

        POOL_PlayerBullet,
        POOL_Player,

        POOL_Max,
};

적, 적의 폭팔, 플레이어총알, 플레이어등 총4개 사용하고 있습니다.
다른 오브젝트를 추가한다면, 여기에 값을 더 추가하시면 됩니다.

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 힘들게 성공한 만큼 절대 논란 안 만들 것 같은 스타는? 운영자 24/06/10 - -
161713 int형을 bool로 캐스팅할때 warning 안뜨는 하는 방법없나요? [5] ㄱㄷㅅ(222.120) 09.12.10 217 0
161711 윈속 네떡 플밍 공부중. [1] yundream(211.189) 09.12.10 92 0
161710 Look [1] 아주아슬갤로그로 이동합니다. 09.12.10 70 0
161709 아...난 병신인가여 원래그래갤로그로 이동합니다. 09.12.10 62 0
161707 Look [1] 파이썬(121.138) 09.12.10 53 0
161706 프갤 티샤츠 프로토 타입을 뛰어 넘은 초안 - 의견좀 ㅋ [12] 초밥술사갤로그로 이동합니다. 09.12.10 172 0
161705 횽들의 능렭으로도 깨진한글파일 복구는 힘든것이에요? ㅠㅠ [4] 4268(218.154) 09.12.10 290 0
161704 프로그래머란 직업이 [3] ㄷㄷㄷ(58.143) 09.12.10 198 0
161703 리눅스 쪽 하는 사람한테 make 문법은 필수인가? [8] ㄱㄱ(211.254) 09.12.10 205 0
161701 이번학기 CS 수업은 그저 감동 [1] JuEUS-U갤로그로 이동합니다. 09.12.10 155 0
161700 파이썬 [4] 파이썬(121.138) 09.12.10 136 0
161699 tomcat jndiname불러오기 질문 usoo0갤로그로 이동합니다. 09.12.10 128 0
161698 횽아들 Qt로 공부하고.. 소스 블로그에 정리중인데 [4] 허허벌판갤로그로 이동합니다. 09.12.10 95 0
161697 프리허그 시발... [3] ㅎ3(112.222) 09.12.10 142 0
161694 어떠한 변명을 늘어놓고 아무리 뛰고 난다고 해도 프로그래머야. LaLuna(211.252) 09.12.10 90 0
161693 for문과 while문에서 continue의 차이 [2] 세브(211.117) 09.12.10 294 0
161692 c++에서 씨그마처리? [4] 존나할거없네갤로그로 이동합니다. 09.12.10 101 0
161691 어째 .. 삼성 구질구질해 보인다 .. [4] Pupustory갤로그로 이동합니다. 09.12.10 169 0
161690 이 후달리는 생퀴들 [4] 발냄새맛캔디갤로그로 이동합니다. 09.12.10 95 0
161688 MFC와 윈속을 이용한 채팅방 구현에서 이벤트 신호/비신호 문제 [4] 상병인듯(210.179) 09.12.10 126 0
161687 맥북 하드디스크를 늘려야겠어연 [7] algo갤로그로 이동합니다. 09.12.10 135 0
161686 for문과 while문에서 continue의 차이 [11] 망할c(61.252) 09.12.10 140 0
161685 xeroxy는 봅미다. [4] JuEUS-U갤로그로 이동합니다. 09.12.10 78 0
161684 횽들 존나급해 이거 해주면 내가 계좌이체 2만원 싸줄게 제발 [14] 씬입사원갤로그로 이동합니다. 09.12.10 182 0
161683 유닉스쪽에서 7~8년 경력자 윈도우쪽을 하려면 어케 시작하면 좋을까? [17] ㅇㅇ(210.94) 09.12.10 206 0
161682 유리한 횽 봐줘 [12] 유리한님봐봐(210.94) 09.12.10 159 0
161681 열혈 TCP/IP 나오네. [2] yundream(211.189) 09.12.10 160 0
161680 우울한 3D... [2] 물속의다이아갤로그로 이동합니다. 09.12.10 129 0
161679 시퀀스 다이어그램 그리는데 무슨프로그램 필요해? [5] 신발라마갤로그로 이동합니다. 09.12.10 194 0
161678 구굴 가젯 채팅 테스트 [1] yundream(211.189) 09.12.10 131 0
161676 아까 밑에 2만원 준다는 사람인데 이거봐봐 [13] ㅂㅈㄼㅈ(210.94) 09.12.10 164 0
161674 프겔 단체티에 이것도 넣어주세염. [2] 씬입사원갤로그로 이동합니다. 09.12.10 135 0
161673 님들아 저작권 관련 질문 있음 [8] ㅇㅇㅃ갤로그로 이동합니다. 09.12.10 98 0
161672 횽들 존나급해 이거 해주면 내가 계좌이체 2만원 싸줄게 제발 [12] ㅂㅈㄼㅈ(210.94) 09.12.10 141 0
161670 티 이미지는 말이지.. [5] rntjr갤로그로 이동합니다. 09.12.10 101 0
161669 추천 티 이미지 [2] 켁큇갤로그로 이동합니다. 09.12.10 111 0
161668 시그마님 보세요. LightEach갤로그로 이동합니다. 09.12.10 57 0
161667 남성과 여성은 서로를 존중해 주었으면 좋겠다. [7] ㅎ4(61.77) 09.12.10 170 0
161665 너님들은 어렸을 때 어떤집에서 살았음?? [4] 개쉛기갤로그로 이동합니다. 09.12.10 109 0
161664 일한사전횽 아까 문제 [10] zeroxy갤로그로 이동합니다. 09.12.10 84 0
161663 단체티 삽입이미지에는 유리한갤로그로 이동합니다. 09.12.10 49 0
161661 프갤티 디자인 프로토 타입!! [4] 초밥술사갤로그로 이동합니다. 09.12.10 121 0
161660 프겔 단체티 삽입이믜지 [7] 세브(211.117) 09.12.10 126 0
161659 프갤 단체티 문구 [24] 유리한갤로그로 이동합니다. 09.12.10 233 0
161658 cls 함수와 pause 쉬운문제좀 알려주세요 ㅜㅜ [4] 대딩(202.30) 09.12.10 75 0
161657 일영사전횽 아까 그 문제 [7] Gromit갤로그로 이동합니다. 09.12.10 112 0
161655 현대인의 삶 [6] ㅎ3(112.222) 09.12.10 97 0
161653 에버그린 수학도 잘하나여??? [6] AL갤로그로 이동합니다. 09.12.10 132 0
161652 개쉛기횽 오마쥬 [4] 유리한갤로그로 이동합니다. 09.12.10 105 0
161650 아놬씌발 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ [9] 개쉛기갤로그로 이동합니다. 09.12.10 196 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2