항상 일과는 별개로 집에 와서는 개인 프로젝트를 하면서 여러 가지의 실험적인 일을 하곤 했다. 하지만 몇 년 전부터는 그마저도 쉽지 않았고 실제 성공한 개인 프로젝트는 거의 없다시피 하였다. 대부분이 기술적인 난제라서가 아니라 개인적인 시간이 부족하여 흐지부지 된 것이 대부분이다.
올해도 게임에서 sight of line을 어떻게 더 빠르게 처리할 수 있을까 하는 주제로 연구(?)하였고 엄청난 처리 속도의 알고리즘이 만들어진 것인 줄 알았지만 결국 초기의 아이디어에 헛점이 발견되어 ‘해결할 수 없는 경우’가 생기고 말았다. 그래서 폐기.
그 다음에는 대변 파이터 1.0 버전을 만들기 위해 renewal 작업을 했었다. 효과음 부분을 집어 넣고, 소스 공개를 목적으로 했기에 구조를 최적화 하고, 프레임을 2배 더 빠르게 만들었다. 프레임이 2배가 늘어 나게 되면서 디테일과 관련된 일부 버그가 발견되어 현재는 방치된 상태다. (언젠간 다시 할 것이라 생각한다)
그리고 작년에 한 것이 바로 지금 공개하는 것이다. 원래 libcastor라는 것은 GP2X Wiz용 native 입출력 기능을 가진 라이브러리인데, 이것을 통해서 Wiz의 고질 문제인 tearing을 근본적으로 없애자는 아이디어로 시작한 것이다. 최초에는 Wiz의 숨겨진 기능인 32-bit frame buffer mode나 double buffer의 flipping 기능을 사용하여 보았으나 실제로는 H/W로 처리되지 않는 듯 속도 저하가 좀 있었다. 하여간 tearing을 없애기 위해 Wiz를 세로 모드로 놓고 가로 모드 좌표계로 모두 바꾸어서 출력하는 시뮬레이션 레이어를 만들었는데 그것이 flat experience라 불리는 라이브러리다. (이것도 여러 플랫폼에 이식이 되어 있다)
압축을 풀면 나오는 구조는 다음과 같고, 각 파일에 대한 설명으로 마무리 지으려 한다. (개인적인 성취감 또는 의무로서 올리는 것이라 다른 사람의 편의성은 생각하지 않았다)
dejadun
|
| Makefile
|
+---avej_util
| avej_util_font12x12.cpp
| avej_util_font12x12.h
| avej_util_pascal_set.cpp
| avej_util_pascal_set.h
| avej_util_tile_map.cpp
| avej_util_tile_map.h
|
+---bin
| deja512_1.png
| deja512_2.png
| font1bit_1024_512.png
| Roperr.maf
|
+---deja_dun
| Makefile
| pdm_chara.cpp
| pdm_chara.h
| pdm_config.h
| pdm_item.h
| pdm_main.cpp
| pdm_res.cpp
| pdm_res.h
| pdm_type.h
| pdm_window.cpp
| pdm_window.h
| pdm_window_map.cpp
| pdm_window_map.h
|
\---flat_experience
|
Makefile.lib
|
+---include
|
flat_experience.h
|
pixel_format.h
|
sm_util.h
|
+---lib
\---src
|
flat_board.h
|
flat_experience_display.cpp
|
flat_experience_input.cpp
|
image_decoder_png.cpp
|
image_decoder_png.h
|
sm_util.cpp
|
+---target_bada
+---target_common
|
file_io.cpp
|
system.cpp
|
+---target_win32
\---target_wiz
castor.c
castor.h
polluxregs.h
Makefile
이 프로젝트를
빌드하기 위한 Makefile. 실제로 cygwin에서 사용하였다.
GPH에서 제공한 툴체인이 root에 설치되어 있다고 가정하고 만든 것이기에 실제 빌드할 때는 몇몇 디바이스 헤더를 못 찾는다는 메시지가 나올 수 있다. 그때는 자신의 툴체인이 설치된 위치를 CPPFLAGS 에 추가해 주면 된다.
avej_util
일종의 utility 들을 모아 놓은 디렉토리다.
avej_util/avej_util_font12x12
12x12의 한글 폰트를 출력하기 위한 것이다. bin/font1bit_1024_512.png의 폰트를 사용한다.
avej_util/avej_util_pascal_set
pascal의 내장 set과 같은 기능을 c로 구현한 것이다. 그다지 중요하지 않으니 자세한 설명은 생략한다.
avej_util/avej_util_tile_map
맵의 구조를 표현하기 위한 부분이다. DejaVu의 map 파일인 *.maf을 읽는 부분이 들어 가 있다.
bin
최종 결과물이 들어가게 되는 디렉토리. 타일 이미지, 스프라이트 이미지, 폰트 이미지, 맵 파일, 그리고 실행 파일이 들어 간다.
deja_dun/pdm_chara
DejaVu의 캐릭터를 나타내기 위한 class들을 담고 있다.
deja_dun/pdm_config.h
게임을 위한 configuration이 들어 가 있다.
deja_dun/pdm_item.h
Item을 위한 기본 구조를 담고 있다.
deja_dun/pdm_main.cpp
게임의 구조를 가지기 위한 초기화와 종료 코드를 가지고 있으며 실제 이 데모의 실행 루프를 가지고 있다.
deja_dun/pdm_res
이 데모에 사용되는 리소스를 모아 놓은 구조체를 담고 있다.
deja_dun/pdm_type.h
이 데모에 공통으로 사용하는 기본 자료형을 정의하였다.
deja_dun/pdm_window
이 데모에서 사용되는 window의 기본 구조를 정의하였다. 이 데모 자체는 따로 진행하는 다른 프로젝트에서 가져 왔으므로 필요 없는 정의가 많다. 정확하게 이야기 하면 Wiz같은 embedded device의 스크린에서 window 구조는 그다지 필요 없긴 하다.
deja_dun/pdm_window_map
게임의 형태를 띄기 위해 map을 출력하는 목적의 window를 재정의하였다. 실제 모든 출력은 이 window에서 일어나게 된다.
flat_experience
libcastor를 사용함과 동시에 WIZ의 tearing 현상을 없애기 위해 세로 모드에서 가로 모드를 시뮬레이션 해주는 플랫폼이다.
flat_experience/Makefile.lib
이 데모에는 전체가 빌드되는 형식이지만 원래는 이 Makefile을 이용해서 독리적인 라이브러리로 배포 가능하다.
flat_experience/include
flat experience 라이브러리를 사용할 때 필요한 헤더가 정의 되어 있다.
flat_experience/lib
독립적인 라이브러리로 빌드 될 때는 이 디렉토리에 *.a 가 생성된다.
flat_experience/src
flat experience 라이브러리의 소스가 담겨 있다.
flat_experience/src/flat_board.h
2D 버퍼를 표현하기 위한 기본 구조를 정의를 하고 있다.
flat_experience/src/flat_experience_display.cpp
세로 모드에 대한 2D 버퍼를, 가로 모드처럼 보이게 하기 위한 시뮬레이션이 들어 가 있다. 실제로 libcastor를 사용해서 출력을 하는 곳이다. HW Flip, 32-bit color, 다중 layer와 같이 WIZ의 숨겨진(?) 기능을 쓰는 코드가 들어 가 있긴 하나 실제로 적용 했을 때 문제점이 많아서 그냥 버퍼를 copy하는 코드로 최종 반영되어 있다.
flat_experience/src/flat_experience_input.cpp
Wiz의 입력을 일반화 시키기 위한 내용이 들어 가 있다. 역시 libcastor를 사용하고 있으며 WIZ의 touch screen 입력 관련된 것도 포함되어 있다.
flat_experience/src/image_decoder_png
libpng를 사용하여 PNG 파일을 읽는 부분이 들어 가 있다. 데모의 리소스를 읽는데 사용한다.
flat_experience/src/sm_util.cpp
Utility 함수의 집합이 되어야 하지만 지금은 PNG를 읽어 오는 여러 방법에 대한 것이 정의 되어 있다.
flat_experience/src/target_bada
삼성의 스마트폰 플랫폼인 bada용 포팅 레이어이다. 배포에는 내용이 빠져 있다.
flat_experience/src/target_common
타게팅과 관련되어 기능적으로 일반화 가능한 것이 정의된 디렉토리이다.
flat_experience/src/target_common/file_io.cpp
파일 접근에 대한 기본 기능이 정의되어 있다. bada와 같이 std로 파일에 접근이 불가능 한 경우를 위해 포팅 레이어로 빠져 있다.
flat_experience/src/target_common/system.cpp
각 플랫폼의 시스템 특성과 관련된 기능이 정의되어 있다. 지금은 클럭 관련 기능만 들어 가 있다.
flat_experience/src/target_win32
MS Windows용 포팅 레이어이다. 배포에는 내용이 빠져 있다.
flat_experience/src/target_wiz
GP2X Wiz용 포팅 레이어이다.
flat_experience/src/target_wiz/castor
libcastor의 원본이다. 라이선스에 의하면 자유롭게 수정 배포 가능하다고 한다.
flat_experience/src/target_wiz/polluxregs.h
libcastor에 포함된 내용으로, Wiz가 사용하는 pollux에 대한 레지스터가 정의되어 있다.
Posted by 안영기