1. 引言
当前引擎跨平台开发流程:
1. Windows端使用VS进行开发,使用VS打包dll供第三方调用
2. Android端使用AS进行开发,使用NDK + CMake方式打包so动态链接库供第三方集成
3. IOS端使用Mac Xcode进行开发,使用Xcode打包为.a/framework 供第三方集成
4. Linux端使用CLion CMake进行开发,使用CMake打包为so动态链接库供第三方调用
总而言之,不同操作系统使用的开发工具IDE不尽相同,而且我们需要为每个平台都创建一层引擎源码,无论是开发还是编译,都非常繁琐,牵一发而动全身。可否考虑使用统一的代码对之进行合并,实现 "write once,run everywhere" 呢?
因此我们对市场上开源的C++引擎进行了调研,希望从中借鉴经验。
2. 开源引擎框架调研
2.1 ncnn
ncnn 是一个为手机端极致优化的高性能神经网络前向计算框架。 ncnn 从设计之初深刻考虑手机端的部署和使用。 无第三方依赖,跨平台,手机端 cpu 的速度快于目前所有已知的开源框架。 基于 ncnn,开发者能够将深度学习算法轻松移植到手机端高效执行, 开发出人工智能 APP,将 AI 带到你的指尖。 ncnn 目前已在腾讯多款应用中使用,如:QQ,Qzone,微信,天天 P 图等。
我们首先观察了下ncnn的跨平台的方式,ncnn使用CMake进行跨平台:
1. 使用CMake + C++ 方式开发跨平台引擎
2. 使用CMake + toolchains 方式控制不同平台、操作系统的库编译
3. 代码层面使用不同操作系统的宏定义,实现代码编译的选择
2.2 tnn
TNN:由腾讯优图实验室开源的高性能、轻量级神经网络推理框架,同时拥有跨平台、高性能、模型压缩、代码裁剪等众多突出优势。TNN框架在原有Rapidnet、ncnn框架的基础上进一步加强了移动端设备的支持以及性能优化,同时借鉴了业界主流开源框架高性能和良好拓展性的特性,拓展了对于后台X86, NV GPU的支持。手机端 TNN已经在手机QQ、微视、P图等众多应用中落地,服务端TNN作为腾讯云AI基础加速框架已为众多业务落地提供加速支持。欢迎大家参与协同共建,促进TNN推理框架进一步完善。
TNN则是使用Bash、Bat脚本的方式对引擎进行编译。
1. 脚本中控制环境变量,脚本内部使用CMake、Xcodebuild进行跨平台编译
2. 代码层面使用不同操作系统的宏定义,实现代码编译的选择
2.3 总结
1. 理论上CMake支持所有跨平台操作系统;但是这种方式需要开发者对CMake使用掌握较高(熟悉各类CMake编译选项,如VS编译选项转CMake、Xcode编译优化选项转CMake等),其次是该种方式不利于开发者使用IDE对源码进行调试;如果项目成熟,仅是为了编译引擎,我们可以考虑使用该种方式。
2. 使用脚本的方式,本质上也是使用CMake以及专用编译工具链进行操作,同样无法进行项目调式等。
3. C++引擎构建方案
3.1 工程目录结构
├── include # 供给调用者的头文件
├── src # SDK引擎源码
├── scripts # 各跨平台项目工程文件夹
│ ├── IOS # xcode项目文件夹,可以编译源码及Demo
│ ├── Linux_x86_64 # CLion项目文件夹,可以编译源码及Demo
│ └── Android # 项目文件夹,编译源码及Demo
├── third_party # 依赖的第三方库
│ └── Linux_x86_64 # Linux操作系统
├── need_environment # 其他需要使用的资源文件(如模型权重等)
├── doc # 相关文档目录
└── README.md # 说明文档
如上图所示:
1. include 目录包含了用于保留需要暴露给调用者的头文件
2. src 目录则是SDK引擎的源码目录,里面没有可执行的main函数,也无相应的Demo
3. scripts 目录包括个各个平台下面的工程文件夹,每个文件夹都是一个项目工程,可以使用不同的IDE打开(Xcode,CLion,VS等)
4. third_party存放引擎依赖的第三方库
5. doc为说明文档等目录
4. 参考
iOS 使用 Cmake 生成 framework 库 - 简书
https://github.com/Tencent/ncnn/wiki/how-to-build#pass-for-linux