꽃미남 프로그래머 김포프가 창립한 탑 프로그래머 양성 교육 기관 POCU 아카데미 오픈!
절찬리에 수강생 모집 중!
프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 알 수 없는 사용자

안녕하세요. 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을 방해해서 그냥 붙여 넣기)

void CWorld::ApplyFunctionToBaseObject( std::function<void(CBaseObject*)> Func )
{
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); //람다를 넘겨주어서 컨테이너 안에서 계산하도록 합니다. }


우왕ㅋ굳ㅋ. 여러분 vs2010 사용하세요.
반응형
,