WebWorker、ThreeJs的渲染和控制

在之前的项目经验中,如果使用threejs加载比较大的3d场景,那么在创建threejs的对象和绘制的时候,会占用浏览器线程执行一个大时长的任务,导致页面卡住,不能交互。那有什么即可以绘制canvas又不占用主线程的方法吗?今天它来了(其实已经来了很久了)使用WebWorker就可以实现在另外的线程中绘制canvas,从而做到不影响主线程。本文不会主要介绍WebWorker和Threejs基础知识,只是一篇实操(辛酸史),但是在必要的时候会提供相关的链接WebWorker。
摘要由CSDN通过智能技术生成

在这里插入图片描述

ios16.4 版本中已经开始支持了 OffscreenCanvas ,那看样子,是时候再把Three做一波优化了

背景介绍

在之前的项目经验中,如果使用threejs加载比较大的3d场景,那么在创建 threejs 的对象和绘制的时候,会占用浏览器线程执行一个大时长的任务,导致页面卡住,不能交互。

那有什么即可以绘制 canvas 又不占用主线程的方法吗?

今天它来了(其实已经来了很久了)

使用WebWorker + OffscreenCanvas 就可以实现在另外的线程中绘制canvas ,从而做到不影响主线程。

本文不会主要介绍 WebWorkerThreejs 基础知识,只是一篇实操(辛酸史),但是在必要的时候会提供相关的链接

WebWorker 可以在后台启动一个线程执行js脚本,并且不会影响到主线程。

关于Webworker: 使用 Web Workers - Web API 接口参考 | MDN

OffscreenCanvas 是一个可以脱离屏幕渲染的canvas 对象,在串口环境和 WebWorker 环境都可以使用

关于OffscreenCanvas: OffscreenCanvas - Web API 接口参考 | MDN

项目开始

接下来就实践一下WebWorker + Threejs 渲染3d场景,并使用 OrbitControls 实现人机交互

Demo使用 vue3 开发

app.vue

<template> 
    <canvas ref="canvas"></canvas>
</template>
<script setup>
import { ref } from 'vue'
canvas = ref()
</script>

WebWorker 中只能使用 OffscreenCanvas,不能直接操作 DOM,所以需要把 canvas 元素转成 OffscreenCanvas 对象,在传递给 WebWorker 中使用

vue 的组件 onMounted 生命周期中,可以访问 DOM 元素

App.vue

import {
   
  // ...other 
  onMounted 
} from 'vue'
import Worker from './worker?worker'
const worker = new Worker()
onMounted(() =>{
   
  const offCanvas = canvas.value.transferControlToOffscreen()  
})

WebWorker 的通信通过 postMessageonmessage

worker.postMessage({
   
	type: 'init',
	data: {
   
		offCanvas
	}
}, [offCanvas])    

webworker 中接收传入的 OffscreenCanvas 对象

worker.js

self.onmessage = function ({
     data }) {
   
    switch (data.type) {
   
        case 'init':
            init(data.data)
            break;
    }
}

使用传入的 OffscreenCanvas 对象做threejs的渲染

import {
   
    OrthographicCamera,
    Scene,
    WebGLRenderer,
    BoxGeometry,
    MeshLambertMaterial,
    Mesh,
    AmbientLight
} from 'three'


self.onmessage = 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我很抱歉,我并不清楚如何在Quill中使用Web Worker来提高渲染速度。但是,如果您需要提高Quill的性能,您可以尝试以下方法: 1. 缓存渲染好的内容,避免重复渲染。 2. 将Quill初始化的操作放在后台线程中完成。 3. 使用虚拟滚动来优化大型文档的渲染。 希望这些方法可以帮助您提高Quill的性能。 ### 回答2: 在 Quill 中使用 Web Worker 可以提高渲染速度。Web Worker 是一种 JavaScript 浏览器技术,它允许在后台线程中执行耗时的任务,而不会阻塞用户界面的渲染和响应。 在 Quill 中,我们可以将文本的渲染任务放到 Web Worker 中处理,以避免主线程的阻塞。以下是在 Quill 中使用 Web Worker 提高渲染速度的大致步骤: 1. 创建一个 Worker 文件:创建一个新的 JavaScript 文件,该文件将包含用于处理渲染任务的 Worker 逻辑。 2. 初始化 Worker:在 Quill 的初始化过程中,创建一个新的 Worker 实例,并将 Worker 文件中的逻辑加载到该实例中。 3. 监听文本变化:在 Quill 中,监听文本变化的事件(如输入、删除等),并将这些变化发送到 Worker 实例中。 4. 在 Worker 中处理任务:在 Worker 文件中,监听从 Quill 接收到的文本变化事件,进行渲染处理。由于 Worker 在后台线程中运行,因此它可以以并行方式处理多个渲染任务。 5. 将结果发送回主线程:在处理完渲染任务后,将结果发送回主线程。可以使用 postMessage 方法将结果传递给 Quill 实例。 6. 在主线程中更新渲染结果:在 Quill 的事件监听中,接收并处理来自 Worker渲染结果消息,并更新界面中对应的部分。 通过这种方式,Quill 在使用 Web Worker 时可以同时进行渲染和用户输入响应的处理,提高了渲染的速度和用户体验。但需要注意的是,在使用 Web Worker 时,需要考虑数据传递和同步的问题,以确保渲染结果的正确性。 ### 回答3: 在Quill中使用Web Worker可以提高渲染速度。Web WorkerJavaScript的一个特性,允许在后台运行一个独立的脚本线程,不会阻塞主线程的执行。具体步骤如下: 首先,需要创建一个新的Web Worker脚本文件,可以命名为"worker.js"。在这个脚本文件中,编写渲染相关的代码,例如处理富文本编辑器的内容并生成渲染结果。 在Quill中,可以通过使用Quill实例的on('text-change')事件监听文本变化。在这个事件处理函数中,将需要渲染的文本内容传递给Web Worker进行处理。可以使用postMessage()方法将内容发送给Web Worker。 在Web Worker脚本中,可以使用onmessage事件监听主线程传递过来的消息。在接收到消息后,进行渲染处理,并将渲染结果通过postMessage()方法发送回主线程。 在主线程中,可以通过使用Quill的updateContents()方法来更新渲染结果。在接收到Web Worker发送回来的渲染结果后,可以调用这个方法将渲染结果应用到富文本编辑器中。 使用Web Worker来处理渲染可以提高渲染速度,因为Web Worker在独立的线程中执行,不会阻塞主线程的运行。这样可以让渲染和主线程的其他操作并行进行,提升渲染的响应速度和用户体验。 需要注意的是,Web Worker只能处理纯文字渲染,对于复杂的富文本格式可能需要根据情况进行特定的处理。在使用Web Worker时,还需要考虑到浏览器的兼容性和性能消耗,确保在特定场景下使用这个特性的合理性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值