회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 20MB 입니다.
안녕하세요.
고도리입니다.
밑에 글에 그냥 붙여쓰려다가 쓰는 일이 주말로 늦어지면서,
좀 더 써보자하고 글을 쓰다보니 양이 많아졌습니다.....괜히 썼나 싶기도...ㅠ.ㅠ
해서 좀 더 정리를 했습니다.
요즘, 몇가지 재밌는 일을 혼자 하면서 한 2달 정도 새로운 플랫폼에
SDL2를 포팅하면서 Android용으로 된 SDL2 소스를 많이 참조하였습니다.
꽤 재밌고, 유익한 일이어서 나름 뿌듯합니다.
이 일을 하면서 이래저래 소스를 아주 밑부분까지 보게 되었는데,
관련된 부분을 간단하게 정리를 해서 올려봅니다....^^
1. SDL2의 현재 버전
2.0.8 버전입니다.
제가 테스트했던 버전은
SDL2-2.0.8
SDL2_image-2.0.3
SDL2_ttf-2.0.14
셋 다 큰 문제는 없었습니다.
(제가 테스트한 환경은 좀 다르지만, 큰 문제는 없을겁니다)
대신 컴파일은 안드로이드 버전에 따라 좀 난이도가 있습니다.
2. SDL2 Android 구조
주로 src/video directory를 보시면 됩니다.
Source Tree를 발췌한 것인데, 의외로 재밌는게 많습니다.
구조는 다음과 같습니다.
간단하게 얘기하면,
1> Android App은 Android에서 실행시켜야 하니, JAVA가 필요
2> 대신 SDL2는 함수 호환성을 가져야 하니, Native에서 실행
3> 필요한 함수들은 JNI를 통해서 기존의 Android
JAVA (1) SDL.java
SDLActivity.java ------------------------->||
<--------------- ||
|| | ||
\/ | \/
-----------(2) JNI --------------------------- (5)JNI ----------------------
Native (3) core/android/SDL_android.c ^ Native services(Audio, Surface...)
|| | ||
\/ | ||
(4) SDL2관련 audio/video/event등 ---- ||
||
\/
-------------------------------------------------------------
kernel
3. SDL2에서 지원하는 Platform들
Tree구조의 밑의 Video쪽을 주로 보시면 될겁니다.
이쪽에 워낙 바뀌어서....^^
SDL1과 2의 큰 차이점은 core 디렉토리입니다.(개인적으로 포팅하면서 느낀 결과)
core를 통해서 동작하는 OS system과 연결을 하도록 되어 있습니다.
간단하게 이렇게 볼 수 있습니다.
SDL2 <--> core <--> OS
밑의 Video 쪽을 보면 재밌는 특징들이 있는데
1> OpenGL을 거의 기본 지원합니다.(OpenGL ES는 옵션 조정을 하면 됩니다)
2> Vulkan도 지원합니다.
당연이 이는 적절하게 옵션 조정 혹은 포팅시 약간 수정해야 할 수 있습니다.
3> 지원하는 플랫폼들이 꽤 많은 것을 볼 수 있을겁니다.
android
cocoa
directfb
dummy
emscripten
haiku
khronos
kmsdrm
mir
nacl
pandora
psp
qnx
raspberry
uikit
vivante
wayland
windows
winrt
x11
※ 중요한 점은 일반 Framebuffer를 지원하지 않습니다.
가속기 부분이 SDL2의 video관련에 거의 기본으로 되어 있습니다.
해서 최소한 2D 가속기 혹은 OpenGL을 지원하지 않는 platform에 대해서는
관련 코드를 작성하지 않았습니다.
SDL2관련 게시판 글 중에도 SDL1.x 대를 쓰는게 좋겠다는 얘기가 있었습니다.
.
├── Android.mk(Android makefile이 있네요...Android에서만 씁니다)
...
├── android-project
│ ├── app
│ │ ├── build.gradle
│ │ ├── jni
│ │ │ ├── Android.mk
│ │ │ ├── Application.mk
│ │ │ └── src
│ │ │ └── Android.mk
│ │ ├── proguard-rules.pro
│ │ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── org
│ │ │ └── libsdl
│ │ │ └── app
│ │ │ ├── SDL.java(시작 소스입니다)
│ │ │ ├── SDLActivity.java(실제의 main입니다)
│ │ │ ├── SDLAudioManager.java
│ │ │ └── SDLControllerManager.java
│ │ └── res
│ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ └── values
│ │ ├── colors.xml
│ │ ├── strings.xml
│ │ └── styles.xml
│ ├── build.gradle
│ ├── gradle
│ │ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ ├── gradlew
│ ├── gradlew.bat
│ └── settings.gradle
...
├── src
...
│ ├── audio
...
│ │ ├── android
│ │ │ ├── SDL_androidaudio.c
│ │ │ └── SDL_androidaudio.h
...
│ ├── core
│ │ ├── android
│ │ ├── linux
│ │ ├── unix
│ │ ├── windows
│ │ └── winrt
│ ├── cpuinfo
│ ├── dynapi
│ ├── events
│ ├── file
│ ├── filesystem
│ ├── haptic
│ ├── joystick
│ ├── libm
│ ├── loadso
│ ├── main
│ │ ├── android
│ │ ├── dummy
│ │ ├── haiku
│ │ ├── nacl
│ │ ├── psp
│ │ ├── windows
│ │ └── winrt
│ ├── power
│ ├── render
...
│ └── video
...
│ ├── SDL_egl.c
│ ├── SDL_egl_c.h
...
│ ├── SDL_vulkan_internal.h
│ ├── SDL_vulkan_utils.c
│ ├── android
│ ├── cocoa
│ ├── directfb
│ ├── dummy
│ ├── emscripten
│ ├── haiku
│ ├── khronos
│ ├── kmsdrm
│ ├── mir
│ ├── nacl
│ ├── pandora
│ ├── psp
│ ├── qnx
│ ├── raspberry
│ ├── uikit
│ ├── vivante
│ ├── wayland
│ ├── windows
│ ├── winrt
│ ├── x11
│ └── yuv2rgb
└── test
4. SDL2의 응용처
SDL2가 가속기들을 지원하게 되면서 많은 플랫폼에서 개발을 할 수 있고,
관련 소스를 소스레벨로 넘겨서 호환할 수 있습니다.
그리고, 일반적인 큰 Single application정도는 충분히 cover할 정도의 라이브러리로 보시면 됩니다.
※ 참고로 저는 Windows 10에서 작업을 해서, 해당 소스를 Android/Embedded Linux에 넘겨서 테스트했습니다.
5. Tutorial site
http://lazyfoo.net/tutorials/SDL/
가장 유명한 사이트가 되겠습니다.
정말 친절하게 잘 설명되어 있고, SDL2서부터는 windows, linux, Mac OS X에 포팅하는 순서에 대해서도
아주 잘 설명되어 있고,
각 OS에서도 컴파일러를 어떻게 쓸 것이냐에 따라서도 잘 설명되어 있습니다.
저는
Windows --> Mingw를 이용하는 순서대로 따라해 봤습니다.
6. SDL2 GUI toolkit
https://forums.libsdl.org/viewtopic.php?p=51910
이 게시물에 많은 오고가는 글들이 있습니다.
대부분 SDL1.x대를 지원하던 GUI toolkit이 지금은 문을 닫은 상태이거나, 개발이 안되고 있습니다.
(ex> Paragui)
SDL2서부터 OpenGL과 OpenGL ES를 직접 지원하기 때문에 GUI 구성에도 나름 변화가 왔고,
어떤면에서 OpenGL을 쓰시는 분들에게는 꽤 좋은 점으로 작용될 듯 합니다.
다만, 저처럼 OpenGL에 꽝인 사람들에게는 문제가 될겁니다.
^^
7. 고도리가 테스트해 봤던 SDL2용 gui toolkit
둘 다 OpenGL/OpenGL ES를 지원하는 툴킷인데, Nanogui는 pc상에서는 잘 되지만,
Android 상에서는 STL 이슈로 저는 잘 안되었었습니다.
(테스트환경이 Lollipop 5.1.1-r6 였습니다.)
1> Nanogui for SDL2
https://github.com/dalerank/nanogui-sdl
Nanogui라는 OpenGL 기반의 gui toolkit을 SDL2용으로 포팅한 겁니다.
근데 소스를 보다보면 황당한게, SDL2관련 함수는
-----------------------
SDL 초기화
CreateWindow
OpenGL 초기화 포인터(from CreateWindow) 가져오고
나머지는 전부 OpenGL함수
SDL close
-----------------------
이게 다 입니다.
소스보다가 뜨억했습니다.
SDL2 함수를 거의 쓰지 않고, 전부 OpenGL로 그려댑니다....--;;;;;;;
2> Nuklear
https://github.com/vurtun/nuklear
사이트 보시면 꽤 좋은 GUI toolkit으로 볼 수 있을겁니다.
정말 깔끔하고, 단순합니다.
그런데, 그래픽은 게임용으로 쓰기에도 좋을 정도로 화려하고 좋습니다.
저는 이 녀석을 동작시켜봤는데(Android 5.1.1에서),
만족했습니다....^^
나중에는 전부 이 gui toolkit으로 모든 app을 개발해 버릴까 하고 있습니다...ㅎㅎ
좋은 정보 감사합니다. ^^
SDL을 사용하려면 일단 OpenGL 부터 공부해야겠군요 ㅎㅎㅎ