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

Android10,发送一条弹幕,播放完后,会重复从中间在出现一次,重复播放多次 #445

Open
fenyh opened this issue Feb 19, 2020 · 18 comments

Comments

@fenyh
Copy link

fenyh commented Feb 19, 2020

在android10上,发送一条弹幕,会重复多次播放,第一次播放完成后,从中间又跑一次,然后从4分支1出又出现一次。如此出现多次。

@liubin023
Copy link

三星S20上出现同样问题

@kjsolo
Copy link

kjsolo commented May 14, 2020

原因找到了,是因为S20上开启了120hz刷新率,而弹幕刷新率是60hz,将S20刷新率降到60hz就没问题了,要自己适配120hz才行

@Liar1995
Copy link

我也遇到了同样的问题,在一加手机上,90hz帧率, @kjsolo 想问下应该怎么适配120hz呢?😣

@dzr1990
Copy link

dzr1990 commented Jun 2, 2020

同问,是怎么兼容大于60hz频率的呢?@kjsolo

@eekidu
Copy link

eekidu commented Jul 3, 2020

以上有解决方案吗?说说思路!

@qflbai
Copy link

qflbai commented Aug 4, 2020

override fun onCreate(savedInstanceState: Bundle?) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // 获取系统window支持的模式
        val modes = window.windowManager.defaultDisplay.supportedModes
        // 对获取的模式,基于刷新率的大小进行排序,从小到大排序
        modes.sortBy {
            it.refreshRate
        }

        window.let {
            val lp = it.attributes
            // 取出最小的那一个刷新率,直接设置给window
            lp.preferredDisplayModeId = modes.first().modeId
            it.attributes = lp
        }
    }
    super.onCreate(savedInstanceState)

}

@qflbai
Copy link

qflbai commented Aug 4, 2020

我是在activity里面取了最小帧率来做的适配

@yzhiwu
Copy link

yzhiwu commented Sep 27, 2020

在DrawHandler里的initRenderingConfigs()中根据当前的刷新率设置mFrameUpdateRate的值,比如120Hz应为8

@AlexZQS
Copy link

AlexZQS commented Oct 14, 2020

我是在activity里面取了最小帧率来做的适配

我这里使用你这种方式,不得行啊

@AlexZQS
Copy link

AlexZQS commented Oct 20, 2020

在DrawHandler里的initRenderingConfigs()中根据当前的刷新率设置mFrameUpdateRate的值,比如120Hz应为8

大佬这里怎么去解决的

@skqszy123
Copy link

希望有人能解决

@Axing-1995
Copy link

在DanmakuContext 中添加
private int mUpdateRate = 16;
public int getFrameUpdateRate(){
return mUpdateRate;
}

public void setFrameUpateRate(int rate){
    mUpdateRate = rate;
}

DrawHandler中修改
private void initRenderingConfigs() {
long averageFrameConsumingTime = 16;
mCordonTime = Math.max(33, (long) (averageFrameConsumingTime * 2.5f));
mCordonTime2 = (long) (mCordonTime * 2.5f);
mFrameUpdateRate = getConfig().getFrameUpdateRate();
mThresholdTime = mFrameUpdateRate + 3;
}
实例化DanmakuContext 时赋值
Display display = getWindowManager().getDefaultDisplay();
float refreshRate = display.getRefreshRate();
int rate = (int) (1000 / refreshRate);
mDanmakuContext.setFrameUpateRate(rate);

以上亲测有效

@xhdongy
Copy link

xhdongy commented Jan 26, 2021

在DanmakuContext 中添加
private int mUpdateRate = 16;
public int getFrameUpdateRate(){
return mUpdateRate;
}

public void setFrameUpateRate(int rate){
    mUpdateRate = rate;
}

DrawHandler中修改
private void initRenderingConfigs() {
long averageFrameConsumingTime = 16;
mCordonTime = Math.max(33, (long) (averageFrameConsumingTime * 2.5f));
mCordonTime2 = (long) (mCordonTime * 2.5f);
mFrameUpdateRate = getConfig().getFrameUpdateRate();
mThresholdTime = mFrameUpdateRate + 3;
}
实例化DanmakuContext 时赋值
Display display = getWindowManager().getDefaultDisplay();
float refreshRate = display.getRefreshRate();
int rate = (int) (1000 / refreshRate);
mDanmakuContext.setFrameUpateRate(rate);

以上亲测有效

老哥V5~!

@wkz0917
Copy link

wkz0917 commented May 15, 2021

谢谢,解决我的疑惑,方案不错,可以直接用

@Florian-31
Copy link

谢谢,解决我的疑惑,方案不错,可以直接用

你是引入整个module来修改的吗?

@yigepang
Copy link

yigepang commented Jul 1, 2022

同样的问题,怎样在不改源码情况下修复这个问题呢

@OhMyGod111
Copy link

override fun onCreate(savedInstanceState: Bundle?) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        // 获取系统window支持的模式
        val modes = window.windowManager.defaultDisplay.supportedModes
        // 对获取的模式,基于刷新率的大小进行排序,从小到大排序
        modes.sortBy {
            it.refreshRate
        }

        window.let {
            val lp = it.attributes
            // 取出最小的那一个刷新率,直接设置给window
            lp.preferredDisplayModeId = modes.first().modeId
            it.attributes = lp
        }
    }
    super.onCreate(savedInstanceState)

}

华为mate50Pro 鸿蒙系统4.0.0 还是会有问题,直接手机切换刷新率到60Hz 是没问题了, 这个设置还是有些瑕疵

@OhMyGod111
Copy link

同样的问题,怎样在不改源码情况下修复这个问题呢

可以通过反射去修改

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