-
-
Notifications
You must be signed in to change notification settings - Fork 337
Open
Labels
Description
我用弹幕库的时候总是出现内存一直增长,直到网页崩溃,目前我弹幕加载方案是先请求接口拿到所有的弹幕数据,然后监听timeupdate事件去调用弹幕库的load方法追加弹幕,目前测试如果弹幕关掉不显示(timeupdate时间内一样进行弹幕追加)就不会出现内存一直增长的情况
相关代码:
let lastSkipIndex = -1;
let lastDanmuLoadedUntil = -1;
let danmuConfig = {
loadedUntil: 0,
segmentDuration: 10
}
art.on("video:timeupdate", () => {
const currentTime = art.currentTime;
// 弹幕分段加载
let episode_number = "43";
debugger
if (episode_number in allDanmaku) {
let danmuList = allDanmaku[episode_number];
let current = art.currentTime;
if (current >= danmuConfig.loadedUntil) {
// 避免重复加载同一段
if (danmuConfig.loadedUntil === lastDanmuLoadedUntil) return;
lastDanmuLoadedUntil = danmuConfig.loadedUntil;
if (
danmuConfig.loadedUntil === 0 ||
(current - danmuConfig.loadedUntil) > (danmuConfig.segmentDuration * 2)
) {
danmuConfig.loadedUntil = current - 5;
}
const startTime = danmuConfig.loadedUntil;
const endTime = startTime + danmuConfig.segmentDuration;
const startIndex = sortedIndexBy(danmuList, { time: danmuConfig.loadedUntil }, o => o.time);
const segment = danmuList.slice(startIndex).filter(d => d.time < endTime);
if (segment.length) {
art.plugins.artplayerPluginDanmuku.load(segment); // 追加弹幕
}
danmuConfig.loadedUntil = endTime;
}
}
});
function sortedIndexBy(array, value, iteratee) {
if (typeof iteratee !== 'function') {
throw new TypeError('iteratee must be a function');
}
var val = iteratee(value);
var low = 0;
var high = array.length;
while (low < high) {
var mid = (low + high) >>> 1;
// compute ranking for the midpoint element
var midVal = iteratee(array[mid]);
if (midVal < val) {
low = mid + 1;
} else {
high = mid;
}
}
return low;
}
Environment
- Browser: Google Chrome
- Version:136.0.7103.93(正式版本) (64 位)
- Operating System: Windows 11 专业版
- Version: 24H2
- artplayer:5.2.3
- artplayer-plugin-danmuku:5.1.6
Reactions are currently unavailable
