-
Notifications
You must be signed in to change notification settings - Fork 304
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【讨论】Velocity.js 声称能加速JS动画,是否能提升CCL的性能? #13
Comments
看了,现在的问题主要不是播放的时候卡,是突然载入/删除大量弹幕会卡死,这个的话 RAF和硬件加速都没办法。RAF和硬件加速主要是帮助已经在屏幕上的弹幕能流畅的跑(顺便,之前CCL也有过用RAF,现在 对于DOM倒是有一招,就是把高密度弹幕预先载入,比如进入高能段之前,就先行载入弹幕,让 opacity 为 0,然后等时间到了,再放出来,这样均匀的载入弹幕,应该就不会出现卡死状况了。 Profiler上看的话很明显,如果没有弹幕的快速增减,帧数可以稳定在50-60fps。有的话,就直接掉到30fps以下了。 |
明白了。 局部的代码优化,比如把 for(i = 0; i < a.length; i++) 改成 var cache_length = a.length;
for(i = 0; i < cache_length; i++) 是可以提升速度的。 算法方面,是否可以把即将要在同一秒内消失的弹幕放到同一个 wrapper div 里,到时间了把那个 wrapper 给 remove 掉可否? 还有,试试看 不过,预先载入对全程高密度就无效了哇。虽然这样的情形比较少,但是没有足够理由无视这种情形。 |
JS的话其实差不多,而且如果我没记错 length是静态字段。当然现在瓶颈是绘图,所以运算其实本身不太影响。
把它们放到这个DIV里面本身这件事就和都 remove 掉的复杂度差不多了。。。不过相比之下另一个方法是限制每一个周期的remove个数,等几个周期之后再remove掉就可以。(这么一说应该试试)
应该差不多快,因为更改CSS属性本身有一个比较大的代价。还有好像
我觉得全程高密度也没办法了,只能靠限制同屏弹幕。即使B站的Flash播放器全程高能也会卡(旧版,新版不知道,我觉得也会卡吧)。 |
在 2014-5-12,2:55,"Jim Chen" notifications@github.com 写道:
length是一个属性,不是静态的。因为解释器无法保证执行一遍循环体之后length不变,所以不可能帮你缓存。 昨天那个博客我找不到了,但是找到其它一些技巧 http://blog.segmentfault.com/skyinlayer/1190000000490324 |
嘛,实际上没有区别吧,一共同屏也就 <200条弹幕,O什么都是常数水平了。还有 length作为属性也不用O(n)就可以实现的吧,只要每次resize array操作的时候变化相应大小就可以,然后存成指针这样不影响每次循环的读取,每次访问也能是O(1)的。当然IE我不知道,Webkit应该是优化了的,length的getter是普通的读操作,setter倒是O(n)的,因为可以截断Array。 今天Profile了一下,程序本身跑44s的时候,纯运算大概也就是 40ms。当然要是在做后端服务器(nodejs)我倒是能理解提高JS运算效率。 最大头的实际上是是计算DOM的 style,弹幕载入(添加DOM)总运算花了 6s,弹幕载出(删除DOM)总运算花了 4s,运动大概花了 2s。相比于计算和跑array的总(0.04s),差了两个数量级了。可惜这俩重头都没办法,添加DOM里面最耗时的是读取 offsetWidth/offsetHeight,因为会导致浏览器排版去专门计算这个数值(一旦访问过一次之后随后的访问都是瞬间的,因为会缓存(因为CCL会在style里面加入一个 width:固定住宽度))。其次就是添加Style和className设定。删除的时候最耗时的就是删除本身了。 |
我试着预先加载几秒钟的弹幕到一个div 然后删除的时候直接删除div 。 要不就要手动写个根据字符数量算宽度高度的东西了吧 |
手写了根据字符数量计算宽度高度的东西。。。 http://catofes.github.io/CommentCoreLibrary/demo/ |
必然不靠谱。根据字符数量计算是完全不靠谱的。 我的想法是,Webkit 是否会对 iframe 开一个新线程呢?如果那样,在 iframe 里算可以不? |
我不这么认为。 我觉得没有必要需要极其准确的给出弹幕的宽度和高度,因为这两个参数只会影响到弹幕的排布,也就是说如果这两个参数有问题的话最多是导致弹幕之间的不合理重叠或者空白。 而如果大部分都是偏差不大的话牺牲这点得到性能提升我觉得是可以的。 我猜flash中根本就没有像html一样的自动调整布局,原版弹幕播放器估计也是强算的吧。 |
配合 video.js: -感觉没变化。。。。AVG是cpu使用率吗? 完全一致啊在windows下。 linux下还是有区别的欸 |
Flash是可以获得长宽的,不需要强算。
AVG是平均值Average。 |
弹幕密度极限测试的话,可以试试这两个视频: |
left是什么函数?如果你能告诉我我就不去读源码了。 |
DOM.style.left="xxx px" |
极限测试果然叼炸天 |
@jabbany 我叫你用 |
主要是觉得不科学,毕竟left操作数量是一样的,操作函数是一样的,无非就是弹幕多套了一个div层,然后耗时就这么不科学了。。。 对比了一下 起码能播放了~ |
效果一样的,反复通过js改css,改哪个哪个就是瓶颈。问题不在于改那个属性,是改的多频繁。
|
明白了,原来到现在还没有用keyframe或者transition或者animation啊。 |
所以说现在很奇怪,改得频繁数目基本一致,不过消耗的时间大概有5,6倍了 |
应该是诱发reflow了吧。。。我印象里尽量避免reflow的。。。
|
keyframe没法通过js设定,还有根据@chitosai 测试过效果也不好。
|
不过我现在找到了用js停止transition的方法了。 |
animation正在测试,不过根据velocity.js那篇文章的解释,应该不但效果一般,灵活性也不好(主要是暂停问题)
|
对了接一下之前的,avg 是平均处理时间,即每一次刷新的实际耗时,以毫秒记,大于10。影响因素还包括浏览器的整体繁忙程度。max是最大处理时间,卡起来最厉害的一块占用了多久,fps是1000/avg。。。 |
http://catofes.github.io/videojsABdm/demo/jixian.html 实在是欢乐~~ jabbany要不还是按我这样加一个预加载? 对于如上这种及其蛋疼的弹幕还是很有效的? 可以的话我去发pull request |
@Catofes 预加载的话还在研究,你这个是去掉了高度的读取吧。。。好像会产生BUG? |
话说 visibility: hidden 真的无法读取高度么?我知道 display: none 无法读取,但是 visibility: hidden 是会排版的啊。 建议实验一下用一个单独的div来获取宽度高度。原来创建一条弹幕要对几百个元素reflow,现在只需要对一个元素reflow。 |
bilisyndicate主要是搞代码弹幕(Mode8)的。。。但是好像Mode7的高级弹幕竟然也更新了 |
噗,那我再问问,主要B站我认识的码农作息时间和正常人类都不一样,现在联系不到 在 14/7/23,Jim Chennotifications@github.com 写道:
|
是啊是啊。。。我。。。也是个海外时差党呢→_→ |
貌似没录好。。。recordmydesktop 不知道出啥问题了。。。反正正常看的时候没有哪些斜向的撕裂。不过卡顿程度应该可以从视频中看出来。 |
嗯。。。我还以为我的显卡又挂了呢。。。 |
我还有个dev-testing分支正在研究,不稳定,没测兼容性。基本策略是在每一次 感觉有时效率好有时不好的样子,也可能是我机子的问题。。。一直在用chrome的timeline测试,Test 9之前可以全程60fps(包括各种彩虹的添加删除),可是后来跑了一次就还是会出现阶段性掉到30fps以下,所以不知道是什么在影响。 |
这个录的就是 dev-testing 分支啊? 不过真的没有搞明白dev分支的各种黑科技。大概看了看貌似定时器还在?然后改动的是css? 在 2014年7月23日 下午2:11,Jim Chen notifications@github.com写道:
乔颢 Catofes浅草、洛水、冉枝。 GPG 公钥:http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xAF1EF10EDE6EA2EC |
哦。。。。原来如此。。。话说锯齿实在是挺严重。。。 |
那是录屏软件的问题。。。。不知道为啥会出这问题。。。 不过现在感觉弹幕还原效果和Bili站上似乎也有一点区别,不过这种极限情况估计也没可能遇到的~ 2014-07-23 14:34 GMT+08:00 Jim Chen notifications@github.com:
乔颢 Catofes浅草、洛水、冉枝。 GPG 公钥:http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xAF1EF10EDE6EA2EC |
嗯,
|
写这个库的时候到现在B站播放器至少改版了两次(其中一次更新了弹幕排布算法)。。。CCL一直没改版,所以逐渐就不一样起来了,倒是兼容旧的弹幕兼容的比新版B站播放器要稍微好一些。。。 |
试着用Canvas处理横向普通弹幕,感觉效率提高了不少啊~~ 起码在移动设备上观看压力不是那么大了。 测试如下:N5 不过因为没有其他摄像设备,所以录屏会带来一定的卡顿。然后对比的是现在的gh-pages分支。不知道有没有上黑科技~~ 以及另外一组测试: |
/******************** 出现了以下坑爹的情况。Canvas绘制文字的效率不是那么的高,但是他绘制文字边框的效率更差。于是乎,没有文字边框的时候。IE流畅的不得了,serface pro cpu占用超低,然后绘制边框cpu就从18%-》40%。。。原来的只有25%左右啊。 然后更奇葩的是。Chrome各种黑科技,也在Surface Pro上测试 18%左右的cpu占用。。。 总之现在勉强能用,可以看看有没有更好的性能改进。 其次排版估计还要调整,尤其是有换行的排版。简直不能看。 换了一种buffer的方式,现在IE怒干沉chrome~ cpu占用低于10% , 23333累死我了。 不过bug估计还是一堆。。。 代码:https://github.com/catofes/CommentCoreLibrary/tree/gh-pages |
@Catofes http://catofes.github.io/videojsABdm/demo/jixian2.html 此弹幕如此高密居然很流畅啊,这些改进有无合并到主线的? |
@insionng jixian2主要是把滚动弹幕放到了canvas里面(canvas是直接绘图、渲染的速度几乎不受弹幕数量的影响,但是为此也要有一些牺牲。) 最新版本的CCL支持多源渲染了,合并到主线应该会容易很多。要是 @Catofes 有兴趣可以试试,只要做一个 个人设想CCL里面还可以加一点逻辑判断:比如如果同屏弹幕密度高于某某数值的话就开始写到 canvas 里面而不再使用DOM,当数量降低了就回到用DOM。因为有抽象弹幕对象,所以空间规划器内两种弹幕还依然可以一起规划,不会冲撞。 至于 DOM 弹幕本身,现在也有设想把 |
@jabbany 你好啊..目前感觉你开了非常多的探索路线,这么多分支路线会不会让你精力过分分散了? 昨天一晚都在测你们两人的不同版本,发现在高密弹幕下,官方版出现几次卡顿,但jixian2居然很流畅,偶尔会出现一下,但一下就过去了,估计是那个弹幕的确太高能,谁都无法幸免. 对于普通用户而言,他们可能分辨不出这两个库之间的实现方式牺牲了什么,只是知道哪个不卡哪个会卡.哪个兼容性好哪个兼容性不好. 以上是肺腑之言.. 另外有个疑问,弹幕读取的是一个弹幕xml文件,我疑惑的地方是,如果我发送弹幕,弹幕是服务器收到后写入这个文件吗?然后,播放器应该也无法实时的显示出刚刚发送的弹幕吧? 我应该怎么一个思路去做才能让弹幕也是实时显示出来? 目前是videojs+CommentCoreLibrary |
赞! 新版本出现了? 我去试试看。 现在的canvas渲染是有牺牲的,牺牲了还原的精确度。我觉得多试试看调整之后效果估计会更好。
|
啊对。一般电脑都足以应付普通弹幕。 canvas版本实际上是想用于移动设备的。 毕竟cpu占用少可能省些电而且流畅。
|
@Catofes 噢明白了,你也好早啊...用于移动设备这个考虑很好,我的小站目前也是对移动端也有自适应,要是用canvas版,那么两个平台播放都没问题了. |
@Catofes 对了,顺便请教你一个问题,知道videojs播放器怎么连续播放2个或以上的视频?譬如优酷的视频有些是分成几段落的. |
考虑过 , 估计无解。。。。 除非完全手写。。
|
其实CCL的基础方向是兼容性、还原度和简便性,所以每个 release 都是会保证不能降低兼容性和还原度的前提做的 。master 分支的代码一般不轻易更新,更新后也会留一个缓冲期让大家测试BUG再发 Release 推到 NPM跟Bower目录里面。鉴于此,在近期 CCL 的 master实现都会采取主要以 DOM 为主的还原度优先开发模式。 每一个release都要经过相当的回退测试,尽量保证不会比前一个版本在兼容性和还原性上差,所以可以放心用。 与此同时,新的技术总要尝试,包括DOM带来的性能问题也要解决,所以 Canvas版本也在研发、CSS3版本也在尝试,等解决了Canvas 的弹幕高度检测BUG后,等解决了CSS3的暂停和跨浏览器限制后,新的效率高的技术就会代替旧的纯DOM技术。新的技术有的时候会让以前渲染的挺好的东西坏掉,有时二次开发可能希望牺牲还原度或者兼容性来换取效率优势,那么就可以尝试其他的 有关实时弹幕实时弹幕实际上是开放支持的,但是不是通过默认的 load 。目前版本可以动态 insert() 弹幕或者直接更改timeline。当插入的弹幕时间上在播放时间之后,那么当播放到那个时间的时候,新的弹幕就会出来。刚刚发出的弹幕可以通过 sendComment (或者在未来 实时弹幕因为没有服务器所以不能demo,但是二次开发添加支持的难度并不高,而且我也不想用一个现成的实现束缚使用者。毕竟实时弹幕的实现方法非常丰富,而且各种方法都有优劣。。。 |
@insionng 分段视频估计要在ActionScript里面改api了,不然时间轴都对不上…… |
@aptx4869 哪里来的ActionScript...videojs播放器是html5类型的哦..现在我找到一个videojs的playlist插件,目前几个视频片段可以连续播放了,的确时间轴对不上,要研究下怎么解决这问题. |
@insionng |
@jabbany 现在多源渲染是在哪个分支啊? |
我觉得我现在已經看不懂代码了。。。。 src文件夹里好多东西啊 |
现在还没写多源渲染呢,但是已经可以支持了。 |
状态更新+合并 Issue。以下是目前各个优化方案的优缺点和有待解决的问题。:
这条先close掉,新的非CSS3/Canvas的优化方法欢迎新开 |
丢个文章吧,文章结尾有介绍。
《CSS 和 JS 动画哪个更快》
julianshapiro/velocity 的简介是加速 JavaScript 动画,是不是真的能加速 JavaScript 动画呢?
不过我想 velocity.js 应该能自动开启硬件加速并且不需要因为 vendor prefix 而头疼了。
The text was updated successfully, but these errors were encountered: