회원 및 비회원 모두 열람이 가능합니다. 최대 업로드 가능한 용량은 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을 개발해 버릴까 하고 있습니다...ㅎㅎ

"사람은 자기가 보고 싶은 현실만 볼 뿐이다." - Gaius Julius Caesar
엮인글 :
http://www.aesop.or.kr/index.php?mid=Board_Community_Freeboard&document_srl=143749&act=trackback&key=a67

천동이

2018.07.29 17:22:00
*.21.250.185

좋은 정보 감사합니다. ^^

SDL을 사용하려면 일단 OpenGL 부터 공부해야겠군요 ㅎㅎㅎ

고도리

2018.07.29 17:51:39
*.170.154.206

Embedded에서라면 OpenGL/ES 2.0, 3.0, vulkan식으로 움직이면 될 듯 합니다.


지금 OpenGL/ES 공부중인데, 자료 정리해서 나중에 공부하는 Howto 올려놓도록 하겠습니다.


참, Go 언어에서도 GUI는 OpenGL로 가고 있습니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 교육 홍보 및 광고는 "교육 및 세미나 홍보" 게시판을 이용해 ... 관리자 2010-07-15 107989

사용자 로그인