fabricjs - 如何使在fabric js中对多个对象应用过滤器不那么滞后?
问题描述
我有大约 10 个可以应用过滤器的对象,以及一个过滤器引擎,它一个一个地遍历它们并将过滤器应用于每个对象。
import { fabric } from 'fabric'
const filters = {
brightness: new fabric.Image.filters.Brightness(),
premade: new fabric.Image.filters.ColorMatrix(),
}
const addFilter = (canvas, index, value = null) => {
let pickedFilter
let objects = canvas.getObjects()
switch (index) {
case 1:
pickedFilter = sepia
break;
case 8:
pickedFilter = brightness
break;
default:
break;
}
objects.forEach((o) => {
if (o.filters) {
if (!o.filters[0]) {
o.filters.push(filters.brightness)
o.filters.push(filters.premade)
}
pickedFilter(o, value)
}
});
canvas.renderAll();
}
export default addFilter
function sepia(o){
let value = [
0.67, 0, 0, 0, 0,
0, 0.54, 0, 0, 0,
0, 0, 0.4, 0, 0,
0, 0, 0, 1, 0
]
delete filters.contrast.contrast
delete filters.premade.matrix
filters.premade.matrix = value
o.applyFilters()
}
function brightness(o, value) {
value = (value / 100) / 2
filters.brightness.brightness = value
o.applyFilters()
}
最初,当对象在过滤器 [0] 处没有过滤器时,我继续推进过滤器。
稍后当用户像这个 gif那样移动滑块时,我会遍历每个对象,如果它可以有过滤器,我会继续更改过滤器的值,然后应用过滤器。如您所见,它有点滞后,我认为最大的问题是过滤器应用于多个对象。
在这个 gif 中,我去掉了除一个之外的所有对象,我觉得性能更好,但问题是我需要将过滤器应用于所有对象。
我尝试只在过滤器函数中运行代码一次(例如,我将值分配、删除先前值和值分配放在 sepia 函数内、循环外),但它没有改变任何东西。
我怎样才能提高性能并减少延迟?
解决方案
推荐阅读
- r - 如何仅在特定类型的列上使用 select() 而不会丢失其他类型的列?
- php - $GLOBALS 没有得到预期的数据
- java - JDBC:如何读取 MySQL 点格式
- android - Android:对话框首选项中的自定义字体
- content-management-system - CrafterCMS:如何在应用程序上下文 bean 中使用 Crafter 引擎属性?
- mysql - 一种对 SQL 语句进行分组、求和和计算的更有效方法
- oracle - 如何避免 SQL*Plus 在退出时提交
- python - 在文本的两种颜色之间交替
- php - 使用内连接查询在 1 中显示 2 表
- drupal-8 - Drupal 8:在配置页面上创建自定义面板(选项卡)