我们直播间有聊天和送礼的功能,
当有大量的聊天消息短时间出现时,会导致整个直播间卡顿,下面的功能按钮点击无反应,过一段时间才有反应,且十分卡顿
page({ data: { chatMsg: [] // 存放聊天消息的数组 } }) |
目前我的做法是:
添加消息到data中的消息数组时,setData只更新新消息部分:
this .setData({ [`chatMsg[${len}]`]: val }) |
而setData的频率也有限制,在有大量消息过来的时候,我这边限制1s才setData一次,但这一次setData的数据可能有几十条:
this .setData({ [`chatMsg[3]`]: val, [`chatMsg[4]`]: val, [`chatMsg[5]`]: val, [`chatMsg[6]`]: val, [`chatMsg[7]`]: val, [`chatMsg[8]`]: val, . . . [`chatMsg[99]`]: val }) |
在这些大量消息涌进来的时候,我点击直播间底部的聊天按钮,礼物按钮都是点击无反应。等这些大量消息停止涌入时,我的点击才有反应
请教下官方和其他朋友们,如何优化这部分呢?做到即使大量消息进来,也不会把直播间卡死操作不了
待确定的方案:
需不需要在data的chatMsg已经有大量数据后,删除一部分早期的数据?
因为我增加数据是单条的setData,不是setData整个数组,是不是代表逻辑层只会传变化的数据过去渲染,这样即使早期有很多数据也不影响?
....
测试了下如果把chatMsg中的早期消息进行清除,然后再setData,两者的卡顿情况时不同的。如果每次都是把chatMsg整个数组进行setData, 同时保证chatMsg数组长度最多6条,这时候来大量消息时,会好很多,可以点开下面的功能栏,但也是稍微有些卡顿延迟。
是不是说明即使我们对数组中的某一个元素进行setData更新时,逻辑层也是把整个数组数据传到渲染层,然后渲染层也是渲染了整个数组数据?
分享一下吱呀语音直播小程序的一些优化经验:
1、评论只保持最新的若干条(我是200),每次concat新消息的时候,把超出的旧item丢弃;
2、做好节流:缓存最新列表,在内存中可以随时concat得到最新列表,但是控制好setData的频率,比如固定1s执行一次;
3、合并setData操作,你页面肯定不止评论需要调用setData,建议把同一时刻的多个更新操作合并为一次,比如评论concat完成之后,scroll-view还要更新scroll-into-view的值,这两个可以合并;
4、key不要用index,用id;
5、待补充……
做到固定的频率,控制定量的更新,肯定不会卡的,更何况我当时直播间还要实现很多特效。。。
年前的项目了,优化做了很多而且持续在做,不过我现在已经不在那个团队,只能回想起这么多,希望有帮助。