넷드론 엔진 사용 안내서 목차 1. 제품 구성...2 2. 플랫폼 구성...3 2.1. VirtualBox 설치...3 2.2. CentOS 설치...4 3. 빌드 준비...5 3.1. 개발 도구...5 3.2. 스마트 클라이언트...6 3.3. 스터디 서버...7 3.4. 클론 서버...8 3.5. 하이퍼 서버...11 3.6. 환경 설정...12 4. 사용 방법...13 4.1. 패키지 소개...13 4.2. 게임 오브젝트...14 4.3. 오토 프레임워크...15 4.4. 로그 및 메세지...16 4.5. 유니티 엔진 분리...16 1
1. 제품 구성 구분 분류1 분류2 Engine NetDroneUnity Examples SDK Tools 비고 크로스 플렛폼 전체 소스 SmartClient Room, Chat, Web 예제 클라이언트 StudyServer.NET/C# 예제 서버 CloneServer Linux/C++ 예제 서버 HyperServer NDP/PHP 예제 서버 DataConverter CSV to Binary CSV 변환 도구 DummyClient RTCP, RUDP 테스트 도구 ReuseMemory 가상 메모리 풀 테스트 도구 CryptTester RSA RC5/RC6 테스트 도구 2
2. 플랫폼 구성 2.1. VirtualBox 설치 Oracle VirtualBox는 윈도우즈 환경에서 손쉽게 리눅스 환경을 테스트 할 수 있는 가상 환경을 제공하 는 소프트웨어 입니다. 만약 당신이 VMware, Hyper-V 사용에 익숙하다면 해당 소프트웨어를 사용하셔 도 괜찮습니다. Oracle VirtualBox 다운로드 https://www.virtualbox.org 스터디 서버 예제는 Windows, Linux, OSX 에서 모두 안정적인 성능을 보여주며, 본 문서는 Linux를 기준으로 작성 됩니다. 클론 서버 예제는 CentOS, Ubuntu, Gentoo 에서 가장 안정적인 성능을 보여줍니다. 3
2.2. CentOS 설치 리눅스 배포판중 하나인 CentOS는 업스트림 소스인 레드햇 엔터프라이즈 리눅스와 완벽히 호환되는 무료 기업용 플랫폼 입니다. 만약 당신이 Utuntu, Gentoo 사용에 익숙하다면 해당 배포판을 사용하셔 도 괜찮습니다. CentOS (The Community ENTerprise Operating System) 다운로드 https://www.centos.org 스터디 서버 예제는 Windows, Linux, OSX 에서 모두 원할히 작동하지만 본 문서에서는 CentOS 6를 기준으로만 안내 합니다. 클론 서버 예제는 CentOS, Ubuntu, Gentoo 에서 모두 원할히 작동하지만 본 문서에서는 CentOS 6를 기준으로만 안내 합니다. CentOS 설치는 되도록 서버 용으로 기본 패키지 들만 설치하세요. 최신 패키지 업데이트 root # yum -y update 필수 패키지 설치 root # yum -y install policycoreutils-python gcc gdb cmake mono mono-devel rpmbuild unzip 4
3. 빌드 준비 3.1. 개발 도구 스터디 서버 예제는 MonoDevelop으로 개발이 가능합니다. 최신 버전을 다운로 드 받아 설치 하시기 바랍니다. 다운로드 http://www.monodevelop.com 스터디 서버 예제는 Visual Studio로 개발이 가능합니다. 최신 버전을 다운로드 받 아 설치 하시기 바랍니다. 다운로드 https://imagine.microsoft.com/ko-kr/catalog/product/101 클론 서버 예제는 Eclipse CDT 환경에서 제작 되었습니다. 최신 버전을 다운로드 받아 설치 하시기 바랍니다. 다운로드 http://www.eclipse.org Windows 환경에서 각각의 IDE를 설치 한 뒤 VirtualBox/CentOS를 서버로 두고 개발 하는 것이 가능합니다. 5
3.2. 스마트 클라이언트 NetDrone Engine (Free) Scene 순서와 동일한 Enum 값을 선언하고 있어 순서가 매우 중요합니다. 빌드 후 클라이언트 여러개를 실행하여 테스트 할 수 있습니다. 6
3.3. 스터디 서버 Visual Studio 빌드 studyserver.sln 을 열어 빌드하면 실행 파일이 생성됩니다. Command Line 빌드 (xbuild) root #./make.sh root #./make.sh Debug root #./make.sh Release root #./make.sh Debug /opt/local install Command Line 실행 (windows) C:\> studyserver.exe C:\> studyserver.exe -s 100 -c studyserver-windows.txt -s : server id -c : config path Command Line 실행 (linux) root # mono --debug./studyserver.exe -s 100 -c./studyserver-linux.txt root # mono --debug./studyserver.exe -s 100 -c./studyserver-linux.txt 1> /tmp/output.txt 2>&1 -s : server id -c : config path root # cat /tmp/output.txt root # tail -f /tmp/output.txt 7
3.4. 클론 서버 NetDrone Live (Archive) CentOS 6 CentOS 7 Ubuntu 14 Ubuntu 16 Gentoo Hardened GCC 4.4.7 GCC 4.8.5 GCC 4.8.4 GCC 5.4.0 GCC 5.4.0 GLIBC 2.12 GLIBC 2.17 GLIBC 2.19 GLIBC 2.23 GLIBC 2.23 방화벽 설정 방법 CentOS 6 root # vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 11000 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 11000 -j ACCEPT root # /etc/init.d/iptables restart Ubuntu 14 root # vi /etc/ufw/ufw.conf ENABLE = yes root # vi /etc/ufw/before.rules -A ufw-before-input -m state --state NEW -m tcp -p tcp --dport 11000 -j ACCEPT -A ufw-before-input -m state --state NEW -m udp -p udp --dport 11000 -j ACCEPT root # ufw enable 8
Eclipse CDT 빌드 1. 2. 3. 4. Eclipse의 Workspace에 cloneserver 예제를 Import 해야 합니다. Project Explorer에서 마우스 오른쪽 버튼을 클릭하면 Import 항목이 나타납니다. General > Existing Projects into Workspace를 선택한뒤 Next 버튼을 클릭하세요. Select root directory 항목에서 Browse 버튼을 클릭한뒤 Workspace 아래에 있는 cloneserver 예제 폴더를 클릭합니다. 5. Projects 목록에 cloneserver 항목이 나타났으면 Finish 버튼을 클릭한뒤 완료됩니다. 6. 빌드할 경우 Debug 또는 Release 폴더 아래에 실행 파일이 생성됩니다. Command Line 빌드 (cmake) root #./make.sh Debug root #./make.sh Release root #./make.sh root #./make.sh Debug_Eclipse root #./make.sh Release_Eclipse root #./make.sh Debug root #./make.sh Debug /opt/local install root root root root # # # # cd Debug make clean make uninstall make dist Command Line 실행 root #./cloneserver-[version] -s 100 -c./cloneserver-linux.txt root #./cloneserver-[version] -s 100 -c./cloneserver-linux.txt -d 1> /tmp/output.txt 2>&1 -s : server id -c : config path -d : daemon root # cat /tmp/output.txt root # tail -f /tmp/output.txt 9
빌드 구조 분석 넷드론 엔진의 빌드 구조는 CMake를 기반으로 하고 있지만 사용법이 일정 부분 달라져 있어 해당 설 명을 반드시 참고하세요. build.h.cmake.in cmake_uninstall.cmake.in rpmbuild.spec.cmake.in 소스 코드에서 사용할 Define들이 생성됩니다. make uninstall 명령어를 사용할수 있게 설정됩니다. rpmbuild를 위한 spec 파일을 생성합니다. CMakeLists.txt CMake가 찾는 유일한 소스 코드 목록 및 빌드 방식에 대한 설정을 포함합니다. Configuration.cmake CMakeLists.txt에서 상세 설정용으로 분리(include)되어 있는 스크 립트 입니다. FindNetDroneLive.cmake NetDrone Live 버전의 아카이브 경로를 탐색하는 스크립트 입니다. FindThread.cmake getversion_netdrone.sh getversion_service.sh makedist.sh make.sh os-release GNU Posix Thread의 경로를 탐색하는 스크립트 입니다. NetDrone Live 버전의 Version.h 파일 정보를 읽어옵니다. Clone Server 예제의 Version.h 파일 정보를 읽어옵니다. make dist 명령어를 사용할수 있게 설정됩니다. (현재는 rpm만 지원) CMake 빌드를 편리하게 사용할수 있도록 작성된 스크립트 이며 아 래와 같은 옵션이 존재합니다. OS 및 라이브러리 의존성을 구성합니다. 기존 CMakeLists.txt 작성법과 달리 단 1개의 CMakeLists.txt 만 작성하게 되며 GNU Autotools와 비슷 한 결과물을 얻기위해 몇가지 Template 및 Bash script 파일이 존재합니다. 10
3.5. 하이퍼 서버 Binary protocols 개발 환경 구분 버전 Apache HTTP Server 2.2 PHP 7.0 패키지 httpd httpd-tools httpd-devel php70w-process php70w-gd php70w-mysqlnd php70w-xmlrpc php70w-imap php70w-pgsql php70w-tidy php70w-bcmath php70w-xml php70w php70w-pdo php70w-soap php70w-snmp php70w-mcrypt php70w-cli php70w-common php70w-mbstring php70w-intl php70w-ldap 11
3.6. 환경 설정 NDCF는 기본적으로 하나 또는 각각의 파일에서 여러개의 프로세스에 대한 설정 옵션을 프로세스 이름 과 서버 아이디를 통해서 구분합니다. [process_name_1:server_id_100]... [process_name_1:server_id_101]... [process_name_2:server_id_100]... [process_name_2:server_id_101]... # 마크를 사용한 주석 입력을 사용하는 것이 가능하며 Defines.h에 새로운 Key를 추가하여 CfgMgr 함 수에서 읽어오는 것이 가능합니다. DefaultInterface 외부에서 연결이 들어오는 인터페이스 이름을 입 력합니다. eth0 DefaultPort 외부에서 연결이 들어오는 사용할 Tcp Port를 입 력합니다. 11000 ReliableInterface 외부에서 연결이 들어오는 인터페이스 이름을 입 력합니다. ReliablePort 외부에서 연결이 들어오는 사용할 Udp Port를 입 력합니다. 11000 BackboneInterface 서버간 통신이 필요할 경우 전용망 인터페이스 이름을 입력합니다. eth0/eth1 BackbonePort 서버간 통신이 필요할 경우 서버 전용 Tcp Port 를 입력합니다. 11001 MaxConnection HeaderCrypt 최대 동시 접속 제한을 설정합니다. 0~65535 패킷 헤더 암호화 true/false LogPath Enums.h에 정의되어 있는 LOG_EVENT_TYPE과 LOG_FIELD_TYPE 포멧의 서비스 로그가 저장되는 위치입니다. InfoPath kill 명령어를 통한 클린 종료 또는 프로세스 상태 확인을 할수있도록 프로세스 아이디 정보를 기록 PGID, PPID, PID 하는 위치입니다. 12
4. 사용 방법 4.1. 패키지 소개 구분 분류1 분류2 비고 Fonts Binary Bytes 포멧 데이터 파일 Config Resources Material Text CSV 포멧 데이터 파일 Texture Scenes Client 예제용 씬 DB CSV, Bytes 포멧 파일별 로더 Net 프로토콜 패킷 처리 기능 State Scripts SDK 클라이언트 상태 처리 기능 UI Unit 플레이어 유닛 처리와 관리 기능 Util Config 처리 기능 World 채널/룸 처리 기능 NetDroneUnity Docs Server studyserver, cloneserver, hyperserver Tools DataConverter, DummyClient, ReuseMemory, CryptTester 다운로드 받은 후 패키지를 구성하는 폴더 구조입니다. 13
4.2. 게임 오브젝트 구분 분류1 Channels User List 분류2 비고 Room List Main Room Packet 및 List 정보 출력 Queue (Native:Count) Master Networks Connector (Main:TCP) Connector (Sub:TCP) Queue (Native:Count) Slave Connector (Main:UDP) Listener (Main:UDP) Main Player Main State (STATE) Scene 유니티 에디터로 실행할 경우 DontDestroyOnLoad 영역에 나타납니다. 예제에 포함된 기능들을 테스트 하면서 Hierarchy에 어떻게 표시되는지 살펴보세요. 14
4.3. 오토 프레임워크 AutoFramework란 C#에서 C++ 처럼 전역적 클래스/함수 작성을 지원할수 있도록 고안된 partial class 집합입니다. UnityEngine 네임스페이스에 포함되어있는 GameFramework는 using UnityEngine을 선언 할 경우 별다른 추가 선언이 필요없습니다. GameFramework를 사용하는 작성 방법은 다음과 같습니다. MonoBehaviour를 사용하는 기존 클래스 대체 방법 Defines.cs를 참고하시면 GameFramework는 AutoFramework 및 MonoBehaviour 상속이 되어있습니 다. 유니티 에티터용 스크립트 작성시 MonoBehaviour 대신 GameFramework를 상속하세요. public class Example : GameFramework {... } 이제 partial class GameFramework로 묶여있는 모든 클래스/함수들은 네임스페이스 접근없이 전역적 접근이 가능합니다. 전역적 접근 구조에 포함시키고 싶은 일반 클래스 작성 방법 넷드론 유니티 소스 코드와 클라이언트 예제는 모두 partial class GameFramework 안에 존재합니다. 새로운 클래스 및 전역함수 작성을 하시려면 아래 예제들 처럼 작성하세요. namespace UnityEngine { public partial class GameFramework { public class CExample { public CExample() {} ~CExample() {} } } } namespace UnityEngine { public partial class GameFramework { public static CExample g_kexample { get { return CExample.GetInstance(); } } public class CExample : CSingleton<CExample> { public CExample() {} ~CExample() {} public void Test() {} } } } 이제 partical class GameFramework에 포함되어 있거나 public class Example : GameFramework 처럼 상속되는 모든 곳에서 g_kexample.test()만 입력하면 네임스페이스 접근없이 호출됩니다. 15
4.4. 로그 및 메세지 넷드론 엔진의 유니티 버전은 TRACE, OUTPUT, PRINT, ERROR 함수를 정의하여 표준 출력 내용을 표시 합니다. TRACE DISABLE_UNITY 선언이 있을경우 Console.WriteLine(FILE, LINE, FUNCTION) 함수와 연 결, 선언이 없을경우 UnityEngine.Debug.Log 함수와 연결됩니다. OUTPUT DISABLE_UNITY 선언이 있을경우 Console.WriteLine(FILE, LINE, FUNCTION) 함수와 연 결, 선언이 없을경우 UnityEngine.Debug.Log 함수와 연결됩니다. PRINT DISABLE_UNITY 선언이 있을경우 Console.WriteLine 함수와 연결, 선언이 없을경우 UnityEngine.Debug.Log 함수와 연결됩니다. ERROR DISABLE_UNITY 선언이 있을경우 System.Diagnostics.Debug.WriteLine 함수와 연결, 선언이 없을경우 UnityEngine.Debug.LogError 함수와 연결됩니다. TRACE 명령어를 사용하려면 Assets 폴더 아래 gmcs.rsp/smcs.rsp (-define:debug) 파일을 생성 하세요. DEBUG 선언을 제거할 경우 TRACE 코드는 모두 사라집니다. 4.5. 유니티 엔진 분리 넷드론 유니티는 유니티 엔진 뿐만 아니라 C#으로 구현하는 모든 프로젝트에 적용하는 것이 가능합니 다. 독립적으로 사용하려면 DISABLE_UNITY 선언을 추가하세요. MonoDevelop 선언 위치 Project Options: Build > Compiler > Define Symbols studyserver 프로젝트를 참고하세요. 16