yueyao
FE
WebGL
计算机图形绘制库
DirectX
OpenGL
微软公司开发的多媒体编程接口,游戏开发者友好,被广泛应用。支持图形、视频、音频等。
开源组织维护的跨平台2d/3d图形API,游戏领域的被DirectX超越以及取代,近年,其分支OpenGL ES被移动端设备支持。
WebGL
OpenGL ES分支的JS版本。Chrome 使用OpenGL ES来渲染3D图形。
WebGL
右手坐标系
WebGL
WebGL
顶点着色器
-0.5,0.5,0.5
-0.5, -0.5,0.5
0.5, -0.5,0.5
0.5,0.5,0.5
WebGL
片段着色器
WebGL
// 顶点着色器 glsl-es语言编写
let vertexSource = `
void main(){
gl_Position = vec4(0.5,0.0,0.0,1.0);
gl_PointSize = 10.0;
}`;
// 片元着色器 glsl-es语言编写
let fragmentSource = `
void main(){
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}`;
// 分别创建着色器
let vertexShader = gl.createShader(gl.VERTEX_SHADER, vertexSource)
let fragmentShader = gl.createShader(gl.FRAGMENT_SHADER, fragmentSource)
// 将2个着色器link起来
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
// 绘制工作
gl.drawArrays(gl.POINTS, 0, 1);
WebGL
矩阵计算在WebGL里的作用
// 顶点着色器
// 一个固定的坐标的点 以及一个固定的点大小
let vertexSource = `
void main(){
gl_Position = vec4(0.5,0.0,0.0,1.0);
gl_PointSize = 10.0;
}`;
// 顶点着色器
// 一个投影变换变量 以及一个顶点坐标变量, 均由外部传入
let vertexSource = `
void main(){
gl_Position = u_matrix * vec4(a_pos, 0, 1);
}`;
WebWorker
Workers是一种机制,通过它可以使一个脚本操作在与Web应用程序的主执行线程分离的后台线程中运行。这样做的优点是可以在单独的线程中执行繁琐的处理,让主(通常是UI)线程运行而不被阻塞/减慢。
WebWorker
嵌入式 worker
let myWorker = new Worker('worker.js'); // ok
let myWorker = new Worker('http://www.baidu.com/worker.js'); // CORS
出于安全原因,浏览器限制从脚本内发起的跨源HTTP请求。 例如,XMLHttpRequest和Fetch API遵循同源策略。 这意味着使用这些API的Web应用程序只能从加载应用程序的同一个域请求HTTP资源,除非使用CORS头文件。
-- CORS MDN
WebWorker
嵌入式 worker
URL.createObjectURL(blob) 会创建一个新的 URL 对象
let objectURL = URL.createObjectURL(blob);
let myWorker = new Worker(objectURL);
WebWorker
嵌入式 worker
Blob 对象表示一个不可变、原始数据的类文件对象
// code string
var code = 'some code';
// blob object
var blob = new Blob([code] , {type : 'text/javascript'});
// create URL
let workURL = URL.createObjectURL(blob);
WebWorker
Actor 并发模型
webworker通讯模式
WebWorker
Actor 并发模型
WebWorker
Actor 并发模型
多工作线程执行任务
现代计算机的CPU中有多个物理处理器内核(通常为两个或四个内核),但每个物理内核通常也能够使用高级调度技术一次运行多个线程。
-- MDN
window.navigator.hardwareConcurrency
// 最少一个,最多一半,不能完全占用所有线程。
let workerCount = Math.max(window.navigator.hardwareConcurrency/2,1);
线性插值
已知(x0,y0)(x1,y1)求(x,y)
线性插值
(y - y0) / (x - x0) = (y1 - y0) / (x1 - x0)
线性插值
/**
*
* @param a 原点
* @param b 目标点
* @param n 步数
*/
function lerp(a,b,n){
for (var i = 0; i < n; i++) {
let x = ((a * i) + (b * (n - i))) / n;
}
}
lerp(5,10,2);
// i= 0 , x = 10
// i= 1 , x = 7.5
线性插值
线性插值
transition-timing-function
线性插值
transition-timing-function
线性插值
LRUCache
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。
淘汰最长时间未被使用的数据。
LRUCache
// 设定缓存容量1
let cache = new LRU(1);
// 存储订单1
cache.set('orderID1','some value');
// 存储订单2
cache.set('orderID2','some value');
// 存储订单3
cache.set('orderID3','some value');
// 从缓存中查询订单1
cache.get('orderID1') // nothing
LRUCache
By yueyao