bilibili / DanmakuFlameMaster

Android开源弹幕引擎·烈焰弹幕使 ~
http://app.bilibili.com/
Apache License 2.0
9.53k stars 2.1k forks source link

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

Open fenyh opened 4 years ago

fenyh commented 4 years ago

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

liubin023 commented 4 years ago

三星S20上出现同样问题

kjsolo commented 4 years ago

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

Liar1995 commented 4 years ago

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

dzr1990 commented 4 years ago

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

eekidu commented 4 years ago

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

qflbai commented 3 years ago
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 commented 3 years ago

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

yzhiwu commented 3 years ago

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

AlexZQS commented 3 years ago

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

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

AlexZQS commented 3 years ago

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

大佬这里怎么去解决的

skqszy123 commented 3 years ago

希望有人能解决

Axing-1995 commented 3 years ago

在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 commented 3 years ago

在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 commented 3 years ago

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

Florian-31 commented 3 years ago

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

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

yigepang commented 2 years ago

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

OhMyGod111 commented 5 months ago
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 commented 5 months ago

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

可以通过反射去修改