xfangfang / wiliwili

第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上
https://xfangfang.github.io/wiliwili
GNU General Public License v3.0
3.03k stars 146 forks source link

Bug: A large number of danmaku will be displayed with delay during the live broadcast #219

Closed lanytcc closed 8 months ago

lanytcc commented 8 months ago

直播中大量激增danmaku会延迟显示,很多弹幕到屏幕中间再显示

不确定是不是DanmakuCore::instance().addSingleDanmaku导致的问题,我没看到整个绘制的完整过程。我注意到danmaku_core中的绘制函数并未加锁,其他函数有,是在调用函数的地方加的锁吗?

xfangfang commented 8 months ago

主循环运行时,调用视频播放器的绘制函数,其内调用 drawDanmaku 绘制弹幕。在 drawDanmaku 中从 danmakuIndex 开始向 danmakuData尾部循环,遇到尾部或者遇到当前时间不需要显示的弹幕则停止循环。下次绘制视频播放器时重复这个过程。

也就是说 弹幕绘制是在主线程里完成的,视频的弹幕都是通过 loadDanmakuData 来加载的,通过 brls::sync([items]() { DanmakuCore::instance().loadDanmakuData(items); }); 来执行,也就是说 加载弹幕也放到了主线程里,所以绘制的部分就没有加锁。

我也不记得为什么加载弹幕和初始化要上锁了,应该是不同时期写的代码 当时有别的考虑,后来因为弹幕加载次数比较有限不会影响性能就暂时保留了。

可以先试一下给 addSingleDanmaku 外面用 brls::sync 包裹一下看看效果。