PocketMine-MP

PocketMine-h.png

1 개요

상상력에 한계를 두지 마십시오.

게임 플레이의 모든 방향을 제어합니다.
여러 개의 월드를 자유롭게.

PocketMine-MP는 소히 세르반테스(Shoghi Cervantes)[1][2]를 필두로 한, PHP로 제작된 비공식 오픈 소스[3][4] 마인크래프트:포켓에디션 서버 프로그램으로, 확장성 높은 플러그인 API를 지원하기 때문에 다양한 기능을 추가할 수 있는 것이 가장 큰 특징이다. 주로 PMMP라고 줄여 부른다.

마인크래프트 PC 버전을 좀 해 본 사람들은 PEBukkit이라고 생각하면 편하다.[5][6]

2 지원 기기

3 장점

3.1 기능 확장

위에서 말했듯이 API를 제공하고 있어 이를 통하여 기능을 확장할 수 있다. 로그인이나 경제, 미니게임 등등은 대부분 플러그인을 통해서 구현된 것이다. 너무 많이 넣으면 마인크래프트가 아니라 새로운 게임이 돼버린다. 이쯤 되면 마인크래프트는 단순한 GUI 제공자

3.2 성능 향상과 장기간 가동이 쉬움

MCPE를 통해서 여는 서버는 상대방이 할 때 서버를 연 사람도 동시에 플레이를 해야 했기 때문에 24시간 서버를 계속 돌리기도 어려웠을 뿐더러, 렌더링같은 성능을 많이 잡아먹는 기능들도 함께 돌아가고 있었으며, 모바일은 상대적으로 PC보다 성능이 떨어지기 때문에 많은 사용자들을 수용하기 힘들었다. 하지만, 포켓마인의 등장으로 PC에서도 서버를 돌릴 수 있게되어 위와같은 문제점들이 해결됐다. 단, 램 관리는 보장하지 못한다.

4 문제점

4.1 Android 지원 문제

초창기의 PocketMine-MP는 Android 또는 Ubuntu 가상 머신[9]을 이용한 스마트폰 환경에서 터미널 에뮬레이터로 PHP 바이너리를 직접 실행하는 방식이었고, 이 때는 서버가 PHP의 스크립트 언어라는 한계점에 부딪히지 않을 정도로 무겁지 않았기 때문에 그럭저럭 구동이 가능했다. 그러나, PocketMine 1.4 버전부터 기능이 대량으로 추가되어 모바일 CPU의 속도로는 버틸 수 없게 되었고, SEAndroid의 적용으로 저장소 보안 정책이 강화되면서 일부 플러그인의 데이터 저장도 제대로 되지 않는 상황이었다. 여기에 PocketMine-MP for Android(약칭, 전 DroidPMMP) 어플리케이션의 보급으로 우후죽순 저사양 24시간 서버라는 막장 조합이 탄생하게 되었다. 서버 끊긴다고 욕 먹기 싫으면 폰으로는 친구끼리만 플레이하자 친구끼리 할거면 그냥 바닐라 서버를 사용하는 편이 낫다 하지만 최근 들어 1.6 버전에서는 이 전에 비해 줄어든 것이 목격되었다.
추가로 덧붙이자면, 최근 PHP7 의 등장으로 스마트폰 가상머신으로 PHP7을 돌리는 코드를 만들 괴물 사람이 나오기 전까지는 PocketMine-MP 의 PHP7 버전을 스마트폰에서는 돌리지 못한다. PHP7버전을 핸드폰에 욱여넣고 안된다 찔찔 짜는 사람도 많다 카더라.

4.2 PHP 언어 채택

PHP는 태생적으로 스크립트 언어이기 때문에, 성능 한계가 엄연히 존재한다. 위에 서술하였듯, PMMP 1.3.12까지는 이러한 성능 한계가 드러나지 않았지만 1.4부터 상당히 많은 기능들이 추가되면서[10] 점점 무거워지기 시작했다. 최근에 PHP 7 버전이 나오면서 어느 정도 나아지기는 했다만, JAVA나 C++에 비하면... 망했어요

4.2.1 성능의 한계

이러한 성능 하락을 해결하려면 코드를 경량화하거나 런타임 바이너리를 최적화해야 한다. 전자의 경우에는 PocketMine-Soft가 시도하고 있지만, 이 쪽은 기존 PocketMine 소스를 패치하는 형태라 소스 코드가 크게 변하는 현재는 사용하기 힘들고, 그마저도 청크 로드와 같은 설정 변경 정도이기 때문에 큰 성능 향상은 기대하기 힘들다. 문제는 이 쪽도 5월 31일 이후로 업데이트가 멈췄다(...).

후자의 경우, JIT 컴파일러를 탑재한 PHP7이 1.5 버전에 적용될 예정이다. 2015년 9월 현재 최신 버전인 RC3의 경우 안정성은 개판이지만떨어지지만 50% 이상의 성능 향상이 확연히 존재하며, 유저들의 희망을 사고 있다. 또한 PHP7에서는 ?? 연산자와 같은 코드 간결화를 위한 기능이나, 반환값 타입 명시와 같은 기능이 포함되어 있어 개발자들도 기대하고 있다. 물론 바꿔 말하면 그동안 작업한 플러그인을 뜯어 고쳐야 할 수도 있다는 소리

4.2.2 PHP 자체의 기능 부실

그러나, 아무리 코드를 경량화하고 런타임을 교체한다 해도 PHP 고유의 한계가 분명히 존재한다. PHP는 애초에 코딩에 미숙한 초보자를 위한 단순한 웹 스크립트 언어였으며, 함수 이름의 비일관성, 보안 문제 등은 상당히 많은 비판을 받아왔다. 하지만 이러한 문제보다 PocketMine-MP에 가장 치명적인 문제는, 동시성 지원이 부족하다는 것이다. 현재 PHP는 공식적으로 멀티스레딩을 지원하지 않는다. 다중 세션 처리가 필요한 웹 서버들은 프로세스를 여러 개 생성하는 방식으로 PHP-FPM을 사용하고, PocketMine-MP는 krakjoe의 pthreads 확장 모듈을 사용한다. 하지만 이는 Java의 Thread 객체나, Python의 multiprocessing 모듈에 비해서 떨어지며[11], Go의 고루틴에 비해서는 한참 먼 기능이다.[12] 애초에 언어의 기본 기능이 아닌 것을 확장 모듈로 추가한 것은 감사해야 할 일이지만, 현재 PocketMine에서 스레드를 사용하는 방식은 소켓이나 맵 생성기와 같은 부분만 비동기로 처리하고, 아이템 처리와 같은 주요 기능은 메인 스레드에서 Tick을 이용한 루프 로 처리하는 방식이다. 시분할도 사용하지 않는다. 이래서는 아무리 CPU 코어가 많아도 성능 향상을 기대하기 어렵다. 차라리 1코어당 성능이나 클럭 수를 높여야 한다. [13]

사실, 이러한 문제점을 가지고 초기 개발자인 Shoghi Cervantes(소히 세르반테스)나 pthreads 모듈 개발자인 krakjoe를 비난할 수는 없다. 애초에 PocketMine-MP는 서버용으로 제작된 물건이 아니'었'기 때문이다. 원래 PocketMine-MP는 서버-클라이언트 간의 네트워크 프로토콜을 리버싱하기 위해 개발되었으며, 유저들이 실제 서버로 사용하기 시작하자 그때서야 서버로 전향하여 게임플레이 기능을 추가한 것이기 때문이다. 애초에 여객선으로 설계했는데 전쟁이 났다고 군함으로 개조한들 성능의 책임을 누구한테 물을 것인가?

4.2.3 개발 미비

메인 개발자인 Shoghi Cervantes(소히 세르반테스)가 네 달 가까이(!) 작업을 하지 않고 있다. 심지어 개발에 많은 도움을 주던 PEMapModder 마저 PMMP 포럼 자체를 탈퇴했다. 마지막 커밋 업로드는 12월 25일 기준에서 9월 27일이다. PocketMine과 거의 대등한 수준으로 개발된 MiNET의 활발한 개발에 비하면 처참하다. 현재는 Intyre 등 다른 개발자와 Pull Request 등으로 간신히 연명하고 있지만 다른 경쟁자들이 빠르게 성장하는 마당에 점유율을 잃어만 가고 있다. 당장 하이픽셀 서버는 MCPE 서버에 MiNET을 채택했다(이 쪽은 아예 처음부터 수백~수천의 플레이어를 감당하도록 대형 서버용으로 설계되었다).


심지어 공식 페이지 의 PocketMine Stable 버전이 지원하는 마인크래프트 버전은 0.10.5 Alpha 이다.
즉, 지금 시점인 2016년 08월 최신버전이 0.15.7 인점에 비하면
사용하지 못할정도로 구버전이다. 물론 최근 깃헙에 있는 PocketMine-MP 프로젝트에서는 계속 업데이트는 하나 대부분 프로토콜 업데이트'만' 한다.

4.3 관련 프로젝트

현재 나무위키에 MCPE 서버 관련 문서는 PocketMine-MP 하나뿐이지만, 다음과 같은 서버들이 개발되고 있다. (게임플레이가 제대로 되지 않을 정도로 구현이 미비한 서버는 제외) 각 문서는 추가바람.

Nukkit
Nukkit 팀에서 Java로 제작 중인 MCPE 서버이다. PocketMine-MP의 소스 코드를 거의 통째로 포팅해 기반으로 사용하며[14], 이유는 알 수 없으나 PHP보다 빠를 것으로 기대되는 JVM 위에서도 PMMP보다 훨씬 떨어지는 성능을 보여준다(...) 예를 들어, 청크 생성을 하거나 불러올 때 클라이언트 측에서 상당한 렉이 발생한다. 또한, NBT IO 문제로 플레이어 데이터가 자주 손상된다거나[15], 콘솔이 혼자서 먹통이 된다거나 하는 오류가 발생하므로 아직은 안정성면에서 떨어져 서버 열기에는 부적합하다. 성능 자체는 Java HotSpot VM의 버프로 꽤 좋은 편이다. TNT 도배나 액체 도배도 나름 버티는 편.[16]

ImagicalMine
PocketMine-MP의 비공식 서드파티 빌드이다. ImagicalCorp라는 팀에서 개발 중이며, PocketMine-MP 계열 서버들 중 그나마 개발이 활발한 프로젝트이다. 개발이 거의 중단되다시피 한 PocketMine-MP의 대체재로 주목받고 있다. 사실 구성원들 중 Noob이 적잖아서 Git revert를 4번 연속으로 한다던지 엉망진창인 상황도 가끔 보인다. 심지어 한 어드민의 권력 남용으로 리포가 다 털린 적도 있다. 그러다 2016년 4월 6일에 공식적으로 개발이 중지되었다.

MiNET
C#으로 개발되는 MCPE 서버이다. PocketMine-MP와의 연관성은 상술한 다른 프로젝트에 비해 적으며, 기업 등에서 사용할 수 있는 스케일의 서버, 즉 천단위의 클라이언트를 처리할 수 있는 서버를 목표로 개발중이다. 현재도 성능이 상당히, 아니 현존하는 MCPE 서버 중에서는 최적화가 원탑이다. 한 서버에 700명을 수용해도 TPS 딜레이가 15~20ms로 유지된다! 이 정도 부하면 초당 천만 개의 플레이어 이동 패킷을 처리하고 출력 대역폭이 500Mbps정도라고 한다. 흠좀무. 메인 개발자가 현직 프로그래머이고, 개발 동기가 무려 자기 아들이 MCPE 서버 들어가다가 렉 때문에 인내심의 바닥을 보여서라고 한다. 취미로 짬내서 하는 게 이런 퀄리티야? 개발 목표에 걸맞게 대형 서버인 하이픽셀 서버에서 MCPE 서버로 사용 중이다.

Katana
PocketMine-MP의 포크 버전이다.
MCPE판 하이픽셀이라고 불릴 만큼 초대형의 규모를 자랑하는 해외 미니게임 서버인 LifeBoat Server Network[17]의 개발자들이 자사의 대형 미니게임 서버를 위해 커스텀한 서버로, 사용되지 않는 기능들을 최대한 배제하여 성능 향상과 부하를 줄이고 유지보수 효율을 늘렸다. 또한, 대형 서버에 걸맞게 디스크 입출력 부하를 줄이거나, 서버에 남는 자리가 없거나 과부하되면 다른 서버로 이동시키는 등의 기능도 탑재되어 있다.
프로젝트 페이지 가면 알겠지만 최적화를 대가로 얻은 제약들이 적잖게 있으니 잘 읽고 판단하길 바란다. 상술한 대로 미니게임 서버에 필요하지 않은 상당 기능들을 빼버린 듯 하다.

BlockServer
또다른 Java로 구현된 MCPE 서버이다. Nukkit에 비해 상당히 오래전부터(2014년 11월에 첫 커밋이 있다) 개발이 시작되었고(MiNET과 비슷하다. MiNET은 10월에 개발 시작.) 아직도 개발이 멈추지 않았지만 인지도부터가 안습이다. 성능이나 구현 상황은 써 본 사람이 추가 바람

lav7

Go로 밑바닥부터 새로 구현[18]하는 가벼움이 주 목적인 서버이다. 아직 구현된 것은 없다시피 하고 제대로 쓸 만한 퀄리티가 되려면 한참 멀었지만, 일단 언어가 서버 프로그래밍에 강력한 Go인데다 컴파일 언어의 성능상 이점 덕분에 일단 구현만 제대로 된다면 상술한 서버보다 성능면에서 이득을 볼 수 있을 것으로 보인다. 그럼 뭐해 아무도 안 쓰는데[19] 메인 개발자의 1차 목표는 라즈베리 파이 B+ 또는 Zero[20]에서 15~20명을 수용하는 것이라고 한다. 과연 가능할까...
  1. 후에 MCPE 개발자로 스카웃되었다.
  2. 본 개발자는 스페인인이다. 스페인어에서 H는 묵음이 되고 G는 단어의 끝에 있거나 E나 I 앞에 있으면 끓는 소리(/x/)가 된다. C도 E나 I 앞에 있으면 영어의 TH(예:throw) 같은 발음이 나나 한글에서는 으로 표기된다. 영어에서는 쇼기 서밴티즈이다. (네이버 어학사전)
  3. GitHub에 소스 코드가 공개되어 있다. 라이선스LGPL.
  4. 주의할 점은 PocketMine-MP 하위 submodule인 Raklib은 GPL이다. 예외적으로, PocketMine-MP 및 관련 플러그인에서 간접적으로 사용하는 것에는 GPL이 적용되지 않는다.
  5. 소스 코드를 보면 알겠지만 Bukkit을 거의 그대로 베꼈다(!)
  6. 1.4때 코드를 갈아엎으면서 API 구조를 버킷과 비슷하게 디자인하였다.
  7. 지원기기라기 보단 DigitalOcean에 PocketMine-MP 을 설치해주는 방식이다. 쉽게 말해 호스팅에 PocketMine-MP 를 깔아 준다. 물론 유료서비스다
  8. 써본 사람들은 알겠지만 퍼포먼스가 답이 없다. 이유는 후술. 웬만하면 PC 버전을 애용하자. PM1.6 버전부터는 더 이상 지원하지 않는다고 하니 참고하길 바란다. 물론 공식적인 의견이니 어떻게 될지는 모른다. 안 돼!
  9. CHROOT를 이용한 에뮬레이션이다.
  10. 화살, 눈덩이 투척, Anvil 맵 포맷 지원 등. Anvil은 마인크래프트 PC 버전에서 사용되는 것인데, 성능에 패널티가 있다.
  11. 심지어 스레드끼리 자료 공유도 Threaded 객체를 통한 배열밖에 사용할 수 없다! Thread 로 짜본 사람들은 알겠지만 이게 상당히 암 걸린다
  12. 비동기 스레드에 인스턴스를 넣으면 에러나는 것부터가 답이 없다.
  13. 물론 여러개의 서버를 여는 곳은 멀티코어를 통해서 성능이 향상되겠지만, 그런 서버가 그리 흔한 것은 아니다.
  14. 대놓고 README에 PMMP와 구조가 비슷해 플러그인 포팅이 간단하다고 적어 놨다!
  15. 예로들어 서버들어가면 모든 아이템이 증말하는 등
  16. 물론 이는 단순한 반복 연산에 대한 성능이지 실제 게임플레이 성능은 측정하기도 애매할 뿐더러 제대로 된 자료가 없다.
  17. 하지만 하이픽셀이 MCPE에도 진출하면서 헛말이 될 뻔...했다. 아직도 명실상부한 1위 서버를 꼽으라면 거의 다 LifeBoat를 먼저 이야기한다.
  18. 사실 NBT 관련은 MCPC 서버인 Minero 프로젝트의 코드를 수혈받아 사용한다. 안습
  19. 일례로 MCPC 서버 중 Hey0는 최적화가 잘 되어있음에도 불구하고 컨텐츠의 부족으로 Bukkit에 밀려 망해버렸다.
  20. 같은 CPU를 사용한다.