Closed lanytcc closed 8 months ago
主循环运行时,调用视频播放器的绘制函数,其内调用 drawDanmaku 绘制弹幕。在 drawDanmaku 中从 danmakuIndex 开始向 danmakuData尾部循环,遇到尾部或者遇到当前时间不需要显示的弹幕则停止循环。下次绘制视频播放器时重复这个过程。
也就是说 弹幕绘制是在主线程里完成的,视频的弹幕都是通过 loadDanmakuData 来加载的,通过 brls::sync([items]() { DanmakuCore::instance().loadDanmakuData(items); });
来执行,也就是说 加载弹幕也放到了主线程里,所以绘制的部分就没有加锁。
我也不记得为什么加载弹幕和初始化要上锁了,应该是不同时期写的代码 当时有别的考虑,后来因为弹幕加载次数比较有限不会影响性能就暂时保留了。
可以先试一下给 addSingleDanmaku 外面用 brls::sync 包裹一下看看效果。
直播中大量激增danmaku会延迟显示,很多弹幕到屏幕中间再显示
不确定是不是
DanmakuCore::instance().addSingleDanmaku
导致的问题,我没看到整个绘制的完整过程。我注意到danmaku_core中的绘制函数并未加锁,其他函数有,是在调用函数的地方加的锁吗?