728x90

DirectX11을 이용한 Application을 개발하는 도중에 이상한 현상을 발견하였다.


이 현상은 NVidia 계열의 그래픽 카드에서는 발생하지 않고, AMD 계열의 그래픽 카드에서만 발생하였다.


이 현상은 Application 내에서 Device 및 Context 등의 자원들을 계속 생성 및 해제 하다가 DirectX 함수에서 빠져나오지 


못하고 계속 멈춰있는 현상이다.


며칠 테스트를 해본 결과...


CreateBlendState() 함수를 사용할 때 ID3D11BlendState 변수를 생성하고, 해제를 하지 않거나,


CreateSamplerState() 함수를 사용할 때 ID3D11SamplerState 변수를 생성하고, 해제를 하지 않거나,


CreateRasterizerState() 함수를 사용할 때 ID3D11RasterizerState 변수를 생성하고, 해제를 하지 않거나,


등등의 다양한 경우가 있을 것이다.


뭐든 이러한 변수들을 해제하지 않으면서, ID3D11Device등의 리소스를 생성 및 해제를 반복하게 되면, DirectX 함수에서 빠져나오지 못한다.



ps. 생성한 것은 반드시 해제하도록 하자...

728x90
728x90

NGUI는 무료 버전이었다가 최근에 유료 버전으로 변경되었다.


그래서 무료 버전을 블로그에 따로 올려둔다. (다시 찾기 귀찮...)





ngui-270.vol1.egg

ngui-270.vol2.egg

ngui-270.vol3.egg


728x90
728x90
Sleep(1)을 했는데, 1ms를 자는게 아닐 때에는 timeBeginPeriod(), timeEndPeriod()를 이용하면 된다.

사용 예)
int main(void)
{
timeBeginPeriod(1);

....

timeEndPeriod(1);
return 0;
}

이 함수의 기능은 주기적인 타이머의 최소 해상도를 설정한다.

프로그램이 이상하게 Frame이 안나올 경우 이 함수를 이용해서 테스트 해보자.


"단점은 하드웨어에 좋지 않은 영향을 끼치기 때문에 기왕이면 사용하지 않는 것이 좋다.

하드웨어가 지원한다면 QueryPerformanceFrequency를 사용하는 것이 더 이득이다. "



Requirements:

Minimum supported client

Windows 2000 Professional [desktop apps only]

Minimum supported server

Windows 2000 Server [desktop apps only]

Header

Mmsystem.h (include Windows.h)

Library

Winmm.lib

DLL

Winmm.dll





728x90
728x90
  • DWORD_PTR WINAPI SetThreadAffinityMask( HANDLE hThread DWORD_PTR dwThreadAffinityMask );  


  • Thread Handle을 인수로 받아 특정 코어에서 해당 Thread를 실행하도록 지정해주는 함수.

    0x01 부터 순서대로 한비트씩 쉬프트 하면 원하는 코어를 결정할수 있다.

    주의할점은 하나의 Thread는 여러개의 코어가 모두 실행시킬수 있는데

    만약 첫번째 코어와 두번째 코어가 모두 실행 가능하도록 설정하고 싶다면

    01 과 10 의 OR 연산결과값인 0x03 을 설정하면 되는것이다.

    만약 코어 1,2,3 에서 실행가능하게 하고 싶다면

    001 , 010  그리고 100 를 OR 연산하여 호출해주면 된다.


    아래의 코드는

    SetThreadAffinityMask 를 테스트해보는 예제인데 

    주석처리된 부분을 그대로 두고 실행하면 재미있는 결과를 얻을수 있다.

    실행하면 Core의 수를 출력한뒤 코어의 갯수에 해당하는 Thread를 생성하고

    무한루프를 돌려서 CPU 점유율을 100%로 만들어 버린다.

    그리고 콘솔창에서 숫자키 1~9까지의 숫자를 사용해 원하는 번호의 Thread를 정상종료

    시킬수 있는데. 만약 듀얼코어에서 쓰레드 하나만 죽인다면 50%의 점유율을 차지하게 될것은

    당연한 이치이지만. SetThreadAffinityMask 를 사용하지 않았을 경우와 사용했을 경우의

    점유율 그래프를 본다면 이마를 탁 치게 될것이다. ( 벌써 알고 계셨다면.. 굳ㅋ )

    1. #include <iostream>  
    2. #include <conio.h>  
    3. #include <windows.h>  
    4.   
    5.   
    6.   
    7. using namespace std;  
    8.   
    9.   
    10. DWORD WINAPI ThreadProc(LPVOID arg)  
    11. {  
    12.  while( *((bool*)(arg))  )Sleep(0);  
    13.   
    14.   
    15.  return 0;  
    16. }  
    17.   
    18.   
    19. int main(int argc, char argv[])  
    20. {  
    21.  SYSTEM_INFO info;  
    22.  GetSystemInfo(&info);  
    23.   
    24.   
    25.  cout << info.dwNumberOfProcessors << endl;  
    26.   
    27.   
    28.  bool *flag = new bool[ info.dwNumberOfProcessors ];  
    29.   
    30.   
    31.  HANDLE *hTrhead = new HANDLE[info.dwNumberOfProcessors];  
    32.   
    33.   
    34.  for(int i = 0 ; i < info.dwNumberOfProcessors ; i++ )  
    35.  {  
    36.   flag[i] = true;  
    37.   hTrhead[i] = CreateThread(0,0,ThreadProc,&flag[i],0,0);  
    38.   //SetThreadAffinityMask( hTrhead[i]  , 1 << i );  
    39.  }  
    40.   
    41.   
    42.   
    43.  char c;  
    44.  while(1)  
    45.  {  
    46.   c = getch();  
    47.   
    48.   
    49.   if( c >= '1' && c <= '9' )  
    50.    flag[ c-'1' ] = false;  
    51.   
    52.   
    53.   if( c == 13 )  
    54.    break;  
    55.  }  
    56.   
    57.   
    58.  return 0;  
    59. }  


    사용자 삽입 이미지




    야래 사진이 SetThreadAffinityMask() 를 사용하지 않아서코어가 쓰레드의 삽질을같이 보듬어주고 있는경우고


    사용자 삽입 이미지



    아래의 사진은 SetThreadAffinityMask를 통해 하나의 코어가 하나의 쓰레드만 담당하여2번째 쓰레드를 죽이고나니 개미와 베짱이를 연출시킨 상황이다.


    사용자 삽입 이미지




    출처 : http://1stpasa.tistory.com/8

    728x90
    728x90



    p는 int의 Pointer이고, pr은 int의 Pointer에 대한 참조이다.




    여기에서 int* p는 int* b의 복사본이기 때문에 p의 값은 변경되어도 b의 값은 변경되지 않는다.


    하지만 int* pr의 경우에는 c의 레퍼런스이기 때문에 pr의 값이 변경되면 c의 값도 변경된다.



    출처 : http://www.cplusplus.com/forum/unices/23534/

    728x90
    728x90
    728x90
    728x90
    728x90

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

    Unreal - 환경 세팅  (0) 2024.01.31
    Unreal5 문서  (0) 2023.09.17
    728x90

    C++11에서 가장 큰 장점 중 하나는 std::thread 일 것이다.


    C++11의 Thread 라이브러리를 사용하면 복잡하고 플랫폼마다 다르게 기술해야 하는 기존의 스레드 프로그래밍을 단순하면서도 플랫폼 독립적으로 구현할 수 있다.


    std::thread를 사용하기 위해선 #include <thread>만 추가하면 된다. 다른 라이브러리는 추가할 필요가 없다.


    기본적인 사용방법은 아래와 같다.


    밑에 join() 함수를 사용하지 않으면, Thread보다 main()가 먼저 끝나기 때문에 에러가 발생하게 된다. 주의하도록 하자.


    Thread에 매개 변수를 넘기기 위해서는 아래와 같이 하면된다.


    Visual Studio 2012에서는 넘길 수 있는 매개변수의 개수가 5개였다. (어떤 사이트에서 4개라고 봤는데... Update가 다른지는 모르겠지만 나의 경우 5개인 것을 확인하였다.)


    마지막으로 joinable() 함수로 이 std::thread 변수가 thread객체를 가지고 있는 것을 확인하고 종료할 수도 있다.


    더 많은 기능이 있지만, 현재는 이정도만 사용할 것 같아서... ^^;;

    728x90

    + Recent posts