热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WebWorker使用初体验

圣诞节为集团活动制作了一款竞速(戳手指)类的H5互动小游戏,在这个的开发过程中第一次体验了WebWorker的功能,感觉还是不错的,整理分享一下。使用缘由由于这次制作的H5互动小游

《Web Worker使用初体验》

圣诞节为集团活动制作了一款竞速(
戳手指)类的H5互动小游戏,在这个的开发过程中第一次体验了Web Worker的功能,感觉还是不错的,整理分享一下。

使用缘由

由于这次制作的H5互动小游戏需要针对点击速度进行动效的更新,然后游戏场景中有很多的元素,在使用canvas的过程中,发现在安卓机上面会出现快速点击之后页面卡顿的现象,由于动画的卡顿,导致页面上面的计时器(setInterval)被卡停了,最终出现了安卓机的游戏结果拉了IOS一条街,这不科学啊。

本次H5游戏的相关处理不做主要内容,可能会是由于自己处理优化不够导致的问题,请大家勿深究。

分析原因,应该是页面的动画频繁渲染,导致计时器处理事件被阻塞了,这也是Javascript处理是单线程的一个直接结果。所以就想到了Web Worker是否可以解决我的问题,来处理计时器的计算呢?

Javascript 语言采用的是单线程模型,也就是说,所有任务只能在一个线程上完成,一次只能做一件事。前面的任务没做完,后面的任务只能等着。

Web Worker

当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。

Web Worker 是运行在后台的 Javascript,独立于其他脚本,不会影响页面的性能。
您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 Web Worker 在后台运行。

Web Worker的基本原理就是在当前Javascript的主线程中,使用Worker类加载一个Javascript文件来开辟一个新的线程,起到互不阻塞执行的效果,并且提供主线程和新线程之间数据交换的接口:postMessageonmessage
所以你可以在前台做一些小规模分布式计算之类的工作,不过Web Worker有以下一些使用限制:

  • Web Worker无法访问DOM节点;
  • Web Worker无法访问全局变量或是全局函数;
  • Web Worker无法调用alert()或者confirm之类的函数;
  • Web Worker无法访问window、document之类的浏览器全局变量;

使用Web Worker

支持性检测

if(typeof(Worker)!=="undefined") {
alert('支持worker')
} else {
alert('不支持worker')
}

创建worker.js

var self =this;
self.addEventListener('message', function (e) {
var data = e.data;
switch (data.cmd) {
case 'start':
startTimer();
break;
case 'stop':
stopTimer();
break;
default:
break;
};
}, false);
var timerId = null, gameTime = 0;
var startTimer = function () {
timerId = setInterval(function () {
gameTime += 16;
var million = String(gameTime % 1000).substr(0, 2);
var secOnd= String(Math.floor(gameTime / 1000));
secOnd= second.length >= 2 ? second : '0' + second;
self.postMessage({
second: second,
million: million
});
}, 16);
}
var stopTimer = function () {
clearInterval(timerId);
gameTime = 0;
}

以上代码中重要的部分是 postMessage() 方法 – 它用于向 HTML 页面传回一段消息。当然,我的应用场景太简单了,web worker 通常不用于如此简单的脚本,而是用于更耗费 CPU 资源的任务。

创建Worker对象

if(typeof(Worker)!=="undefined") {
let worker = new Worker("./worker.js");
} else {
alert('不支持worker')
}

消息处理

worker.Onmessage= function (event) {
// 接收到worker计算相关的数据
}

当 web worker 传递消息时,会执行事件监听器中的代码。event.data 中存有来自 event.data 的数据。

错误处理

worker.onerror(function (event) {
// 错误处理
});

终止Web Worker

worker.terminate();

使用后记

在使用Web Worker之后,新开一个线程用于计时器的计算,从而基本解决了游戏时间的问题。由于计时器的间隔时间和发送消息的过程,可能还是和实际的间隔时间会有一定的出入,但是从活动来说已经在接受范围内了。

通过这次简单的使用Web Worker,初步理解了其基本原理和使用方法,也为以后的相似情景找到了解决的路径,希望能够对遇到同样问题的朋友有所帮助。


推荐阅读
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
author-avatar
小贤少_129
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有