Three.js教程(2):工具篇
上一章我们基本上领略了three.js
的魅力,这一章我们先不急着深入three.js
,先学习2个非常有用的工具库,分别是stats.js
和dat.gui
,也许你没有听过两个库,但是很可能你见过他们。
stats.js
stats.js是three.js
的作者mrdoob
开发的一个简单的JavaScript性能监控的库。使用方法很简单:
var stats = new Stats();
stats.showPanel( 1 ); // 0: fps, 1: ms, 2: mb, 3+: custom
document.body.appendChild( stats.dom );
function animate() {
stats.begin();
// monitored code goes here
stats.end();
requestAnimationFrame( animate );
}
requestAnimationFrame( animate );
它有3种模式,从上面的注释中也可以看的出来:
0:FPS,最近1秒的帧率,值越大表示性能越好; 1:MS,每一帧需要多少毫秒,值越小表示性能越好; 2:MB,所分配的内存,谷歌浏览器启动的时候需要添加参数
--enable-precise-memory-info
; 3或者以上:用户自定义(通常用不到这个)。
通常我们关注最多的是0
这种模式,一般60Hz CPU的浏览器,一秒最多可以绘制60次,也就是FPS接近60,如果远远低于这个值,说明代码效率不高或者代码有问题。上述stats
对象还有一个方法stats.update();
,如果我们只关注每2次绘制间代码的FPS,那么用这个方法更方便,stats.js的源代码点击这里查看。
最后我们把上一章的最后一个例子使用stats.js
框架来处理:
+ <script type="text/javascript" src="../node_modules/stats.js/build/stats.min.js"></script>
<script type="text/javascript">
var camera, scene, renderer;
var geometry, material, mesh;
+ var stats = new Stats();
function init() {
// 此处代码和上章的相同就不再重复
+ stats.showPanel(0); // 0: fps, 1: ms, 2: mb, 3+: custom
+ document.body.appendChild( stats.dom );
}
function animate() {
+ stats.update();
// 此处代码和上章的相同就不再重复
}
init();
animate();
</script>
效果如下,可以看到我们的代码基本上都是60FPS,说明我们的代码性能还不错。
dat.gui
dat.gui是一个轻量级的JavaScript控制库,它可以很方便控制变量的值。首先需要引入dat.gui.css
,然后需要引入dat.gui.min.js
,我们来一个猛一点的例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<link rel="stylesheet" href="../node_modules/dat.gui/build/dat.gui.css"></link>
<style>
*{
margin: 0;
padding: 0;
}
</style>
</head>
<body>
我叫<span id="nameSpan"></span>
<script type="text/javascript" src="../node_modules/dat.gui/build/dat.gui.min.js"></script>
<script type="text/javascript">
var gui = new dat.GUI({
name: '测试GUI',
useLocalStorage: false, // 使用LocalStorage来存储
closeOnTop: false// 关闭按钮是否在顶部
});
var obj = {
name: 'Orange',
age: 18,
money: 100,
isStudent: true,
hobby1:'篮球',
hobby2:'Run',
color1: '#FF0000', // CSS string
color2: [ 0, 128, 255 ], // RGB array
color3: [ 0, 128, 255, 0.3 ], // RGB with alpha
color4: { h: 350, s: 0.9, v: 0.3 }, // Hue, saturation, value
num: 0,
// 请允许我这里写汉字
打印: function (){
this.num++;// 非GUI改变变量 需要listen
console.log(this)
}
};
var folder1 = gui.addFolder('基本信息');
folder1.open(); // 打开第一个文件夹
// 首先赋值一次
var $nameSpan = document.getElementById('nameSpan');
$nameSpan.innerText = obj.name;
// 监听到name的变化 则写入DOM
folder1.add(obj, 'name').onChange(function (val){
$nameSpan.innerText = val;
})
folder1.add(obj, 'age', 0, 100,1);// 0~100每次增加或者减少1
folder1.add(obj, 'money',0,1000);// 0~1000
folder1.add(obj, 'isStudent');// 如果值是boolean类型的那么就会当做复选框
folder1.add(obj, 'hobby1',['篮球','游泳','跑步']);// 如果第三个值是数组或者对象那么会渲染成选项框
// 如果第三个值是数组或者对象那么会渲染成选项框
folder1.add(obj, 'hobby2',{'篮球':'Basketball','游泳':'Swimming','跑步':'Run'});
var folder2 = gui.addFolder('颜色');
folder2.addColor(obj, 'color1');
folder2.addColor(obj, 'color2');
folder2.addColor(obj, 'color3');
folder2.addColor(obj, 'color4');
// 添加到gui上
gui.add(obj, '打印');// 如果是函数的话 那么就会当做按钮
// 注意这里的num是在 打印 函数中改变的 而不是手动修改GUI的 这种非GUI改变的时候需要监听 那么需要调用.listen()方法
gui.add(obj, 'num').listen();
document.body.appendChild(gui.domElement);
</script>
</body>
</html>
大致效果如下:
是不是有点似曾相识?其实网上好多canvas
和three.js
的特效都会引入这个库来简单的控制变量,这个库最6的地方是当GUI上的值改变的时候,内存中的数据也变了,你可以点击打印按钮来打印对象obj的值。
dat.gui的使用
现在我们们在我们上个例子中引入dat.gui:
<!-- 上面部分跟之前相同 -->
+ <link rel="stylesheet" href="../node_modules/dat.gui/build/dat.gui.css"></link>
<style>
*{
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<script type="text/javascript" src="../node_modules/three/build/three.js"></script>
<script type="text/javascript" src="../node_modules/stats.js/build/stats.min.js"></script>
+ <script type="text/javascript" src="../node_modules/dat.gui/build/dat.gui.min.js"></script>
<script type="text/javascript">
var camera, scene, renderer;
var geometry, material, mesh;
var stats = new Stats();
+ var gui = new dat.GUI();
+ var obj = {
+ speedX : 0.01,
+ speedY : 0.02
+ };
function init() {
// 此处代码和上章的相同就不再重复
+ gui.add(obj, 'speedX', 0, 0.1);
+ gui.add(obj, 'speedY', 0, 0.1);
}
function animate() {
stats.update();
requestAnimationFrame( animate );
+ mesh.rotation.x += obj.speedX;
+ mesh.rotation.y += obj.speedY;
renderer.render( scene, camera );
}
init();
animate();
</script>
</body>
</html>
出来的效果如图所示,你可以修改GUI的值来改变小方块的转速。
- Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理
- VB6对滚轮的支持
- 文件实时同步后防篡改的操作记录
- web中的水晶报表 "出现通信错误。将停止打印"
- nginx反向代理中proxy_set_header 运维笔记
- 期待已久的直播能力开放了!年底之前来波大的
- 两个目录中,删除其中一个目录中同名文件的做法
- linux下监控某个目录是否被更改
- centos下升级git版本的操作记录
- linux下core file size设置笔记
- linux下文件加密操作记录
- python的with语句,超级强大
- “AS3.0高级动画编程”学习:第二章转向行为(上)
- Linux下性能调试工具-top和sar运维笔记
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用Spring Data JPA进行数据分页与排序
- 搭建一个高可用负载均衡的集群架构(第二部分)
- 在PyTorch中使用Seq2Seq构建的神经机器翻译模型
- 理解 ECMAScript 规范(1)
- 使用 NodeJS 实现 JWT 原理
- 搭建一个高可用负载均衡的集群架构(第一部分)
- Java Stream函数式编程第三篇:管道流结果处理
- MySQL慢查询日志
- Pandas处理时间序列数据的20个关键知识点
- CentOS7下的LNMP环境搭建Dedecms网站
- 持久层框架JPA与Mybatis该如何选型
- 技术分享 | Online DDL 工具 pt-osc
- 基于hexo框架搭建个人博客【技术创作训练营】
- 对比讲解lambda表达式与传统接口函数实现方式
- 如何使用Java8 Stream API对Map按键或值进行排序