PocketMine-MP | |
개발 | 비공식 오픈 소스 프로젝트 |
라이선스 | GPL, LGPL |
지원 운영체제 | Microsoft Windows, Linux, macOS |
언어 | PHP |
공식 | 홈페이지 포럼 GitHub Crowdin 프로젝트[1]] |
구 공식 | 홈페이지 포럼 GitHub GitHub 저장소 커밋 업데이트 알림 Twitter Crowdin 프로젝트[2]] |
[clearfix]
1. 개요
Put no limits to your imagination.
Control all aspects of gameplay.
Play on multiple worlds, for free.
한국어[3]Control all aspects of gameplay.
Play on multiple worlds, for free.
상상력에 한계를 두지 마세요.
게임 플레이의 모든 측면을 제어할 수 있습니다.
여러 개의 세계에서 무료로 플레이하세요.
공식 홈페이지게임 플레이의 모든 측면을 제어할 수 있습니다.
여러 개의 세계에서 무료로 플레이하세요.
Limitless customization, full gameplay control. 100% open source and free.
번역하면한계 없는 사용자 정의, 전체 게임 플레이 제어. 100% 오픈 소스이고 무료입니다.
PocketMine-MP는 소히 세르반테스(Shoghi Cervantes)[4][이름]를 필두로 한, PHP로 제작된 비공식 오픈 소스[6][7] 마인크래프트: 베드락 에디션 서버 프로그램으로, 확장성 높은 플러그인 API를 지원하기 때문에 다양한 기능을 추가할 수 있는 것이 가장 큰 특징이다. 주로 PMMP라고 줄여 부른다.마인크래프트 자바 에디션 버전을 좀 해 본 사람들은 BE판 Bukkit이라고 생각하면 편하다.[8]
2. 지원 기기
3. 장점
3.1. 간편한 설치
Microsoft Windows의 경우 Microsoft Visual C++ 2010 Redistributable Package[10]를 설치한 후에 PocketMine-MP 실행기 ZIP 파일을 압축만 풀어서 실행하면 서버가 실행된다. 자세한 설치법은 이 가이드를 참고하자.Linux, macOS의 경우 관련 라이브러리 설치[11] 후 PocketMine-MP 설치 스크립트만 실행하면 자동으로 설치된다. 설치 후엔 바로 실행이 가능하다.
한때는 iOS를 지원했으나 지금은 지원하지 않는다.
현재 안드로이드 운영체제에서 플레이스토어로 쉽게 다운받고 실행이 가능하다.
3.2. 기능 확장(플러그인)
위에서 말했듯이 API를 제공하고 있어 이를 통하여 기능을 확장할 수 있다. 전세계적으로 쓰이는 구동기이다보니 예시로 볼 플러그인도 상당하다. 경제, 미니게임 등등은 대부분 플러그인을 통해서 구현된 것이다. 거의 모든 PocketMine-MP들은 이미 최소한이라도 플러그인을 사용하고 있다.3.3. 성능 향상과 장기간 가동이 쉬움
MCBE를 통해서 여는 서버는 상대방이 할 때 서버를 연 사람도 동시에 플레이해야 했기 때문에 24시간 서버를 계속 돌리기도 어려웠을뿐더러, 렌더링 같은 성능을 많이 잡아먹는 기능들도 함께 돌아가고 있었으며, 모바일은 상대적으로 PC보다 성능이 떨어지기 때문에 많은 플레이어를 수용하기 힘들었다. 하지만, PocketMine-MP의 등장으로 PC에서도 서버를 돌릴 수 있게 되어 위와 같은 문제점들이 해결됐다. 그러나 서버를 계속 켜두면 과부하가 있기 마련이다. 서버 재부팅을 수시로 해주자.4. 문제점
4.1. PHP 언어 채택
PHP는 태생적으로 스크립트 언어이기 때문에, 성능 한계가 엄연히 존재한다. 위에 서술하였듯, PocketMine-MP 1.3.12까지는 이러한 성능 한계가 드러나지 않았지만 1.4부터 상당히 많은 기능이 추가되면서[12] 점점 무거워지기 시작했다. 최근에 PHP 7이 나오면서 어느 정도 나아지기는 했다.4.1.1. 성능의 한계
이러한 성능 하락을 해결하려면 코드를 경량화하거나 런타임 바이너리를 최적화해야 한다. 전자의 경우에는 PocketMine-Soft가 시도하고 있지만, 이쪽은 기존 PocketMine-MP 소스를 패치하는 형태라 소스 코드가 크게 변하는 현재는 사용하기 힘들고, 그마저도 청크 로드와 같은 설정 변경 정도이기 때문에 큰 성능 향상은 기대하기 힘들다. 문제는 이쪽도 5월 31일 이후로 업데이트가 멈췄다(...).후자의 경우, JIT 컴파일러를 탑재한 PHP 7이 1.5에 적용되며 개편되었다. 2015년 9월 현재 최신 버전인 RC3의 경우 안정성은
4.1.2. PHP 자체의 기능 부실
그러나, 아무리 코드를 경량화하고 런타임을 교체한다 해도 PHP 고유의 한계가 분명히 존재한다. PHP는 애초에 코딩에 미숙한 초보자를 위한 단순한 웹 스크립트 언어였으며, 함수 이름의 비일관성, 보안 문제 등은 상당히 많은 비판을 받아왔다. 하지만 이러한 문제보다 PocketMine-MP에 가장 치명적인 문제는, 동시성 지원이 부족하다는 것이다. 현재 PHP는 공식적으로 멀티스레딩을 지원하지 않는다. 다중 세션 처리가 필요한 웹 서버들은 프로세스를 여러 개 생성하는 방식으로 PHP-FPM을 사용하고, PocketMine-MP는 krakjoe의 pthreads 확장 모듈을 포크해[13] 사용한다. 하지만 이는 Java의 Thread 객체나, Python의 multiprocessing 모듈보다 떨어지며[14], Go의 고루틴보다는 한참 먼 기능이다.[15] 애초에 언어의 기본 기능이 아닌 것을 확장 모듈로 추가한 것은 감사해야 할 일이지만, 현재 PocketMine에서 스레드를 사용하는 방식은 소켓이나 맵 생성기와 같은 부분만 비동기로 처리하고, 아이템 처리와 같은 주요 기능은 메인 스레드에서 Tick을 이용한 루프로 처리하는 방식이다. 시분할도 사용하지 않는다. 이래서는 아무리 CPU 코어가 많아도 성능 향상을 기대하기 어렵다. 차라리 1코어당 성능이나 클럭 수를 높여야 한다. [16]사실, 이러한 문제점을 가지고 초기 개발자인 Shoghi Cervantes나 pthreads 모듈 개발자인 krakjoe를 비난할 수는 없다. 애초에 PocketMine-MP는 서버용으로 제작된 물건이 아니'었'기 때문이다. 원래 PocketMine-MP는 서버-클라이언트 간의 네트워크 프로토콜을 리버싱하기 위해 개발되었으며, 사용자들이 실제 서버로 사용하기 시작하자 그때야 서버로 전향하여 게임플레이 기능을 추가한 것이기 때문이다.
5. 여담
한때 메인 개발자인 Shoghi Cervantes가 넉 달 가까이(!) 작업을 하지 않고 있더니 PocketMine-MP를 떠나버렸다. 심지어 개발에 많은 도움을 주던 PEMapModder마저 PocketMine-MP 포럼 자체를 탈퇴했다[17]그 뒤 PocketMine-MP는 결국 GitHub 저장소를 옮겨서 업데이트하고 있다.# 현재 메인으로 프로젝트를 주도하는 개발자는 dktapps[18]이고 이 사람과 함께 몇몇 개발자가 같이 제작 중이다.[19]
PocketMine-MP의 1대 메인 개발자인 Shoghi Cervantes는 상당히 기이한 행보를 보이고 있는데, PocketMine-MP 개발을 떠날 때 사람들에게 아무런 말도 하지 않고 떠났으며, Twitter 등으로 PocketMine-MP에 대해 하는 질문은 다 무시하고 있다.
2017년 10월 무렵부터는 2대 메인 개발자인 dktapps의 PocketMine-MP 관련 트윗과 기타 일부 트윗에 반응을 보였다.
그리고 마침내, 2017년 11월 18일에 Twitter에 PocketMine-MP와 관련된 트윗을 직접 올렸으며, 사람들과 이에 대해 대화를 했다. 링크
Shoghi Cervantes의 별명으로 Blame Shoghi(#BlameShoghi)가 있는데, 이는 해석하면 Shoghi를 비난해라라는 뜻이다. 이 별명은 2015년 무렵(추정)에 Lifeboat 웹사이트에 Shoghi Cervantes를 비난하는(?) 페이지가 생긴 것에서 유래되었으며[20], 현재까지도 계속 사용되고 있다. 심지어는 베드락 에디션의 시작 메시지에도 Blame shogchips!라는 메시지가 있고, Mojang 내 직원도 Twitter에 이 해시 태그를 사용해서 글을 올린다. 왜 욕을 먹는지 이유라도 알려 달라며 댓글을 단 Shoghi는 덤.
6. 그외 다른 서버 구동기
자세한 내용은 마인크래프트/멀티플레이/베드락 에디션 문서 참고하십시오.[1] 아래의 구 공식 프로젝트와 같은 페이지다[2] 위의 공식 프로젝트와 같은 페이지다. 다만 한 가지 다른 것은 이쪽은 구 도메인이라는 것[3] 아래의 한국어 번역은 PocketMine-MP 구 웹사이트에서 현재 사용되는 번역이 아니라 PocketMine-MP Crowdin에서 승인된 번역이다. 구 웹사이트는 후술할 내용으로 인해 나중에도 거의 갱신이 없을 것이다.[4] 후에 MCBE 개발자로 스카웃되었다.[이름] 본 개발자는 스페인인이다. 스페인어에서 H는 묵음이 되고 G는 단어의 끝에 있거나 E나 I 앞에 있으면 끓는 소리(/x/)가 된다. C도 E나 I 앞에 있으면 영어의 TH(예:throw) 같은 발음이 나나 한글에서는 ㅅ으로 표기된다. 영어에서는 쇼기 서밴티즈이다. (네이버 어학사전)[6] GitHub에 소스 코드가 공개되어 있다. 라이선스는 LGPL.[7] 주의할 점은 PocketMine-MP 하위 submodule인 RakLib은 GPL이다. 예외적으로, PocketMine-MP 및 관련 플러그인에서 간접적으로 사용하는 것에는 GPL이 적용되지 않는다.[8] 1.4때 코드를 갈아엎으면서 API 구조를 Bukkit과 비슷하게 디자인했다.[9] Ubuntu, CentOS 같은 운영체제 사용을 권장한다.[10] x86 다운로드
x64 다운로드[11] Perl, gcc, make 등[12] 화살, 눈덩이 투척, Anvil 세계 형식 지원 등. Anvil은 마인크래프트 자바 버전에서 사용되는 것인데, 성능에 페널티가 있다. 이로 인해 PMAnvil이라는 Anvil 기반으로 제작된 PocketMine-MP 전용 형식이나 ChunkUtils 같은 확장이 제작되었다. 참고로 4.0.0부터는 LevelDB(MCBE가 사용하는 레벨 형식) 이외의 형식은 버리고 LevelDB만을 사용하게 된다. LevelDB 이외의 형식을 사용하는 세계는 불러올 때 LevelDB 형식으로 자동으로 변환된다. LevelDB만을 사용하게 된 이유는 256 이상의 블록 ID 등을 활용하기 위해서이다.[13] krakjoe가 pthreads 확장 모듈 대신 parallel 확장 모듈을 만들어 dktapps가 직접 유지 보수중이다.[14] 심지어 스레드끼리 자료 공유도 Threaded 객체를 통한 배열밖에 사용할 수 없다!Thread로 짜본 사람들은 알겠지만 이게 상당히 암 걸린다[15] 비동기 스레드에 인스턴스를 넣으면 오류 나는 것부터가 답이 없다.[16] 물론 여러 개의 서버를 여는 곳은 멀티코어를 통해서 성능이 향상되겠지만, 그런 서버가 그리 흔한 것은 아니다.[17] 현재는 SOF3라는 이름으로 활동중이다. https://github.com/SOF3[18] 원래 iTXTech의 Genisys를 개발하던 사람이다.[19] 사실상 모든 것이 dktapps에 의해 유지되고 있다 해도 무방하다.[20] 현재는 페이지가 삭제되었다.
x64 다운로드[11] Perl, gcc, make 등[12] 화살, 눈덩이 투척, Anvil 세계 형식 지원 등. Anvil은 마인크래프트 자바 버전에서 사용되는 것인데, 성능에 페널티가 있다. 이로 인해 PMAnvil이라는 Anvil 기반으로 제작된 PocketMine-MP 전용 형식이나 ChunkUtils 같은 확장이 제작되었다. 참고로 4.0.0부터는 LevelDB(MCBE가 사용하는 레벨 형식) 이외의 형식은 버리고 LevelDB만을 사용하게 된다. LevelDB 이외의 형식을 사용하는 세계는 불러올 때 LevelDB 형식으로 자동으로 변환된다. LevelDB만을 사용하게 된 이유는 256 이상의 블록 ID 등을 활용하기 위해서이다.[13] krakjoe가 pthreads 확장 모듈 대신 parallel 확장 모듈을 만들어 dktapps가 직접 유지 보수중이다.[14] 심지어 스레드끼리 자료 공유도 Threaded 객체를 통한 배열밖에 사용할 수 없다!