안녕하세요. ozlael형님 보다 1년이나 젋은 랩좀비, 랩하는 좀비군입니다. 영계입니다(...)
오늘은 회사에서 일을 하다가 매우 눈에 거슬리는 함수를 발견해서, 그것을 좀 더 스무스하게 바꾼 경험에 대해서 얘기해 볼까합니다. 뭐 다들 알고 있는 것일 수도 있구요.
일단 다음과 같은 함수가 있었습니다.
CBaseObject* CWorld::GetIndexedObject(int index) { int curIndex = 0; for ( auto iter = m_objectList.begin() ; iter != m_objectList.end() ; ++iter ) { if ( curIndex == index ) return iter->second; ++curIndex; } return nullptr; }
이 함수의 문제점은 외부에서 컨테이너에 접근하기 위해서 0~m_objectList.size()까지 하나씩 접근하게 된다는 거지요. 그래서 오브젝트의 갯수가 10개 정도만 되도 55번의 계산을 반복하게 됩니다. 100개가 되면 5050개로 기하급수적으로 많아지게 되는 아름답지 못한 상황이 펼쳐집니다.
아마 저렇게 구현이 된 이유가 vector가 아닌 list나 map이어서 그랬을 겁니다. vector라면 문제가 없죠. -캐쉬문제는 일단 넘어가고- 그냥 return 하면 되니까요. 그래서 어떤 방식으로 처리할까 고민하다가, 람다와 std::function을 통해서 나름 아름답게 처리가 되도록 변경하였습니다.
함수 본체는 이렇게 구현되고.. ...(std::function이 html을 방해해서 그냥 붙여 넣기)
{
std::for_each(m_objectList.begin(), m_objectList.end(), [&](std::pair<OBJHANDLE, CBaseObject*> objHandle) {
Func(objHandle.second);
});
}
void CView::OnUpdateDynamicObjectTitle( float elapsedTime ) { auto UpdateTitleGagueFunct = [=](CBaseObject* pBaseObject) //람다로 미니함수를 만듭니다. { pBaseObject->UpdateTitleGauge(elapsedTime); }; m_pWorld->ApplyFunctionToBaseObject(UpdateTitleGagueFunct); //람다를 넘겨주어서 컨테이너 안에서 계산하도록 합니다. }
'프로그래밍' 카테고리의 다른 글
유니티엔진의 coroutine & yield 1편. FSM의 습격 (5) | 2012.06.20 |
---|---|
데이터타입을 가지고 있는 메시지ID (6) | 2012.06.18 |
유니티는 C#으로 작성했다? (9) | 2012.06.17 |
Unity, 널 사랑하지만 너의 UV만은 용납할 수 없다. 철썩~ (21) | 2012.06.10 |
유니티 엔진의 멀티플랫폼 심장 Mono (15) | 2012.06.05 |