javascript - 渲染大量线条的 React-konva 缓慢拖动性能
问题描述
在 React-konva 中有大量渲染线时,我遇到了拖动功能的问题。
目前我正在映射Array.apply(null, Array(10000))
以水平渲染线条。然而,与拖过一个只有 500 行的数组相比,它是非常滞后的。
我准备了codesandbox来说明这个问题: https ://codesandbox.io/s/dazzling-hooks-0xc4s?file=/src/App.js
(水平拖动鼠标查看效果)
任何如何解决此问题的想法将不胜感激。
解决方案
好吧,你只是有太多的形状。浏览器正在做很多工作,将它们全部呈现出来。有很多方法可以提高 Konva 的性能。
第一种方法是不渲染不可见视口的对象:
export default function App() {
const [camera, setCamera] = React.useState({ x: 0, y: 0 });
const handleDragEnd = (e) => {
setCamera({
x: -e.target.x(),
y: -e.target.y()
});
};
return (
<div>
<Stage
width={window.innerWidth}
height={500}
draggable
onDragEnd={handleDragEnd}
>
<Layer>
{Array.apply(null, Array(10000)).map((_, i) => {
const x = i * 30;
const isOut =
x < camera.x - window.innerWidth ||
x > camera.x + window.innerWidth * 2;
if (isOut) {
return null;
}
return (
<>
<Line
perfectDrawEnabled={false}
x={i * 30}
y={50}
points={[0, 600, 0, 0, 0, 0, 0, 0]}
stroke="black"
/>
<Text
x={i * 30}
perfectDrawEnabled={false}
y={30}
text={i.toString()}
fill="black"
/>
</>
);
})}
</Layer>
</Stage>
</div>
);
}
演示:https ://codesandbox.io/s/react-konva-simple-windowing-render-10000-lines-2hy2u
推荐阅读
- javascript - VueJs,模板,v-bind,嵌入 html
- angular - 将 Angular 的 FormBuilder 与异步代码(Observables)结合起来
- c - getopt_long.c中宏定义“__P”的作用是什么
- android - 无法从 Android 中的信令服务器接收冰候选
- sql - The difference between a certain date and today date is 200 excluding the weekend
- python - 在共享的 Windows Gitlab 运行器上使用 Python
- android - Android MediaCodec recording produces a video which cannot be played on huawei
- android - Can Android app links work with an app installed under app profile?
- node.js - Morgan dev pretermined Format Broken
- javascript - How to simulate the opening of the second tab in a browser and test the behavior of a react component in jest