Game Dev 150

내가 만들고 싶은 회사 (작성 중)

게임코디에 Alucard님이 자신이 만들고 싶은 회사라는 글을 쓰셔서 이 참에 나도 정리해보련다. 꿈을 어딘가에 적고, 누군가에 말하고, 계속 생각하면 이룰 가능성이 더 크다더라. - 게임회사 (PC, 온라인) - 공동 창업자 2~3인 - 시작은 10~20명 규모 - 공동 창업자(경영자)와 직원들의 의견에 따라 만들고 싶은 게임 - 프로토타입 제작 후 투자받는 것을 고려 - 개인적으로는 한적한 교외도 좋지만 인력 수급에 따라 다를 수 있음 - 개발실 중심부는 약간 어두운 조명을 유지하고 책상마다 스탠드로 각자 밝기를 결정 (독서실과 유사하다고 보면 되며, 조명 밝기가 중요한 것이 아니라 집중과 눈의 피로가 우선) - 개발실의 외벽쪽은 최대한 창을 만듦 - 나무는 최대한 많은 곳에 놓아두며 1주일씩 파트가..

Game Dev/Article 2011.05.24

C/C++의 Header 정리

원문 : http://www.gamedev.net/page/resources/_/reference/programming/languages/c-and-c/organizing-code-files-in-c-and-c-r1798 C와 C++에서 Header(h, hpp)와 Source(cpp, c)를 여러 파일로 분리하는 이유는 다음과 같다. - 빠른 컴파일 : 10000줄 파일 하나를 1000줄짜리 파일 10개로 분리한다면, 수정된 파일만 컴파일하여 빠르게 컴파일 가능하다. - 논리적 구조화 : 쓰임새나 구조 등에 따라 적절히 분리한다면 추후 검색이 쉽고 논리적인 구조를 쉽게 익힐 수 있다. - 코드 재사용 : 논리적 역할에 따라 적절히 분리되어 있다면 필요한 부분만 쉽게 재사용 할 수 있다. - 책임의 분리..

Game Dev/Scrap 2011.04.20

Float 상수의 컴파일-타임 최적화

도저히 메모리를 변조할 수가 없는 상황에서 해킹이 발생하였다. 예를들어 이런 코드다. float foo(float input) { if (input > 0) return input * 10.0f; else return input * -20.0f; } void main() { float f = 0; scanf("%f", &f); // 사용자는 항상 올바른 입력을 한다고 가정 float g = foo(f); printf("%f", g); } 예제이므로 코드 내용에는 큰 의미를 부여할 필요는 없음 foo 함수의 input이 매번 새로 입력되고 새로 계산되므로 리턴 값은 사용자가 입력한 값의 10배 혹은 -20배가 되어야 한다. 하지만 10이나 -20 이외의 수가 곱해져 나왔다면? 이건 무언가 잘못된 것이다. ..

Game Dev/Article 2011.03.31

Float의 메모리 내용을 Float 값으로 변환하기

OllyDbg 등 외부 디버거로 테스트 할 때 메모리가 어떤 값에서 어떤 값으로 변했는지 알기가 힘들어서 급하게 발코딩 했음... printf("Input Float's 4Bytes(=8Chars) Memory in Hex\n"); printf("ex) 0010FA42\n\n\t"); char mem[12] = {0}; scanf( "%c%c%c%c%c%c%c%c", mem+0, mem+1, mem+3, mem+4, mem+6, mem+7, mem+9, mem+10 ); char num[4] = {0}; for (int i = 0; i < 4; ++i) { num[i] = (char)strtoul(mem+(i*3), NULL, 16); } float f = 0.0f; memcpy(&f, num, size..

Game Dev/Binary 2011.03.30

#include "stdafx.h" 이전의 모든 코드는 무시

Precompiled Header가 무조건 cpp의 처음에 와야 한다는 사실은 알고 있었지만 이러한 내용이 있는지는 몰랐다. 즉 Precompiled Header를 사용하면 극단적으로 다음의 코드가 컴파일 및 실행 가능하다. (이는 VS6으로 테스트한 내용이다.) ABCDEFG // 오타 아님, 소스에 포함된 문장 #include "stdafx.h" int main(int argc, char* argv[]) { printf("Hello World!\n"); return 0; } 아무래도 Precompiled Header를 사용하는 옵션을 설정하면 #include "stdafx.h"를 소스의 시작으로 인식하는 듯 하다. The compiler skips to the specified #include dir..

Game Dev/Work Log 2011.03.16

메모리 변조를 막는 Coding

코드 영역을 변조하는 경우는 nProtect나 기타 보안 모듈을 통해서 검출이 가능한데 메모리 변조를 하는 경우는 검출하기가 힘든 것 같다. 따라서 이 포스트에 간단하게 메모리 변조 해키에 대응하는 코드 작성법을 정리해 놓는다. 1. 검증과 방어 간단하다. 예상되는 입력과 출력이 맞는지 코드를 항상 검증한다. 2. 안전한 함수, 안전한 자료형 seed 값이 노출 될 경우 rand 함수의 결과값을 100% 예측할 수 있다. 또 strcpy, strcat 등의 문자열 조작 함수는 버퍼 오버런 공격을 당할 위험이 크다. 따라서 WinCrypt.h에 포함된 CryptGenRandom 함수나 strcpy_s, strcat_s 등의 안전한 함수를 사용하고 기본 자료형을 Wrap한 자료형을 사용하도록 한다. 3. 메..

Game Dev/Article 2011.03.11

Visual Studio 6.0 Setting

2001년 대학교 입학 후 처음 쓰던 Visual Studio 6.0... 이 추억의 프로그램을 10년이 지난 2011년에 그것도 실무에서 쓰게 될 줄은 상상도 하지 못했다. 최소한 2003은 되어야 그나마 2010과 IDE 스타일이 비슷한데 6.0이라니! 내가 6.0을 쓴다니~ 델파이 프로그래머가 귀해서 많은 돈을 받는다는 얘기를 이제서야 믿게 되었다. 일단 침착하게...... VS6을 실행시켜 보았다. 음 코드 파일을 Tab으로 표시하는 기능이 없었다. 그리고 소스 컨트롤에서 체크아웃 된 파일을 보여주는 Pending-Check In 윈도우도 없고, IDE에서 쓸 수 있는 총 컬러도 16색이고, 소스 코드에 몇번째 줄인지 표시도 되지 않았다. 기뻐 돌아가시겠네. ^_^ 그런데 사람이 기뻐서 죽으라는 ..

Game Dev/Work Log 2011.03.08

최근 일하면서 느낀 점들

1. 능력 없는 프로그래머는 회사에 존재할 이유가 없다. 아무것도 할 줄 모른다고 내버려 둬서는 안된다. 이들이 하는 일은 제로가 아니다. 다른 사람들의 일을 방해하기 때문이다. 소스 잘못 짜서 체크인 하면 고쳐야지, 모른다고 달려오면 알려줘야지... 하지만 웃긴 것은 아무리 "연봉제" "성과제"라고 하지만 이런 사람들이 짤리거나 연봉이 깎이는 것은 보지 못했다. "연봉은 삭감되지 않는다. 다만 동결될 뿐.." 2. 오래 지속하고 싶은 프로젝트 일수록 TDD는 필수! 현재 일하는 프로젝트는 7-8년 전부터 시작된 프로젝트이다. 그래서 컴파일러도 구형이고 소스 컨트롤 프로그램도 CVS를 쓴다. 나름의 이유야 있었겠지만 프로그램 구조도 좋지는 않은데, 이 모든 것들이 "여력이 없다." "현재 상용화 중이라 ..

Game Dev/Article 2011.03.04

두 함수의 주소 차이 계산

회사에서 DLL Injection을 구현하다가 두 함수간 주소 차이를 계산할 일이 생겼다. 그런데 대수롭지 않게 생각하던 코드가 정확히 동작하지 않는 것이 아닌가? 처음에는 회사의 컴파일러가 구식이라 컴파일러의 오류인줄 알았는데 퇴근 후 VC2010으로 작업해도 똑같은 결과가 나왔다. [Watch Window] 1~3줄 : 제대로 된 값, 원하는 값 4~5줄 : 코드의 13, 14줄의 R-Value 6~8줄 : L-Value (이상하게 변해있다.) 왜이렇게 나오는지 모르겠다. Watch Window에서의 계산은 올바르게 되는데 이 식을 그대로 코드에 옮기면 다른 값이 나오다니... 아니면 그 반대인가? 원인은 지속적으로 찾아봐야 할 것 같다. 정답을 알아냈다. 결론은 endAddr, startAddr이 ..

Game Dev/Work Log 2011.01.26