为什么用 toByteArray()这个方法在某些机型上卡顿?

2022-07-26 17:54:26 +08:00
 yueji
场景:将手机录屏编码后得到的 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.
650 次点击
所在节点    问与答
2 条回复
AoEiuV020CN
2022-07-26 18:06:51 +08:00
1. 确定不是 build() 在卡?
2. toByteArray() 应该有申请内存吧,会不会是内存快不够了导致频繁 gc 的卡,
404neko
2022-07-27 18:14:30 +08:00
**随着时间推移,手机会越来越卡。**
怕不是一边运行, 一边 GC

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/868847

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX