C/C++로 짜여진걸 안드로이드로 포팅하려면 우선 기본 프로그램을 so라이브러리 형태로 바꾼뒤 안드로이드의 JNI로 해당 라이브러리를 호출하는 방식으로 만들어집니다.

대신 생각해야하는게 몇 가지 있습니다.

1. 리눅스나 유닉스의 지원이 되는가
2. Xorg등 GUI툴킷에 종속되어있는가

1의 경우는 당연하게도 Windows/Dos만 되는건 애초에 ELF(*.so)형식으로 만들수가 없기 때문입니다. 이건 리눅스나 유닉스용 포팅이 우선되어야합니다.

2는 안드로이드에서는 Xorg나 Wayland가 안 돌아가기 때문입니다. GUI툴킷도 여러종류가 있지만 GTK에 종속된경우 포팅이 까다롭습니다. 그냥 새로짜는게 더 빠른편입니다. Qt의 경우 그나마 낫지만 역시 OS에서 제공하는 기능을 쓸 경우 그것도 대체할 궁리를 해야합니다.

그래서 생각해보다가 주로 CLI와 단일파일로 구성된 서버프로그램을 한번 포팅해보려고 합니다. 서버프로그램은 대부분 백그라운드 대몬형태로 돌아가며 추가입력을 받거나 하는 경우가 거의 없습니다. 한번 실행하면 계속 돌아가기 때문에 그 부분만 신경쓰면 될겁니다.

그래서 결정한게 vlmcsd라 불리는 KMS(MS의 정품인증서버)구현체를 포팅하고자 합니다.
https://github.com/kkkgo/vlmcsd

GitHub - kkkgo/vlmcsd: 🔑Portable open-source KMS Emulator in C

🔑Portable open-source KMS Emulator in C. Contribute to kkkgo/vlmcsd development by creating an account on GitHub.

github.com

순수 C로 짜여져있고 빌드후에 단일파일로 나오게 되는 구조입니다. 그리고 vlmcs라는 클라이언트를 따로 제공하고 있어서 서버의 포팅이 정상적으로 되었는지 확인이 가능합니다.

무엇보다 안드로이드 지원이 이미 고려되어있어서 좀 더 수월 할것 같은것도 한 몫했습니다.
다만 여기서 기본적인 안드로이드 지원은 Termux같은 별도의 안드로이드 내부 터미널에서 쓰는걸 전제로 되어있어서 이래저래 삽질이 필요하긴합니다.

실제로 저장소에서 제공하는 바이너리를 adb shell로 실행하면(실행권한 문제로 /data/local/tmp로 밀어넣어야 합니다.) 실행이 되는걸 볼 수있긴한데 우린 이 방법대신 일반 안드로이드 앱형태로 포팅하는걸 목적으로 하겠습니다.

방법은 아마 이렇게 되겠지요.
1. 기본 프로그램의 main함수를 찾는다.
2. main함수의 이름을 바꾸고 JNI가 지원되도록 형태를 바꾼다.(JNIEXPORT로 시작하는 함수로)
3. 프로그램의 make를 고쳐서 so형태로 나오게 바꾼다.
4. 안드로이드 스튜디오에서 so를 NDK기반 프로젝트에 밀어넣고 위에서 바꾼 main함수를 native로 만든다.
5. 몇몇 부분은 필요에 따라 C구현을 일부고친다.

자바스레드와 이것저것 구현할게 많지만 전체적인 방식은 이와 비슷할겁니다.

,

전 디자이너가 아닙니다.
그리고 심미성은 잘 모르죠.

그런데 한가지는 알고있습니다.
글꼴이란건 언어 관계없이 크게 두가지로 나옵니다.

끝부분 장식이 있느냐(세리프, 부리, 명조 기타등등-이하 세리프)
끝부분 장식이 없느냐(산세리프, 민부리, 고딕 기타등등 - 이하 산세리프)

이건 로마자도 아랍어도 그렇고 심지어 한자도 그렇습니다.

끝에 장식이 있는건 사실 예쁘라고 만든게 아니지요. 묽은 잉크 펜이나 붓으로 글씨를 쓰면 필연적으로 끝부분에 덩어리?가 생기기 마련입니다. 세리프체는 인간이 글을 쓰다보니 자연스럽게 생긴 모양입니다. 그런데 이 장식이 획의 끝을 확실하게 나타내다보니 상대적으로 작은 글씨일때 효과적이라고 합니다. (어디까지나 종이에 표시할때 이야기지만요)

동양에서는 조금 다른데 목판인쇄술이 발전하면서 목판 특유의 결대로 찣어지는 현상을 줄이기위해 끝부분 장식을 새기게 되었습니다. 목판가로줄이 가늘면 목판이 결국 결대로 쭉 부러질수있으니까요. 이를 명나라 시대에 주로 쓰였다해서 명조라고 부르는 계기가 되었습니다. 그래서 요즘 명조라고 부르는 서체는 실제랑 결이 좀 다르긴합니다.

산세리프체는 장식을 최대한 줄이고 멀리서도 잘보이게 만드는것이 특징입니다. 그래서 큰 글씨에 잘 어울린다고 합니다. 표지판이나 알림, 제목등에서 그 특징이 보입니다. 사실 글씨가 크다보니 붓이나 펜으로 쓸때 깔끔하게 마무리가 가능했던것도 있겠지요.

한국에선 판본체라고 부르는게 얼추비슷한데 글씨가 직선과 원 위주인 한글에 잘 어울리는 구조입니다.

그런데 세상이 변하고 펜도 발전했으며 붓은 상대적으로 덜 쓰이게 되었습니다. 그리고 연필도 발전해서 펜보다 더 동글동글한 필기구도 많아졌습니다. 심지어 이러한 필기도구로 효율적으로 글씨를 쓰기위한 필기체도 개발되었지요.

그래서인지 최근에는 작은글씨에도 산세리프(민부리)를 쓰거나 책의 제목같이 큰글씨에 세리프(부리)를 쓰는 경우도 크게 늘었습니다.
그리고 모바일기기가 늘어나며 상대적으로 간단명료한 산세리프의 사용량이 늘어났습니다.

그래서인지 예전보다 폰트의 종류는 많아졌는데 어쩐지 쓰이는 폰트는 비슷하다는 느낌입니다. 왠지 그냥 그렇다고요.

,

2025년 현재 Docker를 빌드하려고 하면 BuildKit을 사용하게 됩니다. 상당히 효율적이고 좋은 방식이지만 기존 방식으로 만들어진 Dockerfile 사용을 하려면 오류가 발생합니다.
 
ERROR: failed to receive status: rpc error: code = Unavailable desc = error reading from server: EOF
 
바로 위 메시지를 뿜으면서 말이지요.
 
cache를 비우거나 각종 코어를 줄이거나 네트워크 부하를 줄이거나 하지만 그냥 옛날에 만들어진 스크립트는 옛날 방식대로 쓱싹하면 됩니다.
 
export DOCKER_BUILDKIT=0
export COMPOSE_DOCKER_CLI_BUILD=0
 
우선 위 명령을 주고 이전에 하던대로
 
docker build ./
이렇게 해주시면 됩니다. 그러면 아무 문제없이 다시 잘 실행 될겁니다.
 
물론 언젠가는 사라질 방식이니 Buildkit용으로 다시 작성할 필요는 있겠지요.

,

10년전만해도 이게 뭔 뚱딴지같은 소리냐 했을텐데 2025년 지금은 AMD만큼 리눅스 지원이 잘 되는 제품이 없습니다.

과거엔 인텔이 최고였고 ClearLinux라는 인텔에서 직접 만든 배포판도 있을 정도였지만 지금 인텔의 상태가 말이아니기에 리눅스관련 직원들이 해고되었다는군요. 실제로 몇몇기능은 커널에 구현되다 말았고요.
(이러다 제온이 리눅스 서버시장에서 조차 밀리는거 아닌가 싶습니다)

AMD는 이와 반대로 리눅스 지원이 좋아지다못해 최고의 성능을 발휘하는 OS와 CPU가 되었습니다. 특히 쓰레드리퍼나 에픽을 쓸때 윈도우에 비해 리눅스의 성능이 정말 굉장하지요.

거기다 스팀덱출시 이후 라데온에서 리눅스의 Vulkan성능이 대폭 좋아져서 윈도의 라데온과 비교해 성능을 더 뽑아내고 있습니다. 심지어 Nvidia의 DLSS와 다르게 AMD는 비슷한 기능인 FSR도 네이티브로 돌리지요.

10년전만 하더라도 리눅스 데스크탑은 인텔CPU에 인텔그래픽이 진리였습니다. 성능문제는 둘째치고 안정성면에서 문제가 심했거든요. 만약 3D를 원한다면 Nvidia카드를 박아서 Nvidia의 독점드라이버를 설치해야했고요. 물론 그래도 안정성은 충분했습니다. 커널버전에 따른 호환성은 있었을지언정 드라이버만 설치되면 쓰는데는 지장이 없었으니까요.

그런데 AI의 대두이후 Nvidia의 드라이버는 CUDA를 위시한 컴퓨트성능위주로 흘러가게 되었고 Vulkan과 OpenGL성능이 나락으로 가기 시작했습니다. 언제부터인가 Vulkan의 지원되는 수준이 떨어지고 강점이었던 OpenGL의 안정성조차 떨어지더군요.

인텔은... 그때나 지금이나 바탕화면 표시기...였지요.

그런데 스팀덱에 AMD칩셋이 쓰이고 AMD가 Vulkan에 투자하면서 이야기가 달라지기 시작했습니다.
Doom Eternal만 해도 Vulkan버전으로 돌리면 AMD그래픽카드에서 성능이 배로 좋아진다고 하지요. DirectX나 OpenGL성능이 경쟁사에 비해 떨어지니 최신API인 Vulkan에 투자한듯합니다.
그런데 그게 스팀덱에서 꽃을 피운듯합니다.

그리고 AMD의 드라이버는 (완벽한건 아니지만)오픈소스입니다. amdgpu라는 이름으로 공개되어있습니다. 커널에 직접 반영도 되고 덕분에 Wayland지원도 빨랐습니다. 그러다보니 사용자가 늘어날 수록 안정성이 좋아지는 경향이 있는데(버그리포트가 그만큼 많아지므로 생각지못한 패닉이 줄어듭니다) 스팀덱으로 인해 AMD그래픽사용자가 늘어나자 안정성이 급격히 좋아지기 시작했습니다.

최근 제 Debian시스템을 기준으로 Nvidia 1660에서 돌아가지 않던 게임이 RX570에서 돌아가는것을 확인했습니다. 원인은 Vulkan드라이버였습니다. FSR이 켜지면서 프레임이 좋아진건 덤입니다.

10년전엔 그렇게 라데온 욕을 퍼부었는데 지금은 칭찬하는 제 모습을 보니 그것도 참...

,

lsfg란 기술이 있습니다.

스팀에서 일명 "오리"라고 불리는 프로그램의 프레임생성 기능을 의미 합니다.

 

정식 명칭은 Lossless Scale Frame Generation 입니다만 다들 그냥 오리라고 부릅니다.

이는 원래 윈도우에서 쓰이는 FSR이나 DLSS를 편하게 쓰기위한 기술이었습니다만 LSFG라는 기술을 개발해 기존 그래픽카드의 종류와 상관없이 어디서든 사용이 가능한 프레임 생성 기술이 만들어졌습니다.

 

다만 이건 어디까지나 윈도우 전용이었고 리눅스에선 Proton에서 돌리는 뭔가 이상한 방식이었습니다.

 

그러다 https://github.com/PancakeTAS/lsfg-vk

 

GitHub - PancakeTAS/lsfg-vk: Lossless Scaling Frame Generation on Linux

Lossless Scaling Frame Generation on Linux. Contribute to PancakeTAS/lsfg-vk development by creating an account on GitHub.

github.com

lsfg-vk라 하여 Vulkan을 네이티브로 돌리는 LSFG 포팅이 이루어집니다. 주로 스팀덱 같은 UMPC에서 이루어진다고 하며 우월한 성능의 SteamOS에 힘입어 유용하게 돌아가고 있습니다.

 

이걸 일반 리눅스PC 에서도 이용이 가능합니다.

 

https://github.com/PancakeTAS/lsfg-vk/wiki/Installation-Guide

 

Installation Guide

Lossless Scaling Frame Generation on Linux. Contribute to PancakeTAS/lsfg-vk development by creating an account on GitHub.

github.com

여기에 설치 가이드가 있습니다. 미리 빌드가 된 deb을 이용할 수도 있지만 저는 그냥 빌드를 했습니다. 아무래도 아직 활발히 개발중인 물건이다보니 그냥 빌드하는게 더 낫겠다는 생각이 들더군요. 무슨 AUR쓰는 기분이지만 그냥 제 기분이 그렇습니다.

 

sudo apt update
sudo apt install git build-essential clang clang-tools llvm rustup cmake ninja-build libvulkan-dev libgtk-4-dev libadwaita-1-dev
git clone --recurse-submodules --depth 1 https://github.com/PancakeTAS/lsfg-vk.git
cd lsfg-vk
cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=On
cmake --build build
sudo cmake --install build

 

이렇게 하면 /usr/local에 설치가 됩니다.

 

이제 GUI를 설치합니다.

cd ui
rustup default stable
cargo build --release
sudo cp target/release/lsfg-vk-ui /usr/local/bin/lsfg-vk-ui

 

/usr/local/share/vulkan/implicit_layer.d/

sudo nano /usr/local/share/vulkan/implicit_layer.d/VkLayer_LS_frame_generation.json

그리고

"library_path": "liblsfg-vk.so",

이 부분을

    "library_path": "/usr/local/lib/liblsfg-vk.so",

이렇게 고칩니다.

 

 

그리고 Ctrl+O를 눌러서 저장하고 나갑니다.

 

이제 

lsfg-vk-ui

명령을 통해서 UI를 불러와 봅시다.

 

 

이렇게 하면 설치가 완료 된 것입니다.

Steam에서 Lossless Scaling을 구매후 설치까지 하시면 이제 세팅이 완료 됩니다.

 

 

이제 제일 핵심인 Lossless Scaling을 설치합니다.

 

vkcube를 통해 프레임이 얼마나 늘어났는지 확인해봅시다.

(사실 vkcube만으로는 딱히 얼마나 늘어났는지는 감이 안 옵니다. 직접 게임을 하나 실행하는게 제일 편합니다.)

 

vkcube를 실행해서 돌아가는 속도를 확인 한 다음

 

DISABLE_LSFG=1 vkcube

를 했을 때 4배정도 더 빠르면 적용이 완료 된겁니다.

 

만약 차이가 없다면 적용이 안 된겁니다.

Path to Lossless.dll을 고쳐주시면 됩니다. 스팀 기본 설치시

~/.steam/steam/steamapps/common/Lossless Scaling/Lossless.dll

여기입니다. 실제로는 조금 다를 수 있으니 직접 스팀에서 확인 후에 지정하시면 됩니다.

 

 

lsfg-vk-ui를 실행해서 창을 띄워놓고 게임을 같이 실행합니다.

 

여기서 Create New Profile을 클릭하면

새로운 프로파일이 생성 됩니다. 오른쪽 profile name의 돋보기를 클릭하면

 

현재 실행되고 있는 프로그램 리스트가 쫙 뜹니다. 여기서 게임의 프로세스를 클릭합니다.

 

여기서 원하는 만큼 설정해주시면 됩니다.

 

이런식으로 게임별로 LSFG를 설정해서 사용하시면 됩니다.

 

 

 

삭제 방법은 

sudo rm  /usr/local/share/vulkan/implicit_layer.d/VkLayer_LS_frame_generation.json
sudo rm /usr/local/bin/lsfg-vk-ui
sudo rm /usr/local/lib/liblsfg-vk.so

그리고 재부팅입니다.

 

 

,

이제 안 됩니다...

파일을 수정하면 넥슨 안티치트가 변조를 의심하며 작동 안 되게 바뀌었습니다. 이제 한국어ED를 쓸 수가 없게 되었습니다...

 

아쉽지만 어쩔 수 없지요. 사실 이게 맞는거고 그동안 마음대로 수정이 가능했던게 이상했던 것이었습니다.

 

다만.... 용하야 이제 좀 그냥 한국어판 정식으로 적용 좀 해줘라..

 

 

=========이전에 가능했던 시절의 글 ===================

 

 

블루아카이브라는 게임이 있습니다.

분명 모바일 게임이지만 PC용 클라이언트가 존재합니다. 스팀으로 제공되기에 리눅스에서도  아주 잘 실행 됩니다. Proton9.0이상이기만 하면 잘 됩니다. 안티치트도 넥슨 자체 제작을 사용해서 스팀덱을 지원하는거 같더군요.

 

대충 이런 게임입니다만

그냥 흔한 미소녀 가챠 게임입니다.

 

하지만 특이하게도 넥슨에서 만들고 일본에서 먼저 서비스해서 뭔가 일본어로 된 환경이 자주 나옵니다.

그렇기에 한국어로 더빙까지 진행 헀음에도 일본어로 된 엔딩들이 일부 나옵니다.

 

그런데 넥슨에서는 이미 주요 엔딩이나 인게임 뮤직비디오를 한국어로 더빙해서 공개해놓았습니다. 심지어 한국어 OST까지 만들었지요. 그런데 정작 인게임에는 적용이 안 되었다는게 많이 안타깝더군요.

 

하지만 PC버전의 장점이 뭐겠습니까? 게임의 수정이 쉽다는 것입니다. 조금 뒤져보니 음원들을 ogg형태로 쉽게 교체 가능하게끔 된것을 확인 했습니다.

 

 블루 아카이브 PC 버전은 인게임 비디오도 mp4로 되어 있어서 바로 볼 수 있는 구조였습니다.

 

그래서...

직접 한국어 OST버전으로 교체해봤습니다.

 

 

 

 

처음보시는 분들은 뭐가 달라진게 있나 싶으실텐데 원래 인게임은 일본어로 된 음원이 튀어 나옵니다. 특히 아래 시즌1의 엔딩은 딴 사람도 아니고 윤하가 부른 버전이기에 게임에 적용되지 못한게 아쉽더군요. (자세히 보면 가사도 위 영상과 다르게 음원과 똑같이 나옵니다.)

 

적용 방법은..

스팀판에 한해서 가능합니다. (모바일은 별도의 루팅등의 방법 없이는 불가능)

 

스팀 라이브러리에서 블루아카이브에 오른쪽 버튼을 눌러 속성에 들어갑니다.

 

설치된 파일에서 찾아보기를 눌러서 게임이 설치된 곳의 탐색기 창을 띄웁니다.

 

 

그 다음

BlueArchive_Kor_MV_MOD.zip
13.40MB

 

위의 파일을 다운로드 받아서 해당 위치에 압축을 풀어 덮습니다.

만약 원래의 일본어로 되돌리고 싶다면 속성에서 무결성 검사를 한번 하시면 됩니다.

 

적용된 에피소드는

1. 메인스토리 최종전 Final 에피소드 ED

2. 메인스토리 무장 호시노 에피소드 ED

3. 이벤트스토리 방과후 디저트부 밴드 MV

4. 이벤트스토리 시스터즈 아이돌 MV

5. 이벤트스토리 드레스 히나 MV 및 ED

 

모든 음원의 저작권은 넥슨게임즈에 있습니다.

그러니까.... 이걸 인게임에 제대로 적용해달라고....

,

어떤 사람은 이렇게 이야기합니다.
"남 좋은일해서 뭐하냐"

어떤 사람은 또 이렇게 이야기합니다.
"돈도 안되는걸 하고 있네"

보통 이쪽은 하나도 모르는 수많은 꼰대들이 이런식으로 이야기하곤 합니다. 대부분 이렇게 이야기하는 사람들은 돈만보고 살아왔거나 자기자신만 아는 경우가 많습니다.

그런데 다들 알다시피 오픈소스는 수많은 기여자들의 취미활동으로 많은 수가 굴러갑니다. 솔직히 저 사람들 입장에선 이해가 안 될겁니다. 그런데 "성취감"이라는게 뭐라 형용할 수없는 중독성을 지니고 있습니다.

특히 내가 기여한 무언가가 다른 누군가에게 유용하게 쓰이고 있을때의 그 기분이란...

거기다가 보통 오픈소스프로젝트에는 한줄이라도 코드에 기여했거나 그냥 UI용 아이콘 하나라도 만들어주면 Thanks To에 이름이 올라갑니다.
영화 끝날때 크레딧에 내 이름이 써있다고 생각해보세요. 그리고 심지어 사람들이 작품을 칭찬한다고 상상하면 난 거기에 모래알만큼 기여했지만 어찌됐건 기분이 좋습니다.

=================================

솔직히 오픈소스에 기여하는건 어렵지 않습니다. 심지어 프로그래밍을 못 해도 충분히 기여가 가능합니다. 많은 프로그램들은 전세계에서 만들어지다보니 수많은 언어지원이 어렵습니다.

프로젝트관리자가 기여자들이 가져다주는 코드들 중 제일 쌍심지켜고 환영하는게 번역물입니다. 왜냐하면 그 사람들은 최소 영어와 자국어외에는 모르거든요. 번역기를 쓰면 당연히 번역투로 나오기 때문에 엉망이라는건 본인들도 아주 잘 알고 있습니다.

그런데 갑자기 특정언어권 사용자가 직접 번역해서 가져다주면 그렇게 좋을 수가 없겠지요. 아마 바로 다음버전에 적용해줄 가능성이 높습니다.
"사용자층 확대"
"모국어 사용자라는 신뢰"
"번역을 기여할 정도로 내 작품을 쓰는자의 물건"

이 세가지 측면에서 좋은 기여가 없습니다.

개발자들은 번역된걸 쓰는경우가 적은편입니다. 보통영문판을 선호하지요. 하지만 보통의 한국인은 다릅니다. 기왕이면 한글판을 선호합니다.

저부터도 첫 오픈소스 기여가 번역이었습니다. 20문장 남짓이었지만 다음날 바로 적용해서 업데이트까지 해주더군요. 그리고 몇년이 지난지금 그 프로그램사용자들이 제 번역을 기준으로 사용법을 공유하고 있습니다.

이건 뭐라 형용할 수 없는 기분입니다.

,

Debian 최신 버전에서는 저장소 리스트를 관리하는 방식이 새롭게 바뀝니다.

일명 DEB822라고 불립니다.

 

이게 뭐냐면

/etc/apt/sources.list 파일을 이용해서 저장소를 설정 할 수 있습니다.

보통은 

deb http://mirror.kakao.com/debian/ sid non-free contrib main non-free-firmware
deb-src http://mirror.kakao.com/debian/ sid non-free contrib main  non-free-firmware

 

요런 구조로 되어 있던 것을

 

/etc/apt/sources.list.d/debian.sources

# Modernized from /etc/apt/sources.list
Types: deb deb-src
URIs: http://mirror.kakao.com/debian/
Suites: sid
Components: non-free contrib main non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

 

요렇게 만들어서 여러줄로 쓰는 걸 말합니다. 어느정도 업데이트 하다보면 이런 방식으로 바꿀건데 진행할거냐고 물어봅니다. 저야 뭐 그냥 시키는대로 하는 편이라 그러라고 했더니 기존 sources.list파일을 백업하고 sources.list.d/debian.sources 파일을 위와같이 만들더군요. 물론 구글크롬 저장소와 MS VSCODE 저장소도 이런 식으로 바꿨습니다. 다만...

 

Notice: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://packages.microsoft.com/repos/code stable InRelease' doesn't support architecture 'i386'
Notice: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://dl.google.com/linux/chrome/deb stable InRelease' doesn't support architecture 'i386'
Notice: Skipping acquire of configured file 'main/binary-i386/Packages' as repository 'https://pkg.cloudflareclient.com bookworm InRelease' doesn't support architecture 'i386'
Notice: Missing Signed-By in the sources.list(5) entry for 'https://packages.microsoft.com/repos/code'

 

APT 업데이트를 할때마다 이런 오류가 뜹니다. 보통 이런 오류는 기존 list파일에서

deb [arch=amd64] https://dl.google.com/linux/chrome/deb/ stable main

요런식으로 arch=amd64를 적는 것으로 해결 할 수 있었는데 새롭게 바뀐 sources 파일 방식은 어떻게 해야할 지 감이 안 오더군요.

 

뒤져보니 https://repolib.readthedocs.io/en/latest/deb822-format.html

답이 여기 있더군요.

 

Architectures: amd64

이걸 제일 아래에 적는 것으로 해결 가능하다고 합니다. 이게 없으면 기본 설정(i386, amd64 같이 사용)으로 설정 되는 것이고요.

 

VScode 같은 경우에도 이런식으로 적어주니 오류가 사라졌습니다.

아무래도 이 방식이 과도기다보니 문제가 좀 심하네요...

,

OpenRCT2 지금도 이리저리 손 대보고 있습니다.
소스가 공개되어있다보니 별의별걸 다 해볼 수 있더군요.

그러다 한가지 생각난게 있는데 openrct2-cli란게 있습니다. 이건 서버구축을 위해 만든거에 가까운데 게임자처는 돌아가도록 되어 있습니다. 콘솔명령을 내리면 실제로 공원에 적용이 되고요.

그렇게 생각해본게 그럼 이걸 띄우고 별도의 프론트엔드를 띄운다면 RCT2특유의 그래픽과 완전 별개인 그래픽으로 게임이 가능한거 아닌가? 라는 생각이 들었습니다.

실제로 비슷한 프로젝트가 있었습니다.
OpenRCT2-Unity
OpenRCT2를 내부에서 라이브러리 형태로 실행하고 Unity로 만드는 프로젝트입니다. Unity이기에 3D로 구동되는데 롤러코스터 타이쿤3 느낌이 납니다. 즉, 내가 만든 공원을 3D로 돌아다니는 것이지요.

근데 이 프로젝트는 현재 멈춰있습니다. 그게 딱히 기여자도 없고 흥미본위에 맞춰져 있었으니까요.

그런데 조금만 더 생각해보면 이야기는 조금 달라집니다. Unity든 Unreal이든 유명 게임엔진에 이걸 붙이면 디아블로2 리저렉션처럼 만들수 있다는 이야기가 됩니다.

OpenRCT2는 픽셀이 튀는 문제가 있습니다. FHD를 넘어 4k모니터가 보급되다보니 생기는 문제인데 기존 2D이미지를 뜯어고쳐서 고해상도로 올리고 프론트엔드처럼 만들면 고해상도로 충분히 게임이 가능해질 수 있습니다.

비슷하게 모바일버전인 롤러코스터 타이쿤 클래식의 경우 각 기기들의 해상도가 미친듯이 올라가다보니 픽셀튐과 색상이 더러워지는 문제가 생겼는데 이걸 OpenRCT2와 프론트엔드로 해결 할 수 있을지도 모릅니다. 그리고 프론트엔드에 따라 지금은 구동이 불가능한 iOS에서의 구동도 생각해볼 수 있습니다.

직접 현재 OpenRCT2를 뜯어서 고해상도에 맞추면 되지않냐고 생각할 수도 있습니다. 실제로 몇몇 옵션이 그걸 감안하고 생성되어 있습니다만 언제 완성될지 모릅니다. 그리고 전 그 때 그 감성도 좋지만 최신감성도 나쁘지 않다고 보거든요.
마치, 슈퍼마리오 메이커의 그래픽 스타일 변경처럼요.

일단 기존 OpenRCT2의 Viewport를 다른 게임엔진으로 들고오는것부터 생각해봐야겠네요.

,

PC프로그램의 상당수가 모바일로 이식된지는 오래됐습니다.
MS오피스도 그렇고 포토샵도 핵심기능에 한해 포팅되어있지요. 한컴오피스는 특이하게도 PC버전같은 UI로 모바일버전이 있지요.

다만 모바일버전의 경우 여러요소가 고려되다보니 PC버전과는 궤를 달리하는 물건도 꽤 많습니다. 그리고 포팅할때 UI/UX가 가장 골치아픕니다.

첫째로 화면이 작다보니 버튼들이 꽤 큰편입니다. MS오피스처럼 적극적으로 도구상자들을 쓸 경우 가뜩이나 작은 화면의 상단을 잡아먹습니다. 그러다보니 PC버전과 다르게 두번세번 클릭하게 만드는 경우가 많습니다. 그래서 상황에따라 필요한 도구상자를 띄우는 방식을 쓰거나 따로 기능메뉴 버튼을 만든뒤 기능을 메뉴에서 일일이 선택하는 방식을 씁니다. 이게 UX면에서 답답하게 만드는경향이 있어서 지금도 어떻게 하는게 좋을지 고민하게 만듭니다.

둘째로 마우스 동작방식이 다릅니다. 모바일은 기본적으로 마우스가 없습니다. 터치스크린이라는 조작계 하나뿐이지요. 그래서 커서가 버튼위에 있는 Mouseover상태가 없습니다.

옛날 프로그램의 경우 이 MouseOver상태를 상정하고 만든 경우가 꽤 있습니다. 이런경우 모바일로 넘어올때 해당기능이 골때립니다. 보통 이런경우 한번 터치(혹은 클릭)시 MouseOver에 해당하는기능이 나타나고 같은 부분을 터치(혹은 클릭)시 본래기능이 동작한다거나 해야합니다.

셋째로 마우스는 버튼이 3개나 있지만 터치스크린은 화면터치 하나 뿐이라는겁니다. 즉, 기존 입력계 기준 "마우스왼쪽버튼을 누른다" 하나만 있을 뿐입니다.

다만, Windows8이후 OS차원에서 터치스크린을 지원하다보니 이쪽은 OS에서 마우스를 에뮬레이션 해주기도 하니 좀 낫습니다. 특히 길게누르면 마우스 오른쪽버튼으로 처리해주는걸 OS에서 해주지요. 그래서 모바일로 포팅된 앱들을 보면 짧게 터치하면 왼쪽버튼 클릭이고 길게터치하면 오른쪽버튼 클릭되게끔 만들곤 합니다. 애초에 Windows에서 그렇게 해주니 똑같이 구현하는겁니다. 하지만 안드로이드나 iOS는 에뮬레이션 그런거 없으니 알아서 구현해야합니다.

넷째로 역시 터치스크린때문인데 스크롤 구현을 위해 "클릭"이라는 동작의 타이밍이 다릅니다. 이게 무슨소리냐면 MouseDown과 MouseUp의 차이인데, MouseDown은 마우스 버튼이 눌릴때, MouseUp은 마우스버튼이 눌렸다 떨어질때를 말합니다.

모바일이나 터치스크린은 "길게누른다"와 "스크롤 드래그"를 적극적으로 쓰기 때문에 PC에서 쓰던 "클릭"이라는 타이밍이 무조건 MouseUp상태가 되는 순간입니다. 만약 MouseDown때 기능이 동작한다면 "길게누르기"와 "스크롤 드래그"기능을 쓸 수가 없겠지요.

최근에 나오는 대다수 UI라이브러리의 경우 "Click"과 "MouseUp", "MouswDown"을 철저히 구분합니다만 옛날프로그램은 MouseUp과 MouseDown뿐이었습니다. 그래서 버튼을 클릭시 MpuseDown에다가 구현하는 경우가 꽤 있었고 이를 모바일에 포팅할때 애먹게 만들곤 했습니다. 그래서 입력기기에 따라 알아서 판단하는 "Click"이라는 상태가 하나 더 추가 됐습니다. 그래서 최근 라이브러리를 가져다가 Click에다가 구현하면 PC와 모바일 둘 다 해결가능합니다만 이미 만들어진 프로그램을 최신 라이브러리에 맞추는게 쉬운일은 아니겠지요. 그리고 모든 UI라이브러리가 다 그렇게 만들어진것도 아니고요.  (여전히 MouseUp과 MouseDown만 있는 라이브러리도 꽤 많습니다)

아에 터치스크린의 입력상태와 마우스의 입력상태를 따로따로 구분하는 라이브러리도 있습니다만 이러면 고려할게 많아져서 코드가 길어지다보니 이쪽은 코더가 고생하게 됩니다.

다섯째로 상시 통신연결하는걸 자제해야합니다. 이건 무슨 이야기이냐면 PC는 대부분 유선으로 연결되었기에 통신을 수시로 하지만 모바일은 통신이 끊기는 경우가 잦아서 특정타이밍에 몰아서 하는경우가 많습니다. 미국같이 땅덩어리가 넓은 경우 고속도로가면 통신이 끊기는 경우가 꽤 있습니다. 이때 통신을 시도하면 할 수록 쓸데없이 배터리만 나갑니다. 그래서 이 부분을 손 봐야합니다. 역시 최근 라이브러리는 이런걸 감안하지만 문제는 옛날 프로그램이지요.

최근 OpenRCT2의 안드로이드버전을 손보면서 느낀걸 이야기해봤습니다. 이쪽은 SDL을 쓰면서 UI라이브러리 따로 쓰지 않아 지금 한창 애먹고 있는중입니다. 뭔가 하나 구현하면 다른게 터지는 등의 문제가 심해서 그냥 다 뜯어서 처음부터 입력쪽을 다시 구현할까 고민중입니다.(...)

,