Predidit / oneAnime

一款简洁清爽无广告的看番软件。 一款带弹幕的 anime1 第三方客户端,界面符合 Material You 规范。
GNU General Public License v3.0
1.01k stars 21 forks source link

Danmaku enhancements #5

Closed songbirdzz closed 6 months ago

songbirdzz commented 6 months ago

Description

弹幕功能优化&增强,主要包括:

  1. 使用Map代替List存储弹幕,避免每秒对比一次全部弹幕。
  2. 更平滑的弹幕。如果1秒内有5条弹幕,则这5条弹幕会平均分布在1秒内上屏,而不是一下全部上屏。
  3. mediaPlayer封装到playerController中,并使mediaPlayer行为与danmakuController同步。
Predidit commented 6 months ago

对 mediaPlayer 的封装真是杰出的工作。

但是我对弹幕功能的优化有一些不同的看法,根据之前的测试,弹幕相关功能的瓶颈完全在GPU上,合入PR似乎不会有明显的性能提升并增加了复杂度。

可否考虑移除弹幕相关更改,保留对 mediaPlayer 的更改?

songbirdzz commented 6 months ago

改成Map其实算是强迫症,因为原来用List循环+对比时间有点不太优雅,看到danDanmakus在别的地方也没用就改了。另外这么写也让平滑弹幕更好写一点。

Predidit commented 6 months ago

好像是那么回事😂

我已经合并此PR

再次感谢你让这个项目变得更好

Predidit commented 6 months ago

此修改似乎会导致问题,大量弹幕的情况下,会出现弹幕重叠。

是否考虑再提一个PR来更正,或者我来回滚第二点修改?

songbirdzz commented 6 months ago

有视频可以复现吗?我看一下

Predidit commented 6 months ago

随便取一个弹幕量高的动画就可以了,例如上个季度的金属口红,或者更早的 mygo

songbirdzz commented 6 months ago

应该是找到问题了。ns_danmaku中用一个1秒的timer来计算控制信息,和这个PR前用来添加弹幕的timer恰好相同。而现在如果弹幕1在0.9秒时被加入,此时弹幕库中_runTime还没被1秒的timer更新,所以弹幕1就会和在0秒时加入的弹幕的控制信息相同。 此时,如果1秒时有弹幕2加入,弹幕库就会根据_runTime = 0来计算弹幕1位置,根据_runTime = 1来计算弹幕2位置,算出的结果是这两条弹幕并不会重合。但实际上这两条弹幕之间只差了0.1秒,所以会造成重合。

Predidit commented 6 months ago

怎么处理呢,回滚比较好吗,分叉 ns_danmaku 似乎有些不必要。

songbirdzz commented 6 months ago

我fork了一个改了一下。 改依赖也就是改一行的事?不过你的项目你决定吧。

PS. 说起timer,现在video_page的timer里,每秒都会windowManager.addListener(this);一次。应该是个bug? PS2. 我还是希望能改一下的。一方面是原来的库已经基本稳定了,上一个commit已经是10个月前了;另外是弹幕的观看体验确实会变好。

Predidit commented 6 months ago

是的,那是个 bug ,本应该在 init() 里进行。

关于依赖,你可以再提交一个PR,我会合并的。timer 的那个问题,如果你有时间的话就一起改一下,没有的话我稍晚时候提交更改。

Predidit commented 6 months ago

以及关于 ns_danmaku 的性能,这个库的GPU性能不佳,在开启弹幕描边的情况下更明显一些,我的水平有限,尝试过几次更改都没有效果。 我尝试过更改弹幕描边的方法,但原作者的使用 stack 叠加 text 的方法意外地有相对较好的性能。 如果能有更好的解决方法就好了。

songbirdzz commented 6 months ago

性能这个我完全没感觉到,GPU还是太好了( 明天我看看,改dependency的PR也明天提。