프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
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 사용하세요.

댓글을 달아 주세요

  1. Favicon of https://gamedevforever.com 친절한티스 2012.06.17 23:51 신고  댓글주소  수정/삭제  댓글쓰기

    for ( auto iter = m_objectList.begin() ; iter != m_objectList.end() ; ++iter )
    iter->second->UpdateTitleGauge(elapsedTime);

    이거랑 같은건가요?

  2. Favicon of http://lunapiece.net Lyn 2012.06.18 12:36  댓글주소  수정/삭제  댓글쓰기

    2010 아니어도 boost::function, boost::bind 를 쓸 수 있다는!

  3. Hybrid 2012.06.18 14:20  댓글주소  수정/삭제  댓글쓰기

    전 그 발음하기 어려운 C++아저씨 책 나올 때까지 참는 중ㅜㅜ

  4. Favicon of https://gamedevforever.com cagetu 2012.06.20 13:07 신고  댓글주소  수정/삭제  댓글쓰기

    네이티브 멀티플랫폼 개발자에게는 먼 산 이야기~ 냥~

  5. 조프 2012.06.21 18:44  댓글주소  수정/삭제  댓글쓰기

    함수만 보고 http://www.cplusplus.com/reference/std/iterator/advance/ 쓰란 얘길 줄 알았는데 다른 얘기였군요...

  6. Favicon of http://nomoreid.egloos.com 우주괴물 2012.06.25 10:32  댓글주소  수정/삭제  댓글쓰기

    lambda를 인자로 받는 함수는 std::function말고 템플릿으로 구현하는 방법도 있습니다.

    속도는 이게 더 빠르다고 알고 있습니다.

    http://rein.kr/blog/archives/2279 <- 이 포스팅을 참고 하세요.

  7. 나그네 2013.01.16 15:39  댓글주소  수정/삭제  댓글쓰기

    움?!
    그냥
    std::advance 쓰면 훨씬 더 아름다워 질거 같은데요;;;