블로그 이미지

냥날의 티스토리

Rss feed

std::string Trim

프로그래밍 2012.05.12 23:06

void trim( std::string& s )
{
s.erase(s.find_last_not_of(" \n\r\t")+1);
}



신고

'프로그래밍' 카테고리의 다른 글

std::string Trim  (0) 2012.05.12
파일변경 알림 ReadDirectoryChangesW() 함수  (1) 2012.05.09
HDR 쓸 때 주의할 점  (0) 2008.11.24
minidump  (0) 2008.03.04
[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19

파일변경 알림 ReadDirectoryChangesW() 함수

프로그래밍 2012.05.09 11:20
Excel 파일이 변경되면 자동으로 감시해서 reload하는 기능을 구현하려고 하는데 생각보다 골치아프다.
일단 여러 가지 방법이 있다.

제일 만만한 건 ReadDirectoryChangesW() 함수인데..
파일 복사가 엄청나게 많이 일어나는 상황이면 노티파이가 사라져 버릴 수 있다고 한다. (아래 링크 참조)

근데 테스트해 보니 오히려 노티파이가 너무 많아서 곤란. 아무래도 파일을 write하는 동안/혹은 flush될 때마다 한 번씩발생하는 것 같다.

노티를 받더라도 변경된 파일의 시간이나 사이즈 등을 검사해서 확인하지 않으면 중복작업을 엄청나게 여러 번 수행하게 될 수도 있다.

또는 이런 방법으로 중복작업을 줄일 수 있다:
이 함수는 결과를 APC로 받을 수 있는데 이를 위해서 SleepEx()같은 걸 호출해 주어야 한다. 이때 APC 호출이 모여서 일어나므로, APC callback function에서는 변경된 파일의 리스트만 저장해 두고(set<string>을 써서 중복파일은 1개만 insert) SleepEx()가 반환된 후에 이 결과에서 릴로드를 처리하면 중복작업을 줄일 수 있다.


그래서.. FindFirstChangeNotification() 함수도 테스트 해 봤다. 얘는 또 다른 오묘함이 있다.

  1. 제일 곤란했던 상황은..
  2. 여러 개의 폴더를 동시에 감시하고 싶었다.
  3. WaitForMultipleObjects()를 썼다.
  4. 근데 signal을 받으면 FindNextChangeNotification(handle)을 한번 더 호출해야 함.
  5. 혹시라도 signal이 2개가 동시에 깨어나면 WaitForMultipleObjects()의 결과값으로는 1개밖에 알 수가 없음.
  6. 감시하고 싶은 폴더 개수만큼 WaitForSingleObject()를 쓰는 수 밖에 없음..
  7. 이건 좀..


강호의 말로는:

WaitForMultipleObjects()는 signal 1개당 1번씩 불린다고 한다.

따라서 signal을 받으면 dwMilliseconds=0 으로 주고 WaitForMultipleObjects()를 여러 번 호출하는게 정석이라고 하네. 이렇게 하면 문제 없겠다.

덤으로 이 루프를 처리할 때는 signal 받은 핸들이 N번째이면 N+1번째 부터 wait하는 게 정석.





관련링크:
http://qualapps.blogspot.com/2010/05/understanding-readdirectorychangesw.html

신고

'프로그래밍' 카테고리의 다른 글

std::string Trim  (0) 2012.05.12
파일변경 알림 ReadDirectoryChangesW() 함수  (1) 2012.05.09
HDR 쓸 때 주의할 점  (0) 2008.11.24
minidump  (0) 2008.03.04
[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19

HDR 쓸 때 주의할 점

프로그래밍 2008.11.24 03:24
http://www.gpgstudy.com/forum/viewtopic.php?t=18058

라이트맵 관련해서 GPG 찾아보다가 우연히 보게된 글인데, 글 중에 ysoya 님 말을 보면 이런 말이 나온다.

발광체가 아닌 기물의 텍스쳐는 LDR을 써도 무방합니다. 다만, 조명값으로 0~1 이 아닌 1~ 값 을 넣어야 하고요. HDR 큐브맵 자체를 조명으로 쓰셔도 됩니다

배경 건물, 캐릭터의 프레임 버퍼 값으로 0 ~ 1 만 들어갔을 것으로 생각되는데,
조명이 약해서 정상적으로 HDR 조명이 되질 않은 것입니다.

톤매핑 오퍼레이터도 DX sdk 에 있는 것 L = Y / (Y + 1) 을 그대로 사용하면 컨트라스트가 죽어서 이쁘게 나오질 않습니다. 디자이너와 상의해서 블룸 팩터 등의 상수나 오퍼레이터들을 튜닝할 필요가 있습니다.

바로 이거다. 우리 프로젝트 HDR 라이팅의 문제가 바로 이거였다. OTL... 우리의 광원도 0~255 까지밖에 조절이 안된다. 사실은 더 넓게 쓸 수 있어야 했던거다. exposure 만으로 밝게 만드는게 아니었던거다. OTL.

이번에 사실 라이트매핑 작업하면서 (쫌 다르긴 하지만) 저것과 비슷한 효과를 내는 diffuse multiplier 라는 것을 도입했는데 밝아지는 곡선이 내가 초기에 HDR 에 바랬던거라 비슷해서 "오.. 이것봐라"라고 생각하던 참이었다.

월요일에 가면 당장 푸대한테 말해야지...
신고

'프로그래밍' 카테고리의 다른 글

std::string Trim  (0) 2012.05.12
파일변경 알림 ReadDirectoryChangesW() 함수  (1) 2012.05.09
HDR 쓸 때 주의할 점  (0) 2008.11.24
minidump  (0) 2008.03.04
[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19

minidump

프로그래밍 2008.03.04 10:08
1. MiniDump.h
#pragma once

class CMiniDump
{
public:
    static BOOL Begin(VOID);
    static BOOL End(VOID);
};

2. MiniDump.cpp
#include "stdafx.h"
#include "MiniDump.h"
#include <DbgHelp.h>


typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)( // Callback 함수의 원형
    HANDLE hProcess,
    DWORD dwPid,
    HANDLE hFile,
    MINIDUMP_TYPE DumpType,
    CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
    CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
    CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam);

LPTOP_LEVEL_EXCEPTION_FILTER PreviousExceptionFilter = NULL;

LONG WINAPI UnHandledExceptionFilter(struct _EXCEPTION_POINTERS *exceptionInfo)
{
    HMODULE    DllHandle        = NULL;

    // Windows 2000 이전에는 따로 DBGHELP를 배포해서 설정해 주어야 한다.
    DllHandle                = LoadLibrary(_T("DBGHELP.DLL"));

    if (DllHandle)
    {
        MINIDUMPWRITEDUMP Dump = (MINIDUMPWRITEDUMP) GetProcAddress(DllHandle, "MiniDumpWriteDump");

        if (Dump)
        {
            TCHAR        DumpPath[MAX_PATH] = {0,};
            SYSTEMTIME    SystemTime;

            GetLocalTime(&SystemTime);

            _sntprintf(DumpPath, MAX_PATH, _T("%d-%d-%d %d_%d_%d.dmp"),
                SystemTime.wYear,
                SystemTime.wMonth,
                SystemTime.wDay,
                SystemTime.wHour,
                SystemTime.wMinute,
                SystemTime.wSecond);
           
            HANDLE FileHandle = CreateFile(
                DumpPath,
                GENERIC_WRITE,
                FILE_SHARE_WRITE,
                NULL, CREATE_ALWAYS,
                FILE_ATTRIBUTE_NORMAL,
                NULL);

            if (FileHandle != INVALID_HANDLE_VALUE)
            {
                _MINIDUMP_EXCEPTION_INFORMATION MiniDumpExceptionInfo;
               
                MiniDumpExceptionInfo.ThreadId            = GetCurrentThreadId();
                MiniDumpExceptionInfo.ExceptionPointers    = exceptionInfo;
                MiniDumpExceptionInfo.ClientPointers    = NULL;

                BOOL Success = Dump(
                    GetCurrentProcess(),
                    GetCurrentProcessId(),
                    FileHandle,
                    MiniDumpNormal,
                    &MiniDumpExceptionInfo,
                    NULL,
                    NULL);

                if (Success)
                {
                    CloseHandle(FileHandle);

                    return EXCEPTION_EXECUTE_HANDLER;
                }
            }

            CloseHandle(FileHandle);
        }
    }

    return EXCEPTION_CONTINUE_SEARCH;
}

BOOL CMiniDump::Begin(VOID)
{
    SetErrorMode(SEM_FAILCRITICALERRORS);

    PreviousExceptionFilter = SetUnhandledExceptionFilter(UnHandledExceptionFilter);

    return true;
}

BOOL CMiniDump::End(VOID)
{
    SetUnhandledExceptionFilter(PreviousExceptionFilter);

    return true;
}

3. 사용예제
class MyObject
{
public:
    BOOL mIsOpened;
};
//////////////////////////////////////////////////////////////////////
    CMiniDump::Begin();

    MyObject* Test = new MyObject;
    Test = NULL;
    Test->mIsOpened = TRUE;    

    CMiniDump::End();
//////////////////////////////////////////////////////////////////////
// 1. 디버그모드로 생성된 exe를 실행시 dmp 파일이 생성된다.!!
// 2. 2007-11-7 23_22_39.dmp ( Crash Dump File ) 이 생성된다.
// 3. vc80.pdb ( Program Debug Database ) 가 같은 폴더내에 있어야 에러위치를 볼수 있다.
// 4. dmp 파일을 실행시킨후 디버깅 해주면 에러난곳에 멈춘다.
//////////////////////////////////////////////////////////////////////


Tag | ,
신고

'프로그래밍' 카테고리의 다른 글

파일변경 알림 ReadDirectoryChangesW() 함수  (1) 2012.05.09
HDR 쓸 때 주의할 점  (0) 2008.11.24
minidump  (0) 2008.03.04
[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19
냥날최속싱크이론  (2) 2007.06.27

[GDC] Networked Physics

프로그래밍 2008.02.23 00:07

[GDC] Networked Physics in Large Streaming World: MACHINARIES 2

제안한 방식

1. 초당 30 프레임의 고정된 시간 간격으로 물리 계산
2. 물리로 움직이는 오브젝트의 상태가 네트웍을 통해 싱크될 수 있어야 함.
 자신은 위치, 방향, 속도의 세 가지를 싱크하였음.
 (이래도 되나? 각속도나 각운동량도 있어야 하지 않나)

3. 물리 계산 방식을 고정 프레임 방식을 사용하여
 초기값을 알면 그 후의 계산은 동일하게 계산할 수 있는
 '결정적 (디터미스틱) 메카닉'으로 만든다.

권한 알고리즘

1. 대부분의 오브젝트는 물리 계산을 할 필요가 없는 정적인 상태이다.
2. 동적인 상태인 오브젝트도 잠시 시간이 지나면 정적인 상태로 수렴한다.
3. 오브젝트의 충돌이 발생하면 동적인 상태가 유발된다.
4. 이때 그 오브젝트를 움직일 권한을 유발시킨 클라이언트가 갖는다.
5. 다른 클라이언트는 그 움직임을 일방적으로 반영한다.
6. 이 과정에서 튀게 되는 일이 생길 수 있는데 이것은 어쩔 수 없다.
 !!! (<- 이게 좀 그럼)
7. 여러 플레이어가 한 오브젝트의 소유 권한을 놓고 경쟁할 수 있는데
   이때는 서버가 판정하여, 한쪽만 움직일 수 있도록 한다.

* 실제로 게임 플레이 중에 두 플레이어가 물리 때문에 얽히는 일이
 생각보다 자주 있지 않다는 점과
* 발표자가 만든 게임의 물리가 주로 파괴 시에 동작 하기 때문에
 어느 정도 튀어도 눈감아 줄 만 하다는 점
  .. 때문에 이런 식으로 처리한 것 같다.

신고

'프로그래밍' 카테고리의 다른 글

HDR 쓸 때 주의할 점  (0) 2008.11.24
minidump  (0) 2008.03.04
[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19
냥날최속싱크이론  (2) 2007.06.27
추억의.. Y/N 을 묻는 배치 파일  (0) 2007.03.20

프로그래밍(재탕)

프로그래밍 2007.12.19 02:54
1. 프로그래밍팀에 문서화를 맡는 사람이 따로 필요하다.

2. 프로그래밍 리더와 일정 관리는 다른 사람이 하는 게 좋다. 프로그래밍 리더에게 일정 관리를 맡기는 것은 자원의 낭비다. (그러나 사실 대안이 별로 없기도 함..)

3. QA 테스트에 개발자가 적극 참가해야 한다. 장점: 프로그래머가 버그를 발견한다면 더 빨리 고칠 수 있다. 그리고 게임을 하지 않는 개발자가 좋은 게임을 만들 수 있겠는가.

4. 발견된 버그는 구두나 메일로 알리는 것이 아니라 버그 트래킹해야 한다.

5. 사람이 관리하는 데이터 파일은 대부분의 경우 잘못된다. 이를 줄일 수 있는 유일한 방법은 자동 테스트이다.

6. 새로운 작업을 시작하기 전에 스펙 회의를 해야 한다.

7. 작업 마다 관리자(혹은 책임자)가 있어야 하며, 이 사람은 1명이어야 한다. 기획이 있는 작업이라면 기획자가 관리자를 하면 된다. 서버와 클라이언트가 한 명씩 붙는 작업이라면 둘 중 한명이 명확하게 지정되어야 한다. 관리자는 해당 작업에 관해서는 그 만큼의 권한과 책임을 갖는다.

관리자가 해야 하는 일을 한마디로 표현하자면: 작업을 완료시키기 위한 모든 것.

ㄱ. 리소스 체크 ㄴ. 일정 및 진행도 체크. ㄷ. 독촉 ㄹ. 테스트. ㅁ. 최초의 구현 확인

8. 버그 트랙 툴의 assign 은 단 한명에게만 한다. 사실 메일을 포함하여 대부분의 것은 단 한명에게만 assign 하는 것이 좋다.

9. 일정을 추정할 때에는 반드시 실제 작업자에게 의견을 구한다.

10. 작업이 완료되면 꼭 직접 확인을 해야 한다. 이 테스트 시에는 작업자와 함께 보는 것이 좋다.

11. 품질을 높여라. 고 품질의 많은 부분, 저 품질의 많은 부분이 프로그래머의 손에서 나온다.

http://www.whitejames.com/395 의 내용을 재탕. 이거 뭐 보고 정리한 거였지?? -_-;;
신고

'프로그래밍' 카테고리의 다른 글

minidump  (0) 2008.03.04
[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19
냥날최속싱크이론  (2) 2007.06.27
추억의.. Y/N 을 묻는 배치 파일  (0) 2007.03.20
PERL 함수 호출시, call by reference 전달  (8) 2006.11.20

냥날최속싱크이론

프로그래밍 2007.06.27 16:13
냥날최속싱크이론..
이름하야 프로젝또 S..

나에게 차기작으로 액션 게임을 만들게 했던 그 이론이, 그저께 좀 방향을 틀었다.
내리막 공략 특화에서 오르막 공략 특화로 선회한 느낌?
 
타쿠미는 이 벽을 넘을 수 있을까.
신고

'프로그래밍' 카테고리의 다른 글

[GDC] Networked Physics  (1) 2008.02.23
프로그래밍(재탕)  (3) 2007.12.19
냥날최속싱크이론  (2) 2007.06.27
추억의.. Y/N 을 묻는 배치 파일  (0) 2007.03.20
PERL 함수 호출시, call by reference 전달  (8) 2006.11.20
PERL 파일입출력  (5) 2006.11.20

추억의.. Y/N 을 묻는 배치 파일

프로그래밍 2007.03.20 17:21
@echo off
setlocal


::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:LOOP
set /p YN=(Y/N)?

if /i "%YN%" == "y" goto YES
if /i "%YN%" == "n" goto NO

goto LOOP
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


:YES
echo YES
goto QUIT

:NO
echo NO
goto QUIT




:QUIT
신고

'프로그래밍' 카테고리의 다른 글

프로그래밍(재탕)  (3) 2007.12.19
냥날최속싱크이론  (2) 2007.06.27
추억의.. Y/N 을 묻는 배치 파일  (0) 2007.03.20
PERL 함수 호출시, call by reference 전달  (8) 2006.11.20
PERL 파일입출력  (5) 2006.11.20
이중실행 방지코드  (0) 2006.11.13

PERL 함수 호출시, call by reference 전달

프로그래밍 2006.11.20 16:35

함수를 호출할 때 @array 대신 *array 와 같이 * 을 붙여서 호출한다.

예제:

SaveArray( "downlist.txt", *downlist );

함수 처리 코드:

###
# 배열의 내용을 텍스트 파일에 저장한다. (한줄에 데이터 하나)
#
sub SaveArray( external_filename, array_refernce )
{
local $filename = $_[0];
local (*refarray) = $_[1];
local $data;

신고

'프로그래밍' 카테고리의 다른 글

냥날최속싱크이론  (2) 2007.06.27
추억의.. Y/N 을 묻는 배치 파일  (0) 2007.03.20
PERL 함수 호출시, call by reference 전달  (8) 2006.11.20
PERL 파일입출력  (5) 2006.11.20
이중실행 방지코드  (0) 2006.11.13
Point Sprite  (2) 2006.09.28

PERL 파일입출력

프로그래밍 2006.11.20 16:31
맨날 문법이 기억이 나지 않기에 메모해 둔다.

LOAD:
if ( open ARRAYFILE, "$filename" )
{
 while( $data = <ARRAYFILE> )
 {
  chomp $data;
  if ( length $data > 0 )
  {
   push @refarray, $data;
  }
 }
 
 close ARRAYFILE;
 
 print "loaded from $filename...\n";
}


SAVE:
if ( open ARRAYFILE, ">$filename" )
{
 foreach $data (@refarray)
 {
  print ARRAYFILE $data . "\n";
 }
 close ARRAYFILE;
 
 print "saved to $filename...\n";
}
신고

'프로그래밍' 카테고리의 다른 글

추억의.. Y/N 을 묻는 배치 파일  (0) 2007.03.20
PERL 함수 호출시, call by reference 전달  (8) 2006.11.20
PERL 파일입출력  (5) 2006.11.20
이중실행 방지코드  (0) 2006.11.13
Point Sprite  (2) 2006.09.28
NVIDIA Photoshop Plug-in  (1) 2006.09.13
TOTAL 27,750 TODAY 17