这是一个创建于 886 天前的主题,其中的信息可能已经有所发展或是发生改变。
场景:将手机录屏编码后得到的 byte[]序列化成 protobuf 类
问题:一秒编码 30 帧,随着时间推移,手机会越来越卡。
经过排查,发现是这行代码造成卡顿,
val toByteArray = screenMes.build().toByteArray()
完整的代码如下:
val byteBuffer: ByteBuffer = ByteBuffer.allocateDirect(1024 * 1024 * 3)
private lateinit var screenMes: KCPMessage.ScreencapMes.Builder
/**
* 编码回调
* bytes 编码后的数据
* flags 是否 I 帧
*/
override fun onScreenInfo(bytes: ByteArray?, flags: Int) {
isRecording = true
if (bytes != null) {
screenMes.data = ByteString.copyFrom(bytes)
screenMes.sort = mFlowSort
if (flags == MediaCodec.BUFFER_FLAG_KEY_FRAME) {
screenMes.frameType = 0
} else {
screenMes.frameType = 1
}
val toByteArray = screenMes.build().toByteArray()
byteBuffer.clear()
byteBuffer.putInt(toByteArray.size + 4)
byteBuffer.putInt(KcpType.Type_Send_Frame)
byteBuffer.put(toByteArray)
byteBuffer.flip()
if (mUdxState == 1) {
if (mFlowSort > 999999999999999999) {
mFlowSort = 1
}
mFlowSort++
SendUtils.getInstance().handlePacket(true, byteBuffer, screenMes.frameType)
} else {
mFlowSort = 1
}
}
}
奇怪哦,小米,华为,OP,都测了,就三星手机会卡.其他手机都 OK.
2 条回复 • 2022-07-27 18:14:30 +08:00
|
|
1
AoEiuV020CN 2022-07-26 18:06:51 +08:00
1. 确定不是 build() 在卡? 2. toByteArray() 应该有申请内存吧,会不会是内存快不够了导致频繁 gc 的卡,
|
|
|
2
404neko 2022-07-27 18:14:30 +08:00
**随着时间推移,手机会越来越卡。** 怕不是一边运行, 一边 GC
|