2010년 3월 1일 월요일

스타크래프트2 싱글플레이 가능!

캬.. 드디어 스타크래프트2 싱클 크랙이 뚤렸다.. 역시 이 세상엔 컴퓨터로 못하는 건 없나보다.. 결국은 뚫어내다니..

 

그래도 멀티는 아직 뚫리지 않은 모양이다.. 하지만 조만간 패킷규칙만 알아내면 배틀넷 서버 만들어내서 프리서버정도는 열리지 않을까 싶은데..

 

겨우 클로즈배타테스트에 반응이 이정도라니..  나도 뚫어서 컴퓨터와 싱글플레이를 잠깐 해보았는데 너무 재밌다.. 혼자서 컴퓨터랑 노는게 이리 재밌었던가..

 

지금 게임도 거의 완성적인데 정품이 나오면 얼마나 많은 차이가있을까?

 

내 생각엔 남은 기간동안 밸런스 조정과 싱글 캠패인 정도만 다듬고 곧 출시가 될 것 같다..

 

 

정말 재밌다.. 스타2.. 확실히 스타1의 아성을 넘을 수도 있을 것 같다...

 

아래는 스타2를 설치한 후 싱글 미션 하는방법이다.

 

---------------------------------------------------------------------------------

 

스타2를 설치한후

 

http://teknogods.com/phpbb/viewforum.php?f=13

 

이 사이트에 들어가서 lazy Launcher 2.0 버전을 다운 받는다.

 

실행한 후 플레이하고싶은 맵을 선택하면 끝~ㅋㅋ

 

-----------------------------------------------------------------------------------

2010년 2월 26일 금요일

getch()와 _getch()

오늘 C로 정적 라이브러리 만들어보는 공부를 하고있는 도중에 예전 C공부했을 때 프로그램이 그냥 결과를 확인하지 못하고 그냥 꺼지는걸 방지하기 위해 마지막 줄에 추가해주었던 getch()를 한번 써보았다.

 

VC 2009에서는 Warning C4996이 뜨면서 _getch()라는 함수로 대체 실행된다는 Message가 출력되었다.

 

무슨 뜻인지 몰라서 msdn에 들어가 보았다

 

--------------------------------------------------------------------------------

getch

 

This POSIX function is deprecated beginning in Visual C++ 2005. Use the ISO C++ conformant _getch instead.

 

출처 - msdn

--------------------------------------------------------------------------------

 

이 POSIX 함수는 Visual C++ 2005 때부터 사용하지 않으므로, ISO C++ 승인 함수인 _getch를 대신 사용하시오.

 

대충 이런 내용이다.

 

이 문장을 재대로 이해하기 위해서 POSIX라는 것이 무엇인지에 대해 의문이 생겨서 찾아보았다.

 

-------------------------------------------------------------------------------

POSIX

위키백과 ― 우리 모두의 백과사전.

이식 가능 운영 체제 인터페이스(移植可能運營體制 interface, portable operating system interface), 또는 포식스 또는 포직스(POSIX /ˈpɒzɪks/ 파직스[*])는 서로 다른 UNIX OS의 공통 API를 정리하여 이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 애플리케이션 인터페이스 규격이다.

POSIX의 마지막 글자 X는 유닉스 호환 운영체제에 보통 X가 붙는 것에서 유래한다.

규격의 내용은 커널로의 C 언어 인터페이스인 시스템 콜 뿐 아니라, 프로세스 환경, 파일과 디렉터리, 시스템 데이터베이스(암호 파일 등), tar 압축 포맷 등 다양한 분야를 아우른다.

유닉스 계열 외에 마이크로소프트 윈도 NT는 POSIX 1.0에 준하는 POSIX 서브 시스템을 탑재하고 있으며, POSIX 응용 프로그램을 서브 시스템에서 실행할 수 있다. 이는 주로 미국 정부기관의 컴퓨터 시스템 도입조건(FIPS)에서 POSIX 준거할 것을 요구하기 때문이다. 윈도 2000까지 POSIX 서브시스템을 탑재하고 있었지만 윈도 XP에서 폐지되었다.

 

출처 - http://ko.wikipedia.org/wiki/POSIX

 

---------------------------------------------------------------------------------

 

결국 The POSIX Function 이라는 것은 IEEE가 책정한 애플리케이션 인터페이스 규격을 따른 함수라는 것이다. 뒤에 Win XP부터 POSIX 서브시스템을 폐지했다는 내용으로 봐서 저 시스템이 없기 때문에 getch()를 사용할 수 없는 것 같다.

 

그렇기 때문에 VC 2005 부터는 _getch()로 컴파일러가 자동 변환 해주는 것이라는게 내 판단이다.

2010년 2월 25일 목요일

Windows 라이브러리와 DLL

cURL 예제 소스를 실행해 보기 위해서 curlpp.lib를 직접 만들어야 한다는 말에 라이브러리를 만드는 방법을 공부해보았다. 정적(Static) 라이브러리만 공부하면되지만 잘 알지 못하는 분야이므로 하는김에 동적(DLL)라이브러리 방식도 공부해 보았다. 밑에는 참고한 사이트 내용이다.

 

----------------------------------------------------------------------------------

 

/*
 * http://sosal.tistory.com/
 * made by so_Sal
 */


1. 라이브러리
2. DLL
3. DLL Export, Import
4. import library

Library :: Static Library 함수, 데이터, 자료형 등 여러가지 프로그래밍 요소의 집합.
일반적으로 Library를 말하면 Statc library. 정적 라이브러리를 말한다.

printf() 함수를 쓰기 위해서 #include<stdio.h> 헤더파일을 추가해보았을 것이다.
stdio.h :: extern int printf (__const char *__restrict __format, ...);
라는 구문이 있는데, 이 함수의 원형을 보자하면 끝이 없다.
이 굉장히 긴 코드를 단지 출력해주기 위해 매번 프로그램에 추가하는 것은
효율성에서 매우 뒤쳐진다.
따라서 표준화 할 수 있는 함수들을 모아놓는데, 이것이 라이브러리이다.


" Library :: 도서관 " ::
책의 제목만 안다면 찾아내어 읽음으로써 그 내용을 쉽게 알 수 있다.
프로그래머 역시 공유 라이브러리에 만들어져 있는 함수들의 이름만 안다면
쉽게 프로그래밍 할 수 있다.


그림 - 공유 라이브러리와 사용자 코드로 이루어지는 프로그램들




위 그림에서 이해할 수 있듯 프로그래머가 User_Project.exe 라는 프로그램을
간단하고 빠르게 만들기 위해 Library.lib에 정의된 (Library.lib 라는 이름은 단순한 예)
함수를 가져와서 쓴다.

라이브러리 파일에 있는 함수와 데이터는 링커에 의해 실행파일에 그대로 옮겨지며
실행파일의 일부분이 되는데
, 이러한 라이브러리 연결 방법을 정적 링크 (Static Link)라 한다.
이 방법은 라이브러리의 코드를 컴파일시 실행파일에 모두 복사한다.

Win32 Static Library 프로젝트로 만들어진 헤더, 리소스의 함수, 자료및 변수들은
#include 전처리 명령어를 통해 모든 프로그램이 사용할 수 있다.


DLL :: Dynamic Link Library 동적인 라이브러리

정적 라이브러리는 모든 내용이 프로그램 안으로 들어가
라이브러리 소스와 프로그램 소스가 하나가 되어 하나의 객체가 되었다.

반면 동적 라이브러리는 프로그램과 하나가 되는것이 아니라,
프로그램이 필요할 때 동적 라이브러리에 있는 함수를 호출하는 방법이다.

그림 - 사용자가 만든 프로그램이 필요시 동적 라이브러리에 접근



User_project.exe 프로그램은 동적 라이브러리에 있는 함수의 정보만 포함되고
실제 함수는 복사하지 않았다. -> 프로그램의 용량이 작다.
함수가 필요하게 되면 Library.lib 를 찾아 함수를 실행하게 된다.


윈도우즈 API 함수들은 Windows.h 하나의 헤더파일에 대부분의 함수가 저장되어있다.
Win API를 통해 만들어지는 프로그램들 모두가 위 헤더파일을 포함하였을때,
필요이상으로 큰 용양을 차지하게 되어버린다.
그래서 API 함수 자체는 KERNEL32.DLL, GDI32.DLL 등 동적 라이브러리에 저장되어 제공한다.
이처럼 DLL 동적 링크 라이브러리는 윈도우에선 필수적이다.



DLL은 정적 라이브러리보다 사용하는것이 복잡하고 까다롭다.
하지만 한코드를 여러 프로그램이 동시에 사용하여 메모리가 절약되는 점.
용양이 작고, 실행파일만 읽어오면 되기 때문에 로딩 속도가 빠른점.
함수를 고치기 위해 프로그램에 접근하지 않고, DLL만 고치면 되어
성능 향상 및 수정에 대해서 자유로운점.
여러가지 언어가 쉽게 혼합될 수 있는 점 등 DLL은 윈도우에 있어서 필수적이다.

DLL이 가지고 있는 함수는 여러 프로그램이 공유가 되더라도 상관이 없다.
따라서 함수에 대한 영역은 메인 메모리에 한번만 로드하면 된다.
하지만, 프로그램이 DLL에 있는 변수에 접근한다면 이야기는 달라진다.
프로그램끼리 서로 같은변수에 접근하면 논리적으로 바람직하지 못한 결과를 가져온다.
이처럼 DLL 내부의 값을 기억하는 변수는 프로그램이 공유하도록 내버려두지 않고
각 프로그램마다 새롭게 메모리를 할당받는다.

DLL은 Usage count라는 것을 유지하여 DLL에 접근하고 있는 프로그램의 수를 세어
종료해야할 시점을 스스로 판단하여 메인 메모리에서 삭제하게 된다.

extern "C"
:: C++ 문법에서는 오버라이딩 기법을 통해 (매개변수의 다양화) 같은 이름을 가진
                     여러개의 함수를 생성할 수 있다.
                     이렇듯, C++ 문법에서 함수의 정보를 mangled name이라 하며, 이런 방식은
                     C, 파스칼 등에 혼용되지 않는다.
                     C++과 구분짓기 위해 사용하는 지명자이다.

DLL Export, Import

DLL에서 제공하는 함수에 대한 정보를 다른 프로그램들이 접근하여 실행할 수 있도록
함수정보를 공개하게 되는데, 이를 Export 이라 한다.

반면 프로그램에서 DLL에 있는 함수를 사용하기 위해 함수정보를 사용하겠다고 선언하는데,
이를 Import 라고 한다.

DLL에 존재하는 함수는 제공하는자의 Export 선언과, 받는자의 Import 선언이
서로 상응할 때 연결되게 된다.


__declspec :: 함수에 대한 정보를 제공하는 선언문
                    Export, Import 하기위한 함수 앞에 위 수식어가 필요하다.

예를 들어 BOOL swap(int* a, int* b) 이라는 함수를 동적 라이브러리로 만든다면
extern "C" __declspec(dllexport) BOOL swap(int* a,int* b);
extern "C" __declspec(dllimport) BOOL swap(int* a,int* b);

일반적인 프로그램에서 Import 선언을 하여 함수를 사용하려 한다면,
그 함수가 어떤 DLL에 있는지 알아야 한다. 하지만 import 선언에는
어떠한 DLL에 함수가 존재하는지 알려주지 않는다.
따라서 현재풀더, system 풀더, 환경변수에 등록된 풀더에 있는 모든 DLL을 열어
하나하나 확인해야하는 상황이 펼쳐진다. (물론 이런일은 없다.)

Import library
임포트 라이브러리는 DLL들을 담는 상자라고 봐도 좋다.
하나의 게임 프로젝트를 만든다면, 그에 필요한 DLL들을 만들고,
클라이언트는 DLL로부터 함수를 요청 할 것이다.
개발자 입장에서 매번 DLL을 불러오고, import 하는것은 매우 성가시다.
Import Library는 DLL들의 이름, DLL에서 정의하고있는 함수등의 정보를 포함한다.
DLL을 담는 상자라고 표현하면 좋겠다. (함수에 대한 정의만 존재할 뿐, 리소스는 DLL에 있다.)