Skip to content

Conversation

@xiaoQQya
Copy link

增加渲染模式参数配置,默认 default 模式,支持 default、adaptive 两种模式。

  • default 模式:所有弹幕立即渲染,不进行碰撞检测。
  • adaptive 模式:当弹幕铺满屏幕时,丢弃可能发生碰撞的弹幕。
var danmaku = new Danmaku({
  container: document.getElementById('my-container'),
  media: document.getElementById('my-media'),
  comments: [],
  engine: 'canvas',
  speed: 144,

  // 默认为 default,支持 default、adaptive。
  // default 模式:所有弹幕立即渲染,不进行碰撞检测。
  // adaptive 模式:当弹幕铺满屏幕时,丢弃可能发生碰撞的弹幕。
  mode: 'default'
});

该修改主要为了解决下游应用仓库 dd-danmakuchen3861229/dd-danmaku#57 问题,也看到了作者您在 chen3861229/dd-danmaku#6 (comment) 指出当超出一屏后取模进行重叠渲染是有意设计,所以此处将是否重叠渲染做成了参数配置的形式,默认取模重叠渲染。

如果作者觉着此 PR 不合适的话,可以直接关闭该 PR,最后感谢作者开源该弹幕库。

@weizhenye
Copy link
Owner

我在这里有提到,倾向于弹幕的过滤限流逻辑由开发者自行决策,这个大方向我目前还是这么认为的。但就目前 Danmaku 提供的能力,可能要做到这些逻辑会比较复杂。所以增加某种能力来简化,我觉得是可以的。

针对弹幕过多的问题,可以有一些处理方案:

  • 超出一屏(或指定屏数,弹弹 Play 的堆叠层数上限)后丢弃
  • 相同文本合并增加计数,如 谁问你了 x233
  • 延时展示

这个 PR 当前的配置形式仅满足了其中一种处理方案,我感觉有点局限,我希望是某种更通用的方案,例如:

const MAX_OVERLAP = 1;
const container = document.getElementById('my-container');

const danmaku = new Danmaku({
  // ...

  onRender(comment, runningList) {
    // 超出一屏后丢弃的逻辑
    if (comment.y > container.offsetHeght * MAX_OVERLAP) {
      return null;
    }
    // 或者合并的逻辑
    const mergeableCommemt = runningList.find((cmt) => cmt.text === comment.text);
    if (mergeableCommemt) {
      mergeableCommemt._count += 1;
      mergeableCommemt.node.lastChild.textContent = `x${mergeableCommemt._count}`;
      return null;
    }
    // 或者延时的逻辑
    if (comment.y > container.offsetHeght) {
      // 这里可能单纯修改时间不太好实现
      comment.time += 1;
      return comment;
    }
    // 正常渲染的逻辑
    return comment;
  },
});

上面只是这个能力形态的示意,大致方向是提供必要的上下文,支持开发者自行写逻辑来决定实际渲染内容。

但是这种方式会暴露的接口面比较大,具体接口设计比较让人纠结。感觉需要先梳理各种可能的过滤限流方案,除了上面列出来的三种还有没有其他的,然后整体一起考虑。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants