V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
yueji
V2EX  ›  问与答

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

  •  
  •   yueji · 2022-07-26 17:54:26 +08:00 · 650 次点击
    这是一个创建于 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
    AoEiuV020CN
        1
    AoEiuV020CN  
       2022-07-26 18:06:51 +08:00
    1. 确定不是 build() 在卡?
    2. toByteArray() 应该有申请内存吧,会不会是内存快不够了导致频繁 gc 的卡,
    404neko
        2
    404neko  
       2022-07-27 18:14:30 +08:00
    **随着时间推移,手机会越来越卡。**
    怕不是一边运行, 一边 GC
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1081 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:51 · PVG 02:51 · LAX 10:51 · JFK 13:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.