深入理解LayaAir引擎架构和实现原理(一)跨平台引擎源码编译
拉取引擎源码
LayaAir
查看目录结构
laya引擎是使用TypeScript开发的,引擎核心代码在src/LayaAir路径下,查看tsconfig.json文件可知其编译目标环境为es6。
编译引擎代码
项目路径下
npm i
安装所需依赖库
查看package.json中的命令,会发现它的编译命令build是去执行public.bat,我觉得这个不行,引擎开发人员没有完成macOS环境下的编译,所以我们自己加个支持跨平台的编译命令crossBuild。
"scripts": {"build": "cd src/publishTool&&cmd /k publish.bat","compile": "gulp LayaAirBuild","buildDoc": "cd src/generateDoc&&cmd /k run.bat","crossBuild": "node src/publishTool/publish.js && cd src && gulp build"},
src/publishTool路径下创建publish.js。编译工具public.bat中做了什么事情,在publish.js脚本中也做同样的事情就好。
public.bat
@echo off
if exist ..\..\build (rmdir /s/q ..\..\build
) if exist ..\..\bin\tsc\layaAir (rmdir /s/q ..\..\bin\tsc\layaAir
)
node index.jscd ..\
gulp build@pause
查看代码易知,在编译前,会先删除build和 bin/tsc/layaAir文件夹。build文件夹是最终导出各语言平台下laya引擎库文件的地方。layaAir文件夹是引擎项目tsc编译的导出目录。AS语言的引擎库文件就是根据该目录下的文件转换的。
之后会执行index.js文件,先来看看入口函数start()
start() {return __awaiter(this, void 0, void 0, function* () {let json = JSON.parse(fs.readFileSync("outConfig.json"));this.BaseURL = emiter_1.emiter.BaseURL = json.from;this.outfile = json.out;this.createAS = json.createAS;this.layajsURL = json.layajsURL;this.tsCongfig = json.tsConfig;this.filterArr = json.filter;emiter_1.emiter.jscObj = json.jscObj;// yield相当于awaitif (!this.tsCongfig.length || (yield this.compile())) { //确认编译结果this.checkAllDir("");}else {console.log("compile fail!");}});}
其中__awaiter是一个编译工具函数,相当于async/await
,因为引擎项目是ES6的,所以使用这种方式实现异步执行的功能,想进一步了解的可以看这里。
编译的配置在outConfig.json中,其中有个是否导出AS的开关createAS,不需要就可以关闭了,加快编译速度。
编译函数compile(),它的功能是根据配置去执行tsc编译,但是这边它直接用局部的tsc.cmd去执行,并且也写的不好,所以我们把他改成更通用的方式。
let cmd = ["-b", tsConfigUrl];let tscurl = path.join(this.BaseURL.split("bin")[0], "./node_modules/.bin/tsc.cmd");child_process.execFile(tscurl, cmd, (err, stdout, stderr) => {if (err) {console.log(err, '\n', stdout, '\n', stderr);}start(err);});
改为
let cmd = "tsc -b " + tsConfigUrl;child_process.exec(cmd, (err, stdout, stderr) => {if (err) {console.log(err, '\n', stdout, '\n', stderr);}start(err);});
准备妥当开始编写public.js
var fs = require('fs'); // 引入fs模块
var path = require('path');
const child_process = require("child_process");function deleteall(path) {// learvar files = [];if(fs.existsSync(path)) {files = fs.readdirSync(path);files.forEach(function(file, index) {var curPath = path + "/" + file;if(fs.statSync(curPath).isDirectory()) { deleteall(curPath);} else {fs.unlinkSync(curPath);}});fs.rmdirSync(path);}
};let buildPath = path.join(__dirname,'../../build')
deleteall(buildPath);let layaAirPath = path.join(__dirname,'../../bin/tsc/layaAir')
deleteall(layaAirPath);process.chdir(__dirname);
require('./index.js');
项目路径下执行
npm run crossBuild
即可实现Windows/macOS系统下LayaAir引擎的编译。
深入理解LayaAir引擎架构和实现原理(一)跨平台引擎源码编译相关推荐
- LNMP架构环境搭建之PHP、Nginx源码编译安装及其简单配置应用
LNMP架构中的Mysql见上一篇博文"LNMP架构环境搭建之mysql源码编译安装" 一.PHP简介 PHP(外文名:PHP: Hypertext Preprocessor,中文 ...
- 字节跳动Android三面视频解析:framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等
前言 对于字节跳动的二面三面而言,Framework+MVP架构+HashMap原理+性能优化+Flutter+源码分析等问题都成高频问点!然而很多的朋友在面试时却答不上或者答不全!今天在这分享下这些 ...
- LNMP架构的搭建--源码编译(MYSQL,PHP,nginx)
1.基础知识 1. LNMP架构: LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写.L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指P ...
- 基于Centos7.5源码编译搭建LAMP架构
简介LAMP源码编译搭建LAMP架构 为什么要源码编译 一般来说,我们软件的安装方式有Yum(rpm),和源码编译两种方式,那么为什么我们需要源码编译安装一部分软件?选择源码编译安装软件有以下几个原因 ...
- LNMP架构环境搭建之mysql源码编译安装
Mysql MySQL是一个开源的数据库,在互联网行业应用的很广泛,下面来记录一下从源码编译安装的步骤,当然,MySQL也有其他安装方式,比如,使用yum下载安装rpm包,或者二进制方式安装,如果机器 ...
- Web服务 源码编译安装LAMP架构
Web服务 源码编译安装LAMP架构 一.LAMP架构 1.LAMP架构是什么 2.各组件的主要作用 二.编译安装Apache httpd服务 1.关闭防火墙,将安装Apache所需软件包传到/opt ...
- 详解非局部均值滤波原理以及用MATLAB源码实现
详解非局部均值滤波原理以及用MATLAB源码实现 序言 均值滤波.中值滤波.高斯滤波在滤除噪声的过程中,无可避免的使图像的边缘细节和纹理信息所被滤除.针对此问题,Buades[1]等人提出了非局部均值 ...
- SHA3系列(KECCAK)哈希算法原理及实现(附源码)
相关文章: (本文持续更新中) SHA3系列(KECCAK)哈希算法原理及实现(附源码) SHA512系列哈希算法原理及实现(附源码) SHA224和SHA256哈希算法原理及实现(附源码) 国密SM ...
- 十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了
十年老架构师神级推荐,MyBatis源码分析,再也不用为源码担忧了 前言 MyBatis是一个优秀的持久层ORM框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL 本身,而不需要花 ...
最新文章
- KMeans中的K怎么选择?Elbow method怎么实施?
- cisco 交换机镜像
- “证券教父”阚治东旗下东方汇富成失信被执行人 官方澄清
- 使用session监听+spring MVC拦截器禁止用户重复登录
- 【实验】小型网络WLAN架构实战案例
- Jquery中怎样判断是否有网络
- 内存稳定性测试_内存条选择两条8G还是单条16G?通过对比浅谈该如何选择
- python json unicode_python2下解决json的unicode编码问题
- 容器编排技术 -- kubeadm 实现细节
- Kali安装虚拟机遇到的问题
- 分布式存储系统学习笔记(一)—什么是分布式系统(3)—复制
- java项目管理工具
- PTP(IEEE1588),TSN时间同步方法
- 毕设总结(理工本科)
- 【历史上的今天】1 月 17 日:VirtualBox 诞生;杨致远辞职;风暴蠕虫问世
- 【不三不四的脑洞】“被相亲对象拉黑“所引发的关于链表合并算法的思考
- 给想上MIT的牛学生说几句
- 键盘轴体怎么选,HHKB键盘来告诉你
- java解析图片GPS等信息,springboot项目获得图片GPS
- 学画画要花多少钱_孩子学画画大约需要多少钱呢?