러스트의 윈도우 매니징 모듈인 winit의 경우 크로스 플랫폼이란 말이 무색하게도 모바일에서 여러가지 문제가 있음


(사실 wasm으로 뽑을때도 문제가 많았는데 이건 그렇다 치고ㅇㅇㅋㅋ)


오늘은 모바일로 앱을 뽑았을때 마딱뜨린 여러가지 문제들을 해결해나간 과정을 공유해보고자 함



ac5939a70001b942813e33669735c1bcc2a977c21c773585f0dabed5e42e074dc2d2552d4ea2fd2bc1a114c2d1971e9e73bb80108051d21f887557bc36651ca053fe0d1ee9b4c7b0c12885f88bbf9b



rust로 모바일 앱을 만들때는 많은 게임 엔진들처럼 export한다고 앱이 뿅 나오는 방식이 아니라,


라이브러리 파일(.a나 .so 파일 등)을 뽑아서 앱 시작지점에 연동하는 방식이 되어야 함. 여기서부터 벌써 개발 지식이 부족하면 허들 발생ㅋㅋㅋ


자 그럼 우선 안드로이드.


안드로이드는 특이하게도, 자체적으로 게임엔진들을 위한 GameActivity를 제공함


https://d.eveloper.android.com/games/agdk/game-activity?hl=ko (d.eveloper에서 .을 빼셈 이게 왜 막히냐?ㅋㅋ)


이것을 쓰거나, 아니면 native activity에 연결해야 하기 때문에, winit을 사용하는 코드가 다른 플랫폼 대비 다소 달라짐


예를 들면 이벤트 루프를 생성할 때는 with_android_app함수를 통해 명시적으로 AndroidApp 구조체를 넘겨야 함.


이외에도 로그를 안드로이드 로그캣에 띄우기 위한 설정이 필요하거나 등등...


그리고 놀랍게도 wgpu로 앱을 만들면 안드로이드 에뮬레이터에서 작동을 안함ㅋㅋㅋㅋㅋㅋㅋ


이것도 알려진 버그인데 vulkan서피스가 생성되면서 안드로이드 앱에서 사용할 egl 서피스를 차단해버려서 앱이 패닉이 생기는것ㅋㅋㅋㅋ


웃긴건 에뮬에서만 그러고 실 기기에선 잘 된다는거임;;


https://github.com/gfx-rs/wgpu/issues/2384


EGL failed to create surface when all backends enabled · Issue #2384 · gfx-rs/wgpu

Description 2022-01-12 18:58:06.954 16815-16882/rust.android E/libEGL: eglCreateWindowSurface: native_window_api_connect (win=0x7befde3010) failed (0xffffffea) (already connected to another API?) 2...

github.com


그렇다고 벌컨을 쓰면 문제가 해결되느냐 하면 그것도 아님


당장에 얼마전에 여기에 벌컨 진짜 헬이란 글도 올라왔었는데 ㅋㅋㅋㅋ


https://gall.dcinside.com/mgallery/board/view/?id=game_dev&no=187809&page=3


벌칸 진짜 헬임

안드폰 만드는 회사들은 드라이버 업뎃을 안해줌그래서 안드로이드 버전은 최신으로 업뎃 해줘도벌칸 드라이버는 여전히 1.1인게 엄청 많음1.1도 다 지원하는게 아니고 인디렉트드로잉 같은거 설정 지원 안되는게 많음익스텐션은

gall.dcinside.com


위 글처럼 기기별로 벌컨 버전이 상이해서 잘 되던게 안되고 그럼ㅋㅋㅋㅋㅋㅋㅋ


특히 가장 최신 버전인 1.4는 고사하고 1.3도 지원안하는 기기가 수두룩ㅋㅋㅋㅋㅋㅋㅋ (1.4는 나온지가 너무 얼마안되서 당연한거긴함)


그리고 모바일은 화면이 회전하잖아?


벌컨을 쓰면 그 회전에 따른 transform 계산을 별도로 해줘야함;; 데스크톱에선 경험하기 힘든(회전하는 모니터가 있긴하지만) 경험이었음


안드로이드는 뭐 이쯤하고...


이번엔 iOS.


iOS는 시뮬레이터용 라이브러리 파일(-sim.a 파일)과 실 기기용 라이브러리 파일을 별도로 구성해야 함ㅇㅇ


그래서 테스트할때랑 배포할때랑 매번 라이브러리 바꿔껴줘야함 안그럼 컴파일이 안되거덩ㅋㅋㅋ


그리고 iOS에는 winit에 치명적인 버그가 있는데, 바로 redraw 이벤트가 최초 1회 발생하고 이후에 즉각 요청해도 발생하지 않는다는거임ㅋㅋㅋㅋㅋㅋㅋ


진짜 개웃긴 버그가 아닐 수 없는데 이래놓고 크로스 플랫폼이 맞나 싶을 정도.


다행히 깃헙에 어떤 개발자가 해결 방법을 써놓긴해서 이걸 적용해서 어찌저찌 돌림


https://github.com/rust-windowing/winit/issues/4204#issuecomment-2877894957


Low FPS on iOS, framerate dips extra when many touch events are triggered · Issue #4204 · rust-windowing/winit

Description Hi! Winit is an awesome project, I've had a great experience using it so far. Platform support has been solid but iOS has been confusing. Note that my usage is currently on 0.30.9 and I...

github.com


근데 임시 땜빵용 방법이라 불안한게 사실임... 얼른 개선해주길 바라는데 언제될지...ㅋㅋ


나중에 시간나면 내가 수정해서 풀리퀘 날리던가 해야겠음ㅋㅋ 당장엔 다른걸로도 바뻐서


아무튼 이렇게 모바일 앱을 돌리는거 자체에서도 여러가지 시행착오를 겪었단 경험을 공유해봄


관련 코드들은 여기에.


https://github.com/erenengine/eren_mobile_test


GitHub - erenengine/eren_mobile_test

Contribute to erenengine/eren_mobile_test development by creating an account on GitHub.

github.com




이런거 보면 왜 bevy도 아직 상용 게임에 쓰지말고 고도쓰라고 했는지 알겠다..


님들도 유니티 언리얼 고도쓰세요..