canvas-nest.js icon indicating copy to clipboard operation
canvas-nest.js copied to clipboard

CPU占用略大 & 抖动的问题

Open chenxuuu opened this issue 9 years ago • 36 comments

chenxuuu avatar Dec 19 '15 05:12 chenxuuu

可以按照情况配置count数量,当然越大就越耗费了。

hustcc avatar Dec 21 '15 08:12 hustcc

小了效果不好。。。大了占用高= =

chenxuuu avatar Dec 21 '15 10:12 chenxuuu

这个确实是问题,不过在这种canvas动画,都会有这样的问题。你那边有比较好的解决方案吗?

hustcc avatar Dec 21 '15 10:12 hustcc

http://www.html5rocks.com/en/tutorials/canvas/performance/ 这个参考下?

chenxuuu avatar Dec 21 '15 10:12 chenxuuu

这个文章之前看过翻译版本,按照这个进行优化,在我的电脑上,可以把cpu从20降到15,但是动画的效果会差很多。

hustcc avatar Dec 21 '15 11:12 hustcc

可以看看其他相关canvas的优化,或着从代码中寻找优化,减少计算量的方法,欢迎讨论和pr~

hustcc avatar Dec 21 '15 13:12 hustcc

当鼠标点不动的时候,线连的多的时候,抖动太明显了,是可有方法可以减少抖动

git-lt avatar Jul 20 '16 12:07 git-lt

@git-lt 之前没有 watch 这个项目,一直没有看到这个回复,我抽时间看看这个问题。

hustcc avatar Dec 12 '16 11:12 hustcc

@hustcc 同问抖动的问题。。

beiping96 avatar Dec 16 '16 06:12 beiping96

抖动问题很尴尬23333

yumy-wang avatar Jun 25 '18 01:06 yumy-wang

抖动问题其实还好,可以当做 feature,如果有大牛能解决的,欢迎 pr。

hustcc avatar Jun 25 '18 01:06 hustcc

当做feature hhhhh,你是苹果吗

chenxuuu avatar Jun 25 '18 01:06 chenxuuu

是的,苹果!

hustcc avatar Jun 25 '18 01:06 hustcc

抖动问题解决终极办法:去掉窗体的鼠标监听事件www

stefenson avatar Jun 25 '18 02:06 stefenson

哦对,还有个方法是把点聚集收缩的部分逻辑去掉,nest.min.js里面对应着一段:

i.x-=0.01*B,i.y-=0.01*z

0.01应该是被我修改过了,把它改成0,去掉粘附加速就不抖动了233。

stefenson avatar Jun 25 '18 02:06 stefenson

加速效果还是需要的!可以做成如果达到稳定的距离,就不计算了,这样也可以提高计算的性能!

hustcc avatar Jun 25 '18 02:06 hustcc

喂喂这是两年前的issue,我的Outlook一直在弹窗😂

chenxuuu avatar Jun 25 '18 02:06 chenxuuu

@chenxuuu 两年半之后,重构一把,关闭十几个 issue,唯独这个还是关不掉,哈哈!

hustcc avatar Jun 25 '18 03:06 hustcc

被我唤醒了2333333

yumy-wang avatar Jun 25 '18 05:06 yumy-wang

我貌似搞定了……刚好今天上午公司事少就自己想了想这个问题。 基本思路:记录一个加速度变量,加速度的方向和取值根据到鼠标点的距离计算,然后点位置重绘方法放到后面,重新计算位置时加上加速度就好了。

主要是这几处:

t.forEach(function(i){
    for(v=0;v<w.length;v++){
        x=w[v];
        savex=null;
        if(i!==x&&null!==x.x&&null!==x.y){
            B=i.x-x.x,
            z=i.y-x.y,
            prex=i.x+i.xa-x.x,
            prey=i.y+i.ya-x.y;
            y=B*B+z*z;
            if (x===f) {
                if(y<x.max) {
                    i.xd=(Math.abs(prex) > Math.abs(B) ? -1 : 1)*y/x.max*2*i.xa,
                    i.yd=(Math.abs(prey) > Math.abs(z) ? -1 : 1)*y/x.max*2*i.ya;
                } else {
                    i.xd=0;i.yd=0;
                }
            }
            if(y<x.max){
                A=(x.max-y)/x.max,e.beginPath(),e.lineWidth=A/2,e.strokeStyle="rgba("+s.c+","+(A+0.2)+")",e.moveTo(i.x,i.y),e.lineTo(x.x,x.y),e.stroke();
            }
        }
    }
    i.x+=i.xa+i.xd,
    i.y+=i.ya+i.yd,
    i.xa*=i.x>r||i.x<0?-1:1,
    i.ya*=i.y>n||i.y<0?-1:1;
    e.fillRect(i.x-0.5,i.y-0.5,1,1);
    w.splice(w.indexOf(i),1)
}),

点的结构体里面添加xd,yd定义:

t.push({x:h,y:g,xa:q,ya:d,xd:0,yd:0,max:6000})

不过我的博客是拿min版本用的,非min版本的话应该位置差不多,找一下就好啦 ^_^)/

具体效果可以查看stefenson.github.io

人家才不会说这是顺便给自己blog打广告呢

stefenson avatar Jun 25 '18 05:06 stefenson

@stefenson 大牛 Pr 上来吧!代码尽量优美一点咯~

还可以在 readme 中把你的博客加进来!

hustcc avatar Jun 25 '18 05:06 hustcc

@stefenson 都是大佬,我只会反馈问题不会修

chenxuuu avatar Jun 25 '18 08:06 chenxuuu

抖动的问题我最近试着解决了一下,目前达到的效果是到达鼠标半径的点,停止运动,也就不再抖动。 但考虑到还有一种效果,就是到达鼠标半径的点,围绕鼠标做圆周运动,而不是内外的抖动,但也不停止运动,不知道最终要做成哪种效果?

flyerH avatar Oct 15 '18 10:10 flyerH

我貌似搞定了……刚好今天上午公司事少就自己想了想这个问题。 基本思路:记录一个加速度变量,加速度的方向和取值根据到鼠标点的距离计算,然后点位置重绘方法放到后面,重新计算位置时加上加速度就好了。

主要是这几处:

t.forEach(function(i){
    for(v=0;v<w.length;v++){
        x=w[v];
        savex=null;
        if(i!==x&&null!==x.x&&null!==x.y){
            B=i.x-x.x,
            z=i.y-x.y,
            prex=i.x+i.xa-x.x,
            prey=i.y+i.ya-x.y;
            y=B*B+z*z;
            if (x===f) {
                if(y<x.max) {
                    i.xd=(Math.abs(prex) > Math.abs(B) ? -1 : 1)*y/x.max*2*i.xa,
                    i.yd=(Math.abs(prey) > Math.abs(z) ? -1 : 1)*y/x.max*2*i.ya;
                } else {
                    i.xd=0;i.yd=0;
                }
            }
            if(y<x.max){
                A=(x.max-y)/x.max,e.beginPath(),e.lineWidth=A/2,e.strokeStyle="rgba("+s.c+","+(A+0.2)+")",e.moveTo(i.x,i.y),e.lineTo(x.x,x.y),e.stroke();
            }
        }
    }
    i.x+=i.xa+i.xd,
    i.y+=i.ya+i.yd,
    i.xa*=i.x>r||i.x<0?-1:1,
    i.ya*=i.y>n||i.y<0?-1:1;
    e.fillRect(i.x-0.5,i.y-0.5,1,1);
    w.splice(w.indexOf(i),1)
}),

点的结构体里面添加xd,yd定义:

t.push({x:h,y:g,xa:q,ya:d,xd:0,yd:0,max:6000})

不过我的博客是拿min版本用的,非min版本的话应该位置差不多,找一下就好啦 ^_^)/

具体效果可以查看stefenson.github.io

人家才不会说这是顺便给自己blog打广告呢

请教一下,关于动画速度怎么能修改呢~谢谢大佬~

ShellyCoder avatar Apr 18 '19 11:04 ShellyCoder

我貌似搞定了……刚好今天上午公司事少就自己想了想这个问题。 基本思路:记录一个加速度变量,加速度的方向和取值根据到鼠标点的距离计算,然后点位置重绘方法放到后面,重新计算位置时加上加速度就好了。 主要是这几处:

t.forEach(function(i){
    for(v=0;v<w.length;v++){
        x=w[v];
        savex=null;
        if(i!==x&&null!==x.x&&null!==x.y){
            B=i.x-x.x,
            z=i.y-x.y,
            prex=i.x+i.xa-x.x,
            prey=i.y+i.ya-x.y;
            y=B*B+z*z;
            if (x===f) {
                if(y<x.max) {
                    i.xd=(Math.abs(prex) > Math.abs(B) ? -1 : 1)*y/x.max*2*i.xa,
                    i.yd=(Math.abs(prey) > Math.abs(z) ? -1 : 1)*y/x.max*2*i.ya;
                } else {
                    i.xd=0;i.yd=0;
                }
            }
            if(y<x.max){
                A=(x.max-y)/x.max,e.beginPath(),e.lineWidth=A/2,e.strokeStyle="rgba("+s.c+","+(A+0.2)+")",e.moveTo(i.x,i.y),e.lineTo(x.x,x.y),e.stroke();
            }
        }
    }
    i.x+=i.xa+i.xd,
    i.y+=i.ya+i.yd,
    i.xa*=i.x>r||i.x<0?-1:1,
    i.ya*=i.y>n||i.y<0?-1:1;
    e.fillRect(i.x-0.5,i.y-0.5,1,1);
    w.splice(w.indexOf(i),1)
}),

点的结构体里面添加xd,yd定义:

t.push({x:h,y:g,xa:q,ya:d,xd:0,yd:0,max:6000})

不过我的博客是拿min版本用的,非min版本的话应该位置差不多,找一下就好啦 ^_^)/ 具体效果可以查看stefenson.github.io 人家才不会说这是顺便给自己blog打广告呢

请教一下,关于动画速度怎么能修改呢谢谢大佬

我上条回复就是这么做的,做完后感觉静止还不如抖动的效果好,就想着让点做圆周运动,但要计算圆周加速度方向,就一直懒得做,你有兴趣可以这么改改 动画速度应该是修改初始时的加速度

flyerH avatar Apr 18 '19 13:04 flyerH

这个 js 在很多个人网站上如同挖矿脚本一样占用cpu/gpu,烧电脑浏览器,费电! 可以用 ublock/adblock plus等禁止加载,如下写规则:

*/canvas-nest.min.js$script
*/canvas-nest.js$script

Justsoos avatar Feb 06 '20 21:02 Justsoos

这个 js 在很多个人网站上如同挖矿脚本一样占用cpu/gpu,烧电脑浏览器,费电! 可以用 ublock/adblock plus等禁止加载,如下写规则:

*/canvas-nest.min.js$script
*/canvas-nest.js$script

mac电脑只能这么干,否者容易炸了

warmonipa avatar Sep 29 '20 02:09 warmonipa

一个特效,变成了网络噩梦(´・_・`)

hustcc avatar Sep 29 '20 14:09 hustcc

近期写了个类似的替代性专案,从基本上舍弃了爆搜,改用chunks与draw buffer解决掉大部分的效能瓶颈。 目前还不是很完整,但核心代码写好了。 https://github.com/phantom0174/canvas-nice.js

phantom0174 avatar Feb 20 '23 16:02 phantom0174

您好,我最近正在休假中,无法亲自回复您的邮件。我将在假期结束后,尽快给您回复。

wufujie2000 avatar Feb 20 '23 16:02 wufujie2000