HJDanmakuDemo icon indicating copy to clipboard operation
HJDanmakuDemo copied to clipboard

sendDanmakus:弹幕显示不出

Open Archer353 opened this issue 5 years ago • 19 comments

  • (void)sendDanmakus:(NSArray<HJDanmakuModel *> *)danmakus; 从远端返回数据后,用prepareDanmakus:很多都不显示,只显示一小部分; 看到sendDanmakus的说明后(you should call -sendDanmakus: instead of -sendDanmaku:forceRender: to send the danmakus from a remote servers)用了一下这个,结果发现一个弹幕也不出来,发送弹幕也不出现,感觉像是堵塞了一样,请问是什么原因呢?

Archer353 avatar Feb 27 '19 03:02 Archer353

你是直播还是视频场景?prepareDanmakus是在开始之前start开始调用,预加载数据的,如果是直播场景,start之后再从服务器拉取数据,直接调用sendDanmakus即可,至于很多数据不显示是因为弹幕显示原则是相互不碰撞,如果短时间内,弹幕数据过多,肯定会有丢失的

panghaijiao avatar Feb 27 '19 03:02 panghaijiao

HJDanmakuConfiguration对象里面有个tolerance属性,表明一个弹幕从收到到显示的冗余时间,默认2s,意思是如果2s内还是没有多余空间显示就会过滤掉

panghaijiao avatar Feb 27 '19 03:02 panghaijiao

你是直播还是视频场景?prepareDanmakus是在开始之前start开始调用,预加载数据的,如果是直播场景,start之后再从服务器拉取数据,直接调用sendDanmakus即可,至于很多数据不显示是因为弹幕显示原则是相互不碰撞,如果短时间内,弹幕数据过多,肯定会有丢失的

谢谢解答,用您说的方式解决了不显示的问题,用的这个方法: [self.danmakuView prepareDanmakus:[NSArray array]]; [self.danmakuView sendDanmakus:danmakuModels]; 还有一个问题想请教一下,就是sendDanmakus:时,有时会send两次重复数据,这时怎么把上一个的重复数据清除呢?用reset的话,界面弹幕会clean一下,有没有不clean的清除方式呢?

Archer353 avatar Feb 27 '19 05:02 Archer353

HJDanmakuConfiguration对象里面有个tolerance属性,表明一个弹幕从收到到显示的冗余时间,默认2s,意思是如果2s内还是没有多余空间显示就会过滤掉

还有一个问题想请教一下,就是sendDanmakus:时,有时会send两次重复数据,这时怎么把上一个的重复数据清除呢?用reset的话,界面弹幕会clean一下,有没有不clean的清除方式呢?

Archer353 avatar Feb 27 '19 06:02 Archer353

弹幕库不涉及业务逻辑,暂时没有清除逻辑,你应该从设计上杜绝重复逻辑。此外,你也可以考虑- (BOOL)danmakuView:(HJDanmakuView *)danmakuView shouldRenderDanmaku:(HJDanmakuModel *)danmaku这个接口,控制要不要显示某些弹幕

panghaijiao avatar Feb 27 '19 07:02 panghaijiao

弹幕库不涉及业务逻辑,暂时没有清除逻辑,你应该从设计上杜绝重复逻辑。此外,你也可以考虑- (BOOL)danmakuView:(HJDanmakuView *)danmakuView shouldRenderDanmaku:(HJDanmakuModel *)danmaku这个接口,控制要不要显示某些弹幕

因为是分段从服务器加载弹幕,所以来回切换播放时间的话,会重新再返回某一段的数据,如果能清除老数据,只用sendDanmakus:加载新返回的数据就好了。你刚刚建议的shouldRenderDanmaku是想在这个方法里把重复的弹幕给去除掉吗?

Archer353 avatar Feb 27 '19 07:02 Archer353

弹幕库不涉及业务逻辑,暂时没有清除逻辑,你应该从设计上杜绝重复逻辑。此外,你也可以考虑- (BOOL)danmakuView:(HJDanmakuView *)danmakuView shouldRenderDanmaku:(HJDanmakuModel *)danmaku这个接口,控制要不要显示某些弹幕

或者有没有清除逻辑的建议,我该如何添加进去

Archer353 avatar Feb 27 '19 07:02 Archer353

如果弹幕数量没那么大,可以把api返回弹幕都存起来,拉新数据时,先过滤一遍再sendDanmakus

panghaijiao avatar Feb 27 '19 07:02 panghaijiao

如果弹幕数量没那么大,可以把api返回弹幕都存起来,拉新数据时,先过滤一遍再sendDanmakus

这样的确可以解决重复问题,不过我也不清楚弹幕大不大,多了会很耗性能,我尝试在sendDanmakus:前执行了self.danmakuAgents = [NSMutableArray array];去清除设置进去的弹幕,但是发现,好多弹幕都不显示了。不知道这是不是正确的解决方法?

Archer353 avatar Feb 27 '19 08:02 Archer353

过滤弹幕最好在你自己定义的数组里面做,如果要改动底层代码,必须要先看懂代码,否则不建设修改,你自己维护一个已发送的弹幕id数组,应该要不了多少性能

panghaijiao avatar Feb 27 '19 08:02 panghaijiao

己定义的数组里面做,如果要改动底层代码,必须要先看懂代码,否则不建设修改,你自己维护一个已发送的弹幕id数组,应该要不了多少性能

谢谢您的详细讲解,因为我感觉过滤弹幕比较麻烦,所以尝试了一下在库里增加了一个清空数据的方法:具体是这样实现:

  • (void)cleanSource { [self.danmakuSource reset]; } 相当于把reset里的清空数据的方法提取出来了,在sendDanmakus:前调用一下,目前我使用没有问题,您看这种方法如何

Archer353 avatar Feb 27 '19 08:02 Archer353

目前看应该没什么大问题

panghaijiao avatar Feb 27 '19 08:02 panghaijiao

目前看应该没什么大问题

好的,非常感谢您的耐心帮忙。最后随口问一下有没有在库里加这个清空数据方法的打算^-^,加了的话我就可以继续偷懒用pod了。我听安卓那边的同事说DanmakuFlameMaster有这种清空数据的方法。

Archer353 avatar Feb 27 '19 08:02 Archer353

后面考虑一下,你可以先用pod,使用runtime动态化调用* [self.danmakuSource reset];就可以了

panghaijiao avatar Feb 27 '19 08:02 panghaijiao

后面考虑一下,你可以先用pod,使用runtime动态化调用* [self.danmakuSource reset];就可以了

我查了一下,没太明白您说的runtime动态化调用* [self.danmakuSource reset];如果用pod的话,我怎么调到呢?因为项目需要,我的pod会经常更新。

Archer353 avatar Feb 27 '19 09:02 Archer353

[[self valueForKey:@"danmakuSource"] performSelector:@selector(reset)];

panghaijiao avatar Feb 27 '19 12:02 panghaijiao

[[self valueForKey:@"danmakuSource"] performSelector:@selector(reset)];

可以了,万分感谢您的帮助。这样可以继续用pod了

Archer353 avatar Feb 27 '19 12:02 Archer353

[self.danmakuView sendDanmaku:model forceRender:YES]; 发送不了弹幕~

cocfident avatar Mar 05 '19 01:03 cocfident

[self.danmakuView sendDanmaku:model forceRender:YES]; 发送不了弹幕~

应该需要先调用prepareDanmakus,在调用sendDanmaku。我是这样的。其他的原因,你可以@一下作者

Archer353 avatar Mar 05 '19 09:03 Archer353