技术选型 - scutrobotlab/RM2022_SimulatorX GitHub Wiki

技术选型

客户端技术选型

游戏引擎

游戏引擎选择 Unity 2020.3.22f1,主要考虑到两个方面:

  1. 易使用性:Unity 官网提供了丰富的教程以及手册,对新老开发者都具有很大的帮助,对于新开发者来说,官方提供的小项目可以帮助他们快速上手 Unity,对于老开发者来说,Unity 健全的知识手册使开发人员在定位问题后快速查找相关资源并开发。
  2. 经验积累:前两版的模拟器开发均选用 Unity 作为开发引擎,在技术积累方面,以及对 Unity 编辑器特性的了解方面,有了更广泛和深入的认识,方便开发人员进行更好更快的开发工作。

IDE 工具

使用 JetBrains Rider 进行脚本的编写,其优势在于:Rider 对 Unity 的各种 API 适配良好,能够得到快速且完整的提示语句,提高开发效率。

网络同步框架

在网络同步框架方面,我们沿用了去年的 Mirror 框架,在 2021 版本中,该框架的表现良好,我们将其沿用到了 2022 的版本中。

后端技术选型

主节点后端

通过 SpringBoot 整合的 Kotlin 技术栈,由 Gradle 进行依赖管理和打包,使用 intelliJ IDEA 开发。

官方下载站

下载站选用 h5ai,它是一个用于 HTTP 网络服务器的现代专注于文件的索引器。

CI/CD

选用由 JetBrains 开发的 TeamCity,分别部署 Linux 和 Windows Agent 各一台。

存储服务

数据存储选用非关系数据库 MongoDB,文件存储选用腾讯云对象存储服务。

前端技术选型

核心技术

管理后端基于 React+JavaScript+Less 进行开发,同时使用 webpack 进行打包,在 UI 上为了开发的快捷采用 Antd 的组件库。

底层技术

使用 React 框架避免直接操作 Dom 节点,从而大大提高本前端项目的渲染效率,同时依赖于 jsx 的防注入攻击技术,使得本项目更加安全可靠。

组件式开发

基于 React 函数式组件与 React 类式组件相互配合使用,对于较为简单的组件利用函数式组件进行开发,而相对复杂的组件采用更加庞大的类式组件开发,使得代码的编写显得更加方便,增加代码的可读性,项目中函数式组件主要采用 React hooks 技术,以一种更加优雅的方式对组件的生命周期进行更加高效的管理,并且对组件进行抽离和封装,减少组件和组件之间的耦合程度,实现单一组件完成特定功能。

请求封装

基于后端的接口设计提前封装前端项目所需要的接口请求,对于后续的项目开发流程提供便利,也简化项目的代码量,使得在项目中更改 Axios 请求时更加简便,也更加易于拓展请求的接口,将请求报文必要的部分和特定化的应用请求参数部分抽离开来,同时通过配置代理来尽量避免出现发送异步请求时产生的跨域问题。

生产环境标准化

通过 react-app-rewired 插件来对 React 原生的开发环境进行覆盖重写,防止直接暴露 React 相关配置,实现特定化,标准化的生产环境,集成产生多套打包资源,便于在服务器上进行部署,并且利用 webpack 来对项目进行了模块化打包和实现按需加载,自动化打包的应用,大大提高了渲染和打包效率,此外通过组件懒加载的方式,在用户还未访问时暂时不加载资源,按需加载的方式,在用户存在网速等限制问题下仍能流畅访问系统。

层次分离

本项目中采用 AntDesign 作为项目的 UI 层组件库,而项目中组件层间的通信管理则采用 Redux 来作为进行公共的状态管理,通过分离 UI 层和状态管理层,来降低各层次间的耦合,防止产生项目混乱不堪情况的产生,让各层次之间的关注点分离独立。

权限管理

通过建立起用户模型的方式来保证用户和系统间交互的合法性,利用用户模型来实现系统的多态化管理,对不同的用户群体展现出不同的权限特征,隐藏对用户来说不合法的界面和操作,保证系统的安全性。

数据管理

在本项目中,对于像图片上传这样较大数据量的传输,提前通过压缩技术等方式减少传输时流量的消耗,而对于一些需要在网页刷新后仍需要较为长期保留的数据则通过申请存放在 Cookies 中的方式来达到持久化的目的。

设备适配

借助 Less 的强大拓展功能来对样式提高适配性,对于更多的有着不同缩放比例的屏幕进行兼容,避免在某些设备上出现样式难以拓展而产生用户不适的情况。

接口测试

使用工具 Apifox 来对接口进行本地模拟测试,实现和后端的无缝对接,模拟真实的生产环境,进一步提高生产效率。