weizhenye/Danmaku

关于在domEngine和canvasEngine方法中遍历runningList的疑问

lynxerzhang opened this issue · 2 comments

/* eslint no-invalid-this: 0 */
var domEngine = function() {
  var dn = Date.now() / 1000;
  var ct = this._hasMedia ? this.media.currentTime : dn;
  var pbr = this._hasMedia ? this.media.playbackRate : 1;
  var cmt = null;
  var cmtt = 0;
  var i = 0;
  for (i = 0; i < this.runningList.length; i++) {
    cmt = this.runningList[i];
    cmtt = this._hasMedia ? cmt.time : cmt._utc;
    if (ct - cmtt > this.duration) {
      this.stage.removeChild(cmt.node);
      /* istanbul ignore else */
      if (!this._hasMedia) {
        cmt.node = null;
      }
      this.runningList.splice(i, 1);
    }
  }

你好,在查看代码的过程中有一个疑问,上面代码段中对runningList进行循环判断并删除指定元素,遍历中调用splice方法会导致runningList.length产生变化,可能导致后继的判断删除问题。

如下从最后一个元素开始判断则可以避免

for (i = runningList.length - 1; i >= 0; i--) {
    //......
    this.runningList.splice(i, 1);
}

请查看是否存在该问题?

确实,删除一个元素后,会跳过该元素后一个元素判断。

不过由于这里是删除已出屏的弹幕,漏删对实际效果没什么影响,下一个 frame 就会删掉了。

你愿意的话可以发一个 PR,也可以晚点我改一下。

好的,我发了一个PR,修改了engine目录下的canvas.js和dom.js,请查看是否符合要求。