DanmakuFlameMaster
DanmakuFlameMaster copied to clipboard
Android10,发送一条弹幕,播放完后,会重复从中间在出现一次,重复播放多次
在android10上,发送一条弹幕,会重复多次播放,第一次播放完成后,从中间又跑一次,然后从4分支1出又出现一次。如此出现多次。
三星S20上出现同样问题
原因找到了,是因为S20上开启了120hz刷新率,而弹幕刷新率是60hz,将S20刷新率降到60hz就没问题了,要自己适配120hz才行
我也遇到了同样的问题,在一加手机上,90hz帧率, @kjsolo 想问下应该怎么适配120hz呢?😣
同问,是怎么兼容大于60hz频率的呢?@kjsolo
以上有解决方案吗?说说思路!
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)
}
我是在activity里面取了最小帧率来做的适配
在DrawHandler里的initRenderingConfigs()中根据当前的刷新率设置mFrameUpdateRate的值,比如120Hz应为8
我是在activity里面取了最小帧率来做的适配
我这里使用你这种方式,不得行啊
在DrawHandler里的initRenderingConfigs()中根据当前的刷新率设置mFrameUpdateRate的值,比如120Hz应为8
大佬这里怎么去解决的
希望有人能解决
在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);
以上亲测有效
在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~!
谢谢,解决我的疑惑,方案不错,可以直接用
谢谢,解决我的疑惑,方案不错,可以直接用
你是引入整个module来修改的吗?
同样的问题,怎样在不改源码情况下修复这个问题呢
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 是没问题了, 这个设置还是有些瑕疵
同样的问题,怎样在不改源码情况下修复这个问题呢
可以通过反射去修改