검색결과 리스트
프로그래밍에 해당되는 글 15건
- 2012.05.12 std::string Trim
- 2012.05.09 파일변경 알림 ReadDirectoryChangesW() 함수 (1)
- 2008.11.24 HDR 쓸 때 주의할 점
- 2008.03.04 minidump
- 2008.02.23 [GDC] Networked Physics (1)
- 2007.12.19 프로그래밍(재탕) (3)
- 2007.06.27 냥날최속싱크이론 (2)
- 2007.03.20 추억의.. Y/N 을 묻는 배치 파일
- 2006.11.20 PERL 함수 호출시, call by reference 전달 (8)
- 2006.11.20 PERL 파일입출력 (5)
글
std::string Trim
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() 함수
일단 여러 가지 방법이 있다.
제일 만만한 건 ReadDirectoryChangesW() 함수인데..
근데 테스트해 보니 오히려 노티파이가 너무 많아서 곤란. 아무래도 파일을 write하는 동안/혹은 flush될 때마다 한 번씩발생하는 것 같다.
노티를 받더라도 변경된 파일의 시간이나 사이즈 등을 검사해서 확인하지 않으면 중복작업을 엄청나게 여러 번 수행하게 될 수도 있다.
또는 이런 방법으로 중복작업을 줄일 수 있다:
이 함수는 결과를 APC로 받을 수 있는데 이를 위해서 SleepEx()같은 걸 호출해 주어야 한다. 이때 APC 호출이 모여서 일어나므로, APC callback function에서는 변경된 파일의 리스트만 저장해 두고(set<string>을 써서 중복파일은 1개만 insert) SleepEx()가 반환된 후에 이 결과에서 릴로드를 처리하면 중복작업을 줄일 수 있다.
그래서.. FindFirstChangeNotification() 함수도 테스트 해 봤다. 얘는 또 다른 오묘함이 있다.
- 제일 곤란했던 상황은..
- 여러 개의 폴더를 동시에 감시하고 싶었다.
- WaitForMultipleObjects()를 썼다.
- 근데 signal을 받으면 FindNextChangeNotification(handle)을 한번 더 호출해야 함.
- 혹시라도 signal이 2개가 동시에 깨어나면 WaitForMultipleObjects()의 결과값으로는 1개밖에 알 수가 없음.
- 감시하고 싶은 폴더 개수만큼 WaitForSingleObject()를 쓰는 수 밖에 없음..
- 이건 좀..
강호의 말로는:
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 쓸 때 주의할 점
라이트맵 관련해서 GPG 찾아보다가 우연히 보게된 글인데, 글 중에 ysoya 님 말을 보면 이런 말이 나온다.
배경 건물, 캐릭터의 프레임 버퍼 값으로 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
참고링크: http://blog.empas.com/i5on9i/read.html?a=17790840
참고링크: http://www.codeproject.com/KB/applications/minidump.aspx
class CMiniDump
{
public:
static BOOL Begin(VOID);
static BOOL End(VOID);
};
2. MiniDump.cpp
#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. 사용예제
{
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 파일을 실행시킨후 디버깅 해주면 에러난곳에 멈춘다.
//////////////////////////////////////////////////////////////////////
'프로그래밍' 카테고리의 다른 글
파일변경 알림 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
[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 |
트랙백
댓글
글
프로그래밍(재탕)
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 |
트랙백
댓글
글
냥날최속싱크이론
이름하야 프로젝또 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 |
트랙백
댓글
-
지양 2007.06.27 16:59
내리막에서 오르막이라니. 100년 걸립니다. -_-
글
추억의.. Y/N 을 묻는 배치 파일
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 전달
함수를 호출할 때 @array 대신 *array 와 같이 * 을 붙여서 호출한다.
예제:
함수 처리 코드:
###
# 배열의 내용을 텍스트 파일에 저장한다. (한줄에 데이터 하나)
#
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 |
트랙백
댓글
-
조프 2006.11.21 00:34
오 local이 뭔지 이제야 알았다.
-
라슈펠 2006.11.21 17:46
그럴 이유가 있을까? return하는 것도 아닌데. 애당초 call-by-reference면 그게 가능하지도 않을 것 같은데...
그리고 perl의 local은 오히려 local *STDOUT = open(...); 하는 식으로 써서 윗 scope의 같은 이름의 variable을 덮는 것이지. (파일핸들을 저렇게 쓰는게 맞나. -_-;) 아래의 예제에서 local을 comment해보고 한 결과와 그냥 한 결과를 비교해보면 알겠지...
#!/usr/bin/perl
sub xx {
local *STDOUT;
open(STDOUT, "> testlll");
print "abracadabra\n";
close(STDOUT);
$_[0] = "abc";
}
$a = "XYZ";
print "$a\n";
xx($a);
print "$a\n";
글
PERL 파일입출력
LOAD:
{
while( $data = <ARRAYFILE> )
{
chomp $data;
if ( length $data > 0 )
{
push @refarray, $data;
}
}
close ARRAYFILE;
print "loaded from $filename...\n";
}
SAVE:
{
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 |
RECENT COMMENT