블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (667)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (105)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (218)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total345,595
Today85
Yesterday123
http://www.sarangnamu.net/basic/basic_view.php?no=2245&page=81&sCategory=0

어떤 작업을 수행하는데 걸리는 시간을 알고 싶은 경우는 흔한 경우죠
그런데 방법을 잘몰라서 그냥 넘어가는 경우가 많죠.
아래 소개된 방법이 가장 일반적인 방법이며 이보다 나은 방법은 아마 없을
겁니다. 별루 어렵진 않으니 찬찬히 보세요.

컴퓨터에는 Clock Ticks라는 것이 있습니다. 그리고 운영체제에는 어떤
프로세스가 시작한지 얼마나 지났는지 알려주는 clock()함수를 가지고
있구요. 이것을 이용하는 것입니다.

clock_t current_tick = clock();  


이 코드로 현재 프로세스가 실행한지 얼마나 지났는지를 Clock Tick단위로
알수 있습니다. 시간을 알고 싶으시면 이 Clock Tick단위를 초단위로 변환
해주면 되죠.

double current_sec = current_tick / CLOCKS_PER_SEC;
이 코드가 Tick 단위를 초단위로 환산해주는 코드입니다.

CLOCKS_PER_SEC은 time.h화일에 정의되어 있는 상수입니다.

간단히 예제를 만들어 보면,

#include "stdio.h"
#include "time.h"

void main()
{
clock_t before;
double  result;

before  = clock(); // 여기서 시작 시간 기억해뒀다가

for ( int i = 0; i < 32765; i++ )
{
printf("%d\n", i );
}

result = (double)(clock() - before) / CLOCKS_PER_SEC; // 여기서 계산...

printf("걸린시간은 %5.2f 입니다.\n",result);
}

간단하기 위해 고전적인 스타일로 예를 들었지만 AppWizard로 만든 MFC환경에서
도 잘 돌아갑니다.

별루 어렵진 않았죠? 하지만 유용한 방법이니 잘 기억해 두시길 바랍니다.

'유용한 것들_func' 카테고리의 다른 글

프로그램 수행 시간 측정  (0) 2011.02.01
파일 검색, 파일 찾기  (0) 2010.08.26
마우스 커서 설정.  (0) 2010.06.09
unicode에서 한글출력  (0) 2010.06.09
폴더지정 창 열기  (0) 2010.06.09
InterlockedIncrement(), InterlockedDecrement()  (0) 2010.06.04
Posted by 붕대마음

댓글을 달아 주세요

은근히 이런 일을 자주 할 때가 있다.
이번에 배포버전 만들기 전에 그래픽 데이터 파일의 중복검사 체크 메크로를 만들면서
상당히 많이 사용했던 기억이...
 
 CFileFind fileFinder;
 CString strFile = "*.*";
 BOOL bResult = file.FindFile(파일 이름);  // 파일의 존재유무 검사
   
 if(!bResult)                            // case - 파일이 없을 경우
 {
  }  
 return FALSE;
 

'유용한 것들_func' 카테고리의 다른 글

프로그램 수행 시간 측정  (0) 2011.02.01
파일 검색, 파일 찾기  (0) 2010.08.26
마우스 커서 설정.  (0) 2010.06.09
unicode에서 한글출력  (0) 2010.06.09
폴더지정 창 열기  (0) 2010.06.09
InterlockedIncrement(), InterlockedDecrement()  (0) 2010.06.04
Posted by 붕대마음

댓글을 달아 주세요


툴프로그램을 만들다 보면 시간을 많이 잡아먹는 기능을 추가해야 할 때가 있다.
그럴때는 사용자를 배려하는 마음으로 커서를 바꿔주자.

// 모래시계 커서
HCURSOR hWaitCursor = ::LoadCursor(NULL, IDC_WAIT);
HCURSOR hCursor = SetCursor( hWaitCursor );

....

// 커서복귀
 SetCursor( hCursor );

'유용한 것들_func' 카테고리의 다른 글

프로그램 수행 시간 측정  (0) 2011.02.01
파일 검색, 파일 찾기  (0) 2010.08.26
마우스 커서 설정.  (0) 2010.06.09
unicode에서 한글출력  (0) 2010.06.09
폴더지정 창 열기  (0) 2010.06.09
InterlockedIncrement(), InterlockedDecrement()  (0) 2010.06.04
Posted by 붕대마음

댓글을 달아 주세요

유니코드기반에서 fputws로출력을 하는데 이상하게 한글부분이 출력이 안된다.
유니코드기반의 함수에서 한글을 출력하기 위해서는
#include "locale.h"
...
_wsetlocale(LC_ALL, L"korean");
...
wprintf(...) or fputws(...);
이러한 설정을해주어야 한다.
Posted by 붕대마음

댓글을 달아 주세요

CString strFolderName = _T("")

    ITEMIDLIST *pildBrowse;
    char pszPathname[MAX_FOLDERNAME_SIZE];
 
    BROWSEINFO bInfo;
    memset( &bInfo, 0, sizeof(bInfo));

    bInfo.hwndOwner = GetSafeHwnd();
    bInfo.pidlRoot = NULL;
    bInfo.pszDisplayName = pszPathname;
    bInfo.lpszTitle = _T("폴더를 선택하세요");
    bInfo.ulFlags = BIF_RETURNONLYFSDIRS;

    pildBrowse = ::SHBrowseForFolder(&bInfo);
 
    if( pildBrowse != NULL )
    {
        SHGetPathFromIDList(pildBrowse, pszPathname);
        strFolderName.Format(_T("%s"), pszPathname);

 

       CFileFind FileFinder;

       strFolderName = strFolderName + _T("*.원하는확장자");
       BOOL bWorking = FileFinder.FindFile(strFolderName);

       while ( (bWorking) )
       {
           bWorking = FileFinder.FindNextFile();

           if ( FileFinder.IsDots() ) continue;         

           if ( FileFinder.IsDirectory() )
           {

              // 하위폴더까지 처리하려면 여기서 뭔가 해야겠죠?
           }

           else
           {

              // DO SOMETHING HERE! 

           }
    }


Posted by 붕대마음

댓글을 달아 주세요


상호잠금 함수(interlocked function)들은 다른 동기화 방법들에 비해 간단하고 빠르며
스레드를 차단하지도 않는다는 장점을 가지고 있다.
Windows 의 상호잠금 함수는 InterlockedIncrement() 와 InterlockedDecrement() 이다.
이들은 32비트 부호 있는 정수들에 적용된다. 

상호잠금 함수를 사용할 때, 주의할 점은 아래와 같다. 

* InterlockedIncrement 함수를 호출한 쓰레드가 N 의 새 값을 사용하기 전에 다른 쓰레드가 N 의 값을 변경할 가능성이 존재한다.

* N 을 2 증가하기 위해서 InterlockedIncrement 함수를 연달아 두 번 호출하는 것은 위험하다. 이는 그 두 호출 사이에 다른 스레드가 실행될 가능성이 존재하기 때문이다. -> InterlockedExchangeAdd 함수를 사용하여 한다.

"어떤 함수 조건 없이 뭉치를 하나의 블럭처럼 사용하게 하는 것은
EnterCriticalSection ~ LeaveCriticalSection 인데"

라고 했는데, critical section은 님이 말하는 그런 게 아니라, synchronize를 하는 겁니다. mutex와 같은 기능이지만, 더 빠르고 메모리를 작게 차지하는 대신, 한 프로세스 내에서만 쓸 수 있는 것이지요. unix에서는 mutex는 있지만, critical section과 같은 건 없습니다.

 

InterlockedIncrement()등의 함수는 위의 일반적인 synchronize를 많이 쓰는 패턴에 대해서 더 간단하게 쓸 수 있게하는 거지요. critical section의 예를 들면, CRITICAL_SECTION변수를 잡아줘야하고, Initialize...(), Delete...()이 필요하며, 변수 바꾸기 전후에 항상 Enter...()와  Leave...()를 해야 합니다. 이걸 한 큐에 할 수 있게 하는 거죠.

 

또 하나 차이점은 Interlocked*()들은 다른 프로세스이지만 변수가 shared memory object라면(CreateFileMapping()등으로 만든) mutex처럼 다른 프로세스들 간의 동기화에 쓸 수 있습니다.

 

그리고, 님이 끝에 말한

"한 예로 증가 또는 감소하는 64bit 변수가 있다면 이게
어떤 결과값에 따라 커지게 혹은 작아지게 업데이트되는 것을 의미하는 건가요?

숫자의 크기가 증가 혹은 감소하는 부분들을 다른 쓰레드가 건드리지 말라고
하는 겁니까? "

이건 대충 맞는 말입니다.

 

좀 더 정확히 말하자면, InterlockedIncrement()의 경우, 한 쓰레드가 변수를 증가시키는 동안에 다른 쓰레드가 끼어 들지 않게 해서, 진짜 원하는 대로 1만 증가하도록 하는 것이죠.

 

사실 별 필요없어 보이지만, 종종 필요한 때가 있습니다. 예를 들면, 공통으로 쓰는 object의 reference count를 변화시키고 그 값에 따라 object를 release하거나 새로 생성할 때 이지요.

 



http://blog.naver.com/websearch/70027261346
http://blog.naver.com/ck2347/50026036147

Posted by 붕대마음

댓글을 달아 주세요


출처 : http://blog.naver.com/lifeisforu/80022419898 

 
현재 필자의 그래픽카드의 스펙은 다음과 같다.

칩종류 : Geforce 6200
DAC 종류 : Integrated RAMDAC
메모리 크기 : 256 MB
어댑터 문자열 : Geforace 6200
BIOS 정보 : Version 5.44.A2.10.00

이제 IDirect3DDevice::GetAvailableTextureMem 메서드를 호출하면 그 결과는 다음과 같다.

509607936

Direct3D API 도움말에는 IDirect3DDevice::GetAvailableTextureMem 에 대해서 다음과 같이 기술하고 있다.

인용:
반환값은 가장 가까운 MB 근처의 값이다. 이것은 비디오 메모리가 추정하는 값이 정렬하기에는 결코 정확하지 않다는 사실과 특정 리소스에 의한 소비에 영향을 미치는 다른 이슈들을 반영하기 위해서 수행된다. 응용프로그램은 이 값을 사용해 얼마나 많은 수준의 밉맵이 할당되도록 시도할 수 있는 지와 같은 큰 규모의 리소스 결정을 하기 위해서 사용할 수 있지만, 이 값을 사용해 다른 리소스를 할당하기 위한 충분한 메모리가 남았는지를 판단할 수는 없다.


그렇다면 위에서 언급한 509607936 이라는 값의 의미는 무엇인지 생각해 볼 필요가 있다. 만약 도움말에서 언급했던 것처럼 이것이 MB 값이라면

509607936 MB / 1024 = 497664 GB
497664 / 1024 = 486 TB

가 된다. 상식적으로 말이 안 된다고 생각이 들 것이다. 좀 더 현실적인 값이 되기 위해서는

509607936 Byte / 1024 = 497664 KB
497664 KB / 1024 = 486 MB

그래도 우리가 가지고 있는 그래픽 카드의 메모리 한계보다 큰 수치가 나온다. 그렇지만 나름대로 현실적인 값이 되었다. 혹시나 해서 D3DXFONT 를 생성한 다음에도 호출해 보았지만 동일한 값이 나왔다.

아무래도 이 값은 비디오 메모리와 AGP 메모리를 모두 합한 정도의 값이 아닐까라는 추정을 해 보았다. 현재 상황에서 이것을 확신할 수는 없지만 말이다.

그래서 잠시 글을 중단하고 AGP 메모리에 대한 글을 검색해 보았다. http://www.imaso.co.kr/?doc=bbs/gnuboard_pdf.php&bo_table=article&page=1&wr_id=4618&publishdate=20040501 에 가면 전체 내용을 볼 수 있다.

인용:
AGP 메모리와 비디오 메모리
먼저 중요한 AGP(Accelerated Graphics Port)와 비디오 메모리에 관해 간단히 이야기해 보겠다. 필자가 AGP 메모리를 알아내기 위해 엔비디아 ATI 관계자에게 메일을 보내고 이곳저곳에서 문서를 찾아보고 그나마 3D 카드와 AGP의 관계를 알기까지는 꽤 오랜 시간이 걸렸다. 사용자는 CMOS에서 AGP Apecture 사이즈를 직접 지정할 수가 있는데, 만약 자신의 전체 램이 512MB라면 128MB~256MB 정도로 설정하고 256MB라면 64~128MB로 설정해서 사용하길 바란다(AGP 사이즈를 크게 할수록 많은 리소스를 사용하는 3D 게임들이 원활하게 돌아간다). 이처럼 AGP 메모리라고 해서 따로 있는 것이 아니라 그냥 일반 램인데 특별히 영역을 지정해주는 것이다.
단지 OS가 AGP 메모리를 특별하게 처리하는데 속도를 위해서 특별히 잘 관여하지 않는다고 보면 된다. OS는 안정성이 우선이기 때문에 일반 메모리의 경우 페이징 처리부터 가상메모리 처리 및 OS 통제가 심하지만 AGP는 3D 카드가 직접 읽을 수 있도록 CPU가 빨리 쓸 수 있도록 설계되어 있다. 다음은 AGP의 특성이다.

- CPU가 읽는(Read) 속도는 매우 느리고 쓰는 것은 빠르다.
- 3D 카드에서 시스템 메모리를 읽는 것은 매우 느리고 AGP 메모리를 읽는 것이 훨씬 빠르다.
- 사실상 물리적(Physical) 메모리에 잡힌다. 물리적 메모리에 잡힌다는 것은 속도상 많은 이득이 있다.
- AGP 메모리는 OS가 관리해 주기 때문에 많은 양의 메모리를 사용하더라도 그 이상의 메모리를 수용할 수가 있다. 다만 용량의 한계에 도달했을 때 시스템 메모리와 AGP 메모리간의 전송이 일어나 화면의 끊김 현상이 생기게 된다.

이와 같은 특성으로 인해 충돌검사를 한다고 버텍스 버퍼에 락(Lock)을 걸어서 읽는다거나 하는 경우가 없어야 할 것이다(버텍스 정보를 시스템 메모리에 같이 가지고 있든가 해야 된다). 그리고 또 한 가지 비디오 메모리에 대한 중요한 정의를 내린다면 ‘비디오 메모리 = AGP 메모리 + 3D 카드 메모리(예전에 텍스처 메모리라 불린)’이다. 여기서 3D 카드 메모리는 일반적으로 3D 카드 스펙 중 128MB 또는 64MB라고 이야기하는 용량을 말한다. 비디오 메모리에는 텍스처, Z-버퍼, 셰도우 버퍼, 프레임 버퍼, 버텍스 버퍼, 스텐실 버퍼 등 모든 3D 카드가 처리하는 것들이 올라가게 된다. 결국 중요한 것은 AGP 메모리나 3D 카드의 메모리나 비디오 메모리라고 해도 3D 하드웨어에서는 같이 처리된다는 점이다. D3D8 인터페이스 중 다음과 같은 API로 현재 사용할 수 있는 비디오 메모리 양을 알아낼 수 있다.

pd3dDevice->GetAvailableTextureMem();

이와 같은 API로 응용 프로그램의 리소스를 적절하게 비디오 메모리에 올릴 수 있는 디텍트(Detect) 기능을 넣어주면 좋다.


역시 AGP 와 3D 메모리를 합친 것이 비디오 메모리의 정의였다. 그렇다면 AGP에 230 MB 가 할당되었다는 것인데, 2의 배승수로 되어 있지 않다는 점이 약간 이상하기는 하지만, 뭐 상관없다. 알아냈다는 것이 중요하니까...

즉 GetAvailableTextureMem 로는 3D 카드가 가지고 있는 메모리 양을 알 수 없다는 문제점이 있다. 하지만 중요한 것은 비디오 메모리의 총량을 대충 알 수 있다는 점이다. 적어도 이 정도 정보만 알고 있다면, 메모리를 어느 정도 할당해야지 프로그램이 원할하게 돌아갈 수 있을지 결정하는 데는 큰 도움이 될 것이라 생각한다.

ps. 혹시 AGP를 관리하고자 한다면 AgpXXX 라는 함수들이 Video.h 에 들어 있다. MSDN을 참조하면 알 수 있을 것이다. 사용법도 잘 모르겠고 쓸 이유도 없다는 생각이 들기는 하지만, 혹시 필요할까 싶어서 일단 적어 보았다.
Posted by 붕대마음

댓글을 달아 주세요


사용 가능한 텍스처 메모리의 양의 추정값을 돌려준다.

구문

UINT GetAvailableTextureMem(VOID);

반환값

이 함수는, 사용 가능한 텍스처 메모리의 추정값을 돌려준다.

주의

돌려받는 값은, 가장 가까운 MB 에 말 수 있다. 이러한 처리를 하는 것은, 특정의 리소스에 의한 비디오 메모리의 소비에 영향을 주는 alignment나 다른 문제에 의해, 비디오 메모리의 추정값을 정확하게 요구할 수가 없기 때문이다. 애플리케이션에서는, 이 값을 사용해, 이용할 수 있는 메모리의 대범한 양을 추정해, 할당하려고 하는밉맵의 레벨수와 같은 리소스에 관한 거시적인 결정을 내릴 수 있지만, 다른 리소스를 할당하는데 충분한 메모리가 남아 있는지 등 작은 스케일의 결정에 사용할 수 없다.

Posted by 붕대마음

댓글을 달아 주세요


메모리 정보 가져오기

메모리를 자주 사용하는 프로그램의 경우, out of memory를 일으키지 않도록 하기위해, 메모리를 체크해야합니다. 꼭 이럴 경우가 아니더라도, 기본적으로, 메모리의 이용은 어플리케이션의 부피가 커질수록 문제가 되겠죠. 여기서 API함수를 이용하여, 메모리의 상태를 얻어오는 방법을 알아보겠습니다.

 

 

먼저 사용될 API함수와 그 구조를 알아봅시다.

    void WINAPI GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer);

    MEMORYSTATUS는 아래와 같은 구조를 갖게 됩니다.

DWORD dwLength 32 고정
DWORD dwMemoryLoad 사용할 수 있는 메모리 비율
DWORD dwTotalPhys 물리적 메모리양
DWORD dwAvailPhys 물리적 사용가능한 메모리양
DWORD dwTotalPageFile 가상 메모리양
DWORD dwAvailPageFile 가상 사용가능한 메모리양
DWORD dwTotalVirtual 전체(물리,가상) 메모리양
DWORD dwAvailVirtual 전체(물리,가상) 사용가능한 메모리양

    그러므로, 아래와 같이 코딩을 하면, 현재 상태의 메모리를 체크할 수 있습니다.

MEMORYSTATUS memoryStatus;
GlobalMemoryStatus(&memoryStatus);

CString memoryInfo;
memoryInfo.Format("%uBYTE 전체 메모리사용가능", memoryStatus.dwAvailVirtual);

Posted by 붕대마음

댓글을 달아 주세요

이미지 파일의 가로, 세로 크기나 포맷정보에 대해 알아봐야 할 경우

    
// 로드할 이미지 크기로 윈도우 생성
    D3DXIMAGE_INFO imginfo;
    D3DXGetImageInfoFromFile( TEXFILE, &imginfo );

 


'유용한 것들_func' 카테고리의 다른 글

IDirect3DDevice9::GetAvailableTextureMem  (0) 2010.06.01
메모리 정보 가져오기  (0) 2010.06.01
이미지 정보 (dx)  (0) 2010.05.12
폴더의 파일 목록얻기  (0) 2010.01.15
마우스 커서 모양 LoadCursor  (0) 2009.12.15
MultiByteToWideChar  (0) 2009.11.12
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함