Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sendDanmakus:弹幕显示不出 #18

Open
Archer353 opened this issue Feb 27, 2019 · 19 comments
Open

sendDanmakus:弹幕显示不出 #18

Archer353 opened this issue Feb 27, 2019 · 19 comments

Comments

@Archer353
Copy link

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

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

@panghaijiao
Copy link
Owner

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

@Archer353
Copy link
Author

Archer353 commented Feb 27, 2019

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

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

@Archer353
Copy link
Author

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

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

@panghaijiao
Copy link
Owner

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

@Archer353
Copy link
Author

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

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

@Archer353
Copy link
Author

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

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

@panghaijiao
Copy link
Owner

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

@Archer353
Copy link
Author

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

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

@panghaijiao
Copy link
Owner

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

@Archer353
Copy link
Author

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

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

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

@panghaijiao
Copy link
Owner

目前看应该没什么大问题

@Archer353
Copy link
Author

目前看应该没什么大问题

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

@panghaijiao
Copy link
Owner

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

@Archer353
Copy link
Author

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

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

@panghaijiao
Copy link
Owner

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

@Archer353
Copy link
Author

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

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

@cocfident
Copy link

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

@Archer353
Copy link
Author

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

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

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

No branches or pull requests

3 participants