2010년 12월 3일 금요일

메모리 !!

매일 매일 다른 걸 하고 있습니다.
오늘은 한번쯤은 만나게 되는 메모리.

어느 게임엔진이나 비슷합니다만,
메모리는 자체 얼로케이터를 사용하게 됩니다.
(물리 엔진이나 뭐 이것저것들 보면 대부분 자체 메모리 얼로케이터가 따로 있는 것을 볼 수 있습니다. 귀찮게시리요-ㅅ- 스케일폼도 따로 있었던듯; )

기본적인 인터페이스만 제공하는 new / delete 또는 malloc;;만으로는 불가능하니까 그렇겠지요?
참고 : http://jacking75.cafe24.com/Tip/AboutHeap.htm

오늘 생겼던 문제는 align 문제 였습니다. 물리나 시뮬레이션 같은 경우는 아무래도 SIMD(SSE?) 버전을 사용하기 마련이고,  16비트 align이 기본적으로 작동해야 하는 경우가 있더군요-ㅅ-(물론 그쪽 라이브러리 데이타를 사용할 경우이겠지요).

일단 제일 깔끔한 건
외부 라이브러리 데이타만 모아서 외부 라이브러리에서 제공하는 얼로케이터를 이용하는 할당 받고 사용하는 것이라고 생각합니다.
(이래서 클린 코드에서 무조건 인터페이스 만들라고 하는 듯 합니다;;; )

대략 코드상으로 생각해보면

3rdPartyPhysicsComponent
{
   MacroFor3rdPartyAllocator()
    property1 , property2
}

MyEngineComponent
{
  3rdPatyPhysicsComponent* data;
  my datas,,,
}

대략 이런 형태가 될 거 같습니다.

하지만 뭐 내쪽 컴포넌트에서 살짝 서드파티 컴포넌트를 붙여서 쓸 수도 있겠지요-_-;
암턴 이런 경우 때문에 메모리 얼로케이터는 엔진껄로 데이타는 서드파티 클래스 이런 경우가 생깁니다.

보통은 특별한 문제는 안 생깁니다만, SIMD 버전등을 사용해야 하는 경우라면, 16바이트 얼라인을 맞춰줘야 겠지요.

__declspec(align(16)) 하고 열심히 선언해주면 new/delete를 오버라이트 해주지 않았을 경우에는 문제가 없습니다.(내부적으로 어떻게 처리하는 지는 모르겠네요.)

오버라이드를 했을 경우에는 편안한 방법은 없는 거 같습니다.
일단 좀 찾아보니 얼라인이 필요한 클래스에서 new/delete를 따로 얼로케이트 하는 방법이 있네요

Class MyEntity : public BaseEntity, Allocater<16>
{
}

이런 형태로 하면 된다고 하는 군요.
뭐 전 매크로로 필요한 경우 디파인해서 쓰도록 했습니다.;;후우;;

요즘 시스템쪽 기초 공부하느라 정신이 없군요;
메모리 얼로케이션 1.5 기가 정도 넘어가면 불안해진다는 것도 알게 되었구요;
(이건 왜 그럴까요?--+)