게임 프레임워크
소개
리얼월드 게임프레임워크 RWF (Real World Framework)는 Typescript로 개발된 고성능 FiveM 프레임워크 입니다.
현재 FiveM에서 널리 사용되는 VRP, ESX, QBCore 등의 오픈소스 프레임워크와는 달리 클로즈드소스(Closed Source)이며
리얼월드가 추구하는 현실성과 확장성을 위해 베이스부터 자체적으로 설계하고 개발되었습니다.
RWF의 모든 스크립트는 Core, Game, UI 3개의 리소스에 통합되어 매우 효율적으로 동작합니다.
리소스를 통합시킴으로써 스크립트의 각 기능에 대한 완벽한 컨트롤과 호환성, 그리고 네트워크와 스크립트의 극한의 최적화를 실현하였습니다.
또한, 다양한 기능들이 Typescript의 객제지향 프로그래밍을 통해 모듈화 되어있어 추후 추가되는 컨텐츠와 기능들의 확장이 매우 유연합니다.
이는 대규모 인원(동시 접속 1000명 이상)의 수용과 스크립트의 버그나 오류 발생을 최소화하는 데에 매우 적합한 구조입니다.
특징
리소스 정규화
FiveM은 오픈 소스 유저 모드 공유 커뮤니티를 기반으로 시작했으며, 현재도 이와 같은 방식으로 운영되고 있습니다. 이러한 특징으로 인해 다양한 FiveM 프레임워크가 각 기능을 리소스로 분할하는 구조를 가지고 있습니다. 이는 모듈화의 한 형태이며, 많은 개발자들이 자신의 서버에 게임 리소스를 통합하는 데 적합한 구조입니다.
그러나 리얼월드는 기존 프레임워크에서 한계점을 극복하고 더 확장 가능한 시스템을 필요로 했습니다.
이런 이유로 리얼월드는 프레임워크를 자체적으로 개발하기로 결정했습니다. 자체 개발을 통해 리소스를 분할하는 방식은 더 이상 필요하지 않았고, 모든 게임 시스템을 하나의 리소스에 통합하게 되었습니다. 리소스 통합으로 인해 기존 시스템에서 발생했던 리소스 간 데이터 통신 부하와 정규화 문제를 해결하고 게임 데이터 상태를 완벽하게 관리할 수 있게 되었습니다.
실시간 상태 저장
기존 FiveM 프레임워크들이 서버 메모리의 게임 데이터를 MySQL에 직접 저장하는 구조를 가지고 있다는 점은 개발 및 관리의 편의성을 제공하지만, MySQL에 대한 빈번한 읽기/쓰기 작업이 있을 경우 서버 과부하와 메모리 누수 가능성이 크다는 문제점을 가지고 있습니다.
리얼월드 프레임워크는 기존 프레임워크보다 훨씬 큰 게임 데이터와 로직을 다루므로 이러한 데이터를 효과적으로 관리할 수 있는 아키텍처가 필요했습니다. 따라서 Redis 메모리 저장소를 활용한 데이터 관리 기법을 고안하게 되었습니다. 리얼월드 프레임워크는 Redis를 사용하여 서버 메모리의 게임 데이터를 실시간으로 영구 저장함으로써 데이터 손실을 방지합니다. Redis는 MySQL이 디스크에 데이터를 저장하는 것과는 달리 메모리를 저장소로 사용하므로 수십배에서 수백배 빠른 데이터 관리가 가능합니다.
주요 세션 및 사용자 정보 데이터를 제외한 모든 데이터는
MySQL <> Redis <> GameServer단계로 관리됩니다. 이렇게 데이터를 효과적으로 분산 저장하고 업데이트함으로써 게임 데이터 관리에 대한 성능과 신뢰성을 향상시킬 수 있습니다.Typescript
리얼월드 프레임워크의 모든 스크립트는 Typescript로 개발되었습니다. 프레임워크 개발의 초기 당시 FiveM에서 지원하는 3가지 프로그래밍 언어 중 어떤것을 사용해야할지 정말 많은 고민이 있었습니다.
각 언어는 장단점이 존재하며, 아래와 같습니다.
LUA
빠르게 코드를 작성할 수 있는 간편한 언어이지만 비동기, 다중콜백문제, 객제지향의 부재, 데이터타입 등의 다양한 한계점을 가지고 있습니다.C# (.NET)
3가지 언어중 유일한 컴파일언어, 거의 완벽한 객체지향 지원 등으로 대규모 프로젝트에 적합하지만 개발이 까다롭고 시간이 너무 오래걸립니다.Typescript (Javascript)
LUA와 C#의 장점을 모두 다 가진 언어로 볼 수 있습니다. 단점으로는 과거 LUA 또는 C#에 비해 성능면에서 느린 언어였지만 최근에는 거의 성능차이가 없을 정도로 런타임이 발전함으로써 리얼월드 프레임워크를 제작하기에 매우 접합한 언어였습니다.
위와 같은 이유로 Typescript는 리얼월드 프레임워크 개발에 가장 적합한 언어였습니다.
VUE
리얼월드의 모든 UI는 VUE로 제작되었습니다. VUE는 강력한 Javascript 프레임워크이며, 직관적이고 빠르며 사용하기 쉽습니다.
RWF는 통합된 리소스를 사용하므로 각각의 UI들은 모두 하나로 통합되어 서로 상호작용이 가능합니다.
만약 자신의 아이템 정보를 채팅창에 올리고 싶을 경우, 마우스로 인벤토리의 아이템을 채팅창으로 드래그하기만 하면 됩니다.
이와 같이 인벤토리 UI와 채팅창 UI가 서로 연동되고 상호작용하는 것처럼, 리얼월드의 대부분의 UI는 서로 연결되어 있습니다.
Message Queue
RWF는 서버 외부와의 양방향 데이터 통신을 위해 FiveM에서 제공하는 RCON을 대신하여 더 유연하고 확장 가능한 MQ(MessageQueue)를 사용합니다.
MQ는 비동기, 확장성, 탄력성, 보장성을 제공하기 때문에 서버 외부의 다양한 앱들과 서버의 실시간 데이터를 주고 받기에 매우 적합한 솔루션 입니다.
리얼월드의 모바일앱, 유저웹패널, API 등 리얼월드의 부가적인 서비스들이 MQ를 이용하여 서버의 데이터를 수신하고 전송합니다.
기술 사양
- v5.2 Typescript5
- v3.2 Vue3
- v8.0 MySQL
- v4.0 Redis
- v5.1 ActiveMQ
리소스
게임 리소스
리소스 명 구분 설명 RW-Core 스크립트 전체 게임데이터의 로드/저장 및 제어를 위한 핵심 리소스 RW-Game 스크립트 게임플레이 핵심 로직 RW-UI 스크립트 VUE UI 로드 및 UI 관련 API 관리 RW-Vendor 스크립트(확장) 외부 소스 및 비호환 데이터 RW-MySQL 데이터 관계형 데이터베이스 MySQL 접속 및 관리 RW-Redis 데이터 실시간 게임 데이터 로드/저장을 위한 Redis RW-MQ 데이터(통신) 서버 외부와의 통신 및 데이터 관리 RW-Asset 스트리밍 공용 자산 및 컨텐츠 스트리밍 RW-Prop 스트리밍 공용 오브젝트 스트리밍 RW-MapBase 스트리밍 맵 공용 데이터 스트리밍 RW-VehicleBase 스트리밍 차량 공용 데이터 스트리밍 RW-CloBase 스트리밍 의류관련 공용 데이터 스트리밍 RW-SkinBase 스트리밍 스킨 공용 데이터 스트리밍 RW-MapXXX 스트리밍(확장) 맵 리소스 스트리밍 RW-VehicleXXX 스트리밍(확장) 차량 리소스 스트리밍 RW-CloXXX 스트리밍(확장) 의류관련 리소스 스트리밍 RW-SkinXXX 스트리밍(확장) 스킨 리소스 스트리밍 리소스 종속성
프레임워크의 리소스는 리소스별로 종속성이 존재하며 계층구조로 설계 되어있습니다.
resources ├─ RW-Redis ├─ RW-MySQL └─ RW-MQ └─ RW-Core ├─ RW-Game ├─ RW-UI ├─ RW-Asset ├─ RW-Prop ├─ RW-MapBase │ ├─ RW-MapXXX │ └─ ... ├─ RW-VehicleBase │ ├─ RW-VehicleXXX │ └─ ... ├─ RW-CloBase │ ├─ RW-CloXXX │ └─ ... ├─ RW-SkinBase │ ├─ RW-SkinXXX │ └─ ... └─ RW-Vendor