728x90

어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 개체를 제공하는 패턴을 프록시 패턴이라고 한다.


사용하게 되는 곳은 기존 인터페이스의 형태를 변경하지 않고 원형 클래스의 행동을 변경할 때 유용하게 사용된다. 특히 원형 클래스가 서드 파티 라이브러리인 경우 직접적인 변경이 어렵기 때문에 프록시 패턴이 더욱 유용하다.


프록시 패턴의 UML다이어그램은 다음과 같이 그려질 것이다.


아마도 기본적인 Proxy Pattern을 적용하면 이런 형태가 될 것이다.


다른 방법으로 Proxy Pattern을 적용하려면 프록시와 원형 API가 함께 사용하는 추상 인터페이스를 통해 이런 접근 방식을 늘리는 것인데, 이 경우 비록 원형 API를 변경할 상황이 발생한다 해도 두 API를 계속해서 동기화 시킬 수 있다.




이 패턴을 사용했을 때의 장점은 다음과 같다.

 - 원형 객체의 지연된 인스턴스 구현 : 이 경우 원형 객체는 실제로 메서드 호출이 발생하기 전까지 인스턴스화되지 않는다. 

원형 객체의 인스턴스가 많은 메모리를 차지하는 경우라면 지연된 인스턴스 생성이 절대적으로 필요하다.


 - 원경 객체의 접근 제어 구현 : 예를 들어, 올바른 권한을 가진 사용자만이 원형 객체의 특정 메서드를 호출할 수 있는 기능을 구현하기  위해 원형 객체와 프록시 사이에 권한 계층을 두고 접근을 제어한다.


 - 디버그 또는 드라이런 모드 지원 : 프록시 내에서 원형 객체를 호출하는 모든 메서드의 실행 코드를 디버깅하거나, 예를 들어 객체의 상태를 더 이상 저장하지 않도록 행동을 변경하는 것처럼 프록시 내에서 원형 객체의 특정 메서드에 어떤 값을 전달하지 않는 드라이 런 테스트를 진행할 수 있다.


 - 스레드에 안전한 원형 객체 지원 : 뮤텍스 락을 추가시켜 메서드가 스레드에 안전하도록 만들 수 있다.


 - 자원 공유 지원 : 같은 원형 객체를 사용하는 여러 개의 프록시 객체를 사용할 수 있다. 여러 개의 객체가 동일한 데이터를 공유하여 메모리 공간을 최소화 시킨다.


 - 원형 객체의 향후 변경으로부터 보호 : 현재 사용 중인 라이브러리가 향 후 변경될 것을 예상하고 프록시를 생성해서 현재 라이브러리의 동작을 그대로 옮겨 패턴을 구현한다. 그리고 예상대로 라이브러리가 변경이 되면 프록시 객체를 통해 기존의 인터페이스는 그대로 유지하고 새로운 라이브러리의 메서드를 사용하기 위한 구현 부분을 변경하며, 이때는 자연스럽게 어댑터 패턴을 사용한다.

728x90
728x90

이번에 "게임 엔진 아키텍처" 라는 책을 읽으면서 좋은 내용이 있어서 정리해 놓는다.


나의 경우 inline 함수를 최적화를 생각하며 자주 사용하고 있다.

하지만 자세한 내용은 몰랐던 것 같다. ㅎㅎ


inline 함수가 다른 cpp 에서도 사용하기 위해서는 반드시 .h에 정의되어 있어야만 한다.

왜냐하면, 컴파일러가 inline 함수를 처리하려면 컴파일러가 함수의 정의 부분을 볼 수 있어야하는데, .cpp에 있다면 볼 수가 컴파일때에는 볼 수가 없기 때문이다.


// foo.h

inline int max(int a, int b)

{

return (a > b) ? a : b;

}


위의 경우 아주 올바른 inline 함수이다. 왜냐하면 컴파일러가 볼 수있다.


// 이 함수는 inline으로 정의하였지만, inline으로 처리되지 않는다.

// 왜냐하면 컴파일러가 함수의 구현을 볼 수 없기 때문이다.

// foo.h 

inline int max(int a, int b);


// foo.cpp

inline int max(int a, int b)

{

return (a > b) ? a : b;

}



이 내용은 전혀 몰랐던 것이기 때문에 공유한다.


728x90
728x90

이 툴은 사용 중인 Memory 공간을 확인 할 수 있다.


GUI를 이용해서 Image, Shareable, Heap, Sstem, Private, Mapped File, Stack 등의 메모리를 확인 할 수 있다.


단, 32Bit에서만 제대로 사용이 가능하다....


혹시 64Bit용이 어디있는지 아시는 분은 좀 알려주세요...




다운로드 : https://docs.microsoft.com/ko-kr/sysinternals/downloads/vmmap

728x90

'Dev Tool' 카테고리의 다른 글

Dev Tool - CMake  (0) 2018.02.26
Dev Tool - PixelAtro App  (0) 2018.02.22
Dev Tool - Q-Dir  (0) 2017.09.08
Dev Tool - GPS Korea 좌표 변환기  (0) 2017.04.20
Dev Tool - TortoiseSVN  (0) 2017.02.23
728x90

MFC에서 Thread를 그냥 막 사용하다보니 잘못 사용한 예가 있어서 정리한다.


예를 들어 


void CMyClass::CreateSystemStatusThread()

{

static auto Func = [&]()

{

while(m_bSystemStatusThreadOnOff)

{

if (m_bSystemOnOff)

((CStatic*)GetDlgItem(IDC_STATIC))->SetBitmap(m_pngOn);

else

((CStatic*)GetDlgItem(IDC_STATIC))->SetBitmap(m_pngOff);


Sleep(1000);

}

}


m_bSystemStatusThreadOnOff = true;

m_thrSystemStatus = std::thread(Func);

}


void CMyClass::DestroySystemStatusThread()

{

m_bSystemStatusThreadOnOff = false;


if (m_thrSystemStatus.joinable())

    m_thrSystemStatus.join();

}



위와 같이 thread를 만들어놨다고 치자.

그렇다면 DestroySystemStatusThread()를 어디에서 호출해야 하는지 생각을 해보아야 한다.


나의 경우 당연히 CMyClass의 소멸자에 넣으면 잘 종료될 것이라고 생각을 하였지만, 당연히 아니었다.

왜냐하면 CMyClass의 소멸자가 호출되기전에 GetDlgItem(IDC_STATIC)가 먼저 없어지기 때문이다.

즉, 프로그램 종료 중에 GetDlgItem(IDC_STATIC)를 호출하면서 프로그램이 잘못된 것을 참조했다는 에러가 발생하게 된다.


그래서 MFC의 소멸 순서를 확인해 본 결과, OnDestroy()에서 DestroySystemStatusThread() 호출해서 Thread를 먼저 파괴해주어야 한다.

728x90
728x90

그냥... 가끔 쓸 일이 있을 것 같아서 간단하게 만들어놨다..


OpenAL을 사용하기 쉽게 모듈화 시켰을 뿐이다.


다음에 더 추가해야 할 기능이 있다면, 클래스에 기능을 추가하면 될 듯하다.


사용 방법



CSound.cpp

CSound.h


728x90

'Game Programming > OpenAL' 카테고리의 다른 글

OpenAL - OpenAL 이란 ?  (0) 2017.09.20
728x90

CImage를 이용하여 많은 이미지를 사용하고 있었는데, 이미지를 변경할 때마다 Memory Leak이 발생하는 현상을 발견하고,


구글링을 해도 딱히 방법이 나오지 않아서 직접 테스트하다가 해결하였다.


기존 코드


위의 경우 분명 DeleteObject() 를 이용해서 hOldBmp 를 지우기 때문에 메모리 릭이 없을 거라 판단을 하고 작업을 진행하고 있었다. 


하지만 여러가지 테스트 결과 DeleteObject() 한번 더 해줘야 하는 것 같다.


수정한 코드


우선 img를 static으로 선언하여 계속 가지고 있으면서 이미지를 변경할 때마다 img를 Destroy()하고 또 한번 DeleteObject()를 해야만 Memory Leak이 발생하지 않았다.



MFC를 이용해서 UI 작업 하는 게 생각만큼 쉽지는 않나보다... ㅎㅎ

728x90
728x90

       

               [기본 다이얼로그] 


 

        [타이틀바와 테두리에 이미지를 넣은 후]



나는 MFC에서 위와 같이 변경하기 위해인터넷에서 정말 많은 자료를 검색하다가 잘 정리해놓은 블로그가 없어서 예전에 찾았던 코드를 분석하였다.


http://grandstayner.tistory.com/entry/MFC-%EB%8B%A4%EC%9D%B4%EC%96%BC%EB%A1%9C%EA%B7%B8Dialog-%EC%97%90-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%9E%85%ED%9E%88%EA%B8%B0


다이얼로그 커스터마이징 코드를 분석하며 그냥 필요한 부분만 추출하였다.


bitmap 대신 png를 이용하여 작업을 하였다.



1. 클래스 헤더 파일에 CRgn 과 CImage 변수들을 추가한다.



2. 이미지들을 로드한다. 

   (CUtil::GetExeDirectoryW() 함수는 그냥 현재 폴더의 경로를 알아내기 위해 내가 만들어서 사용하고 있는 Util 클래스이다.)



3. Draw 할 함수들을 만든다.



5. OnPaint()에서 배경을 그려준다.



6. OnActivate(), OnNcPaint(), OnNCActive() 에 Border를 그려준다.



7. OnSize() 에 다음 코드를 추가해준다.



이렇게하면 잘 입혀질 것이다.

728x90
728x90


다음과 같이 PreTranslateMessage()에서 마우스 버튼을 눌렀을때 이미지를 변경하려고 했는데, 버튼을 연속으로 누르다보면 인식이 안되는 현상이 있었다. 그래서 이리저리 테스트를 해보다보니 연속으로 누르다가 WM_LBUTTONDOWN이 아니라, WM_LBUTTONDBLCLK 이 발생한다는 것을 확인하였다.


그래서 다음과 같이 수정하여 해결을 하였다.




728x90

+ Recent posts