V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
yueji
V2EX  ›  问与答

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

  •  
  •   yueji · Jul 26, 2022 · 969 views
    This topic created in 1375 days ago, the information mentioned may be changed or developed.
    场景:将手机录屏编码后得到的 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 replies    2022-07-27 18:14:30 +08:00
    AoEiuV020CN
        1
    AoEiuV020CN  
       Jul 26, 2022
    1. 确定不是 build() 在卡?
    2. toByteArray() 应该有申请内存吧,会不会是内存快不够了导致频繁 gc 的卡,
    404neko
        2
    404neko  
       Jul 27, 2022
    **随着时间推移,手机会越来越卡。**
    怕不是一边运行, 一边 GC
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2134 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 00:48 · PVG 08:48 · LAX 17:48 · JFK 20:48
    ♥ Do have faith in what you're doing.