Flutter的资源加载速度快于本机Android

时间:2019-04-19 09:35:59

标签: android flutter bitmap drawable

我正在尝试将从资源获取的图像转换为ByteArray 稍后将通过Socket发送。我一直在测量每次转换的时间。

我已经在Flutter和原生Android(Kotlin)上做到了。所有测试均在大约1-2MB的同一图像上完成。

颤振代码:

 sendMessage() async {
    if (socket != null) {
      Stopwatch start = Stopwatch()..start();
      final imageBytes = await rootBundle.load('assets/images/stars.jpg');
      final image = base64Encode(imageBytes.buffer.asUint8List(imageBytes.offsetInBytes, imageBytes.lengthInBytes));
      print('Converting took ${start.elapsedMilliseconds}');
      socket.emit("message", [image]);
    }
  }

科特琳代码:

 private fun sendMessage() {
        var message = ""
        val thread = Thread(Runnable {
            val start = SystemClock.elapsedRealtime()
            val bitmap = BitmapFactory.decodeResource(resources, R.drawable.stars)
            message = Base64.encodeToString(getBytesFromBitmap(bitmap), Base64.DEFAULT)
            Log.d("Tag", "Converting time was : ${SystemClock.elapsedRealtime() - start}")
        })
        thread.start()
        thread.join()
        socket.emit("message", message)
    }

  private fun getBytesFromBitmap(bitmap: Bitmap): ByteArray? {
        val stream = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
        return stream.toByteArray()
  }

我实际上一直期望本机代码比Flutter的要快得多,但事实并非如此。Flutter的转换大约需要50毫秒,而本机的转换大约需要2000-3000毫秒。 我以为可能是线程化,所以我尝试在后台线程上针对本机代码运行此转换,但没有帮助。 您能否告诉我为什么时间如此不同,以及如何更好地在本机代码中实现它?有没有一种方法可以省略对Bitmap等的转换?也许这太长了。

编辑。添加了getBytesFromBitmap函数

2 个答案:

答案 0 :(得分:3)

您看到的区别是,在颤动代码中,您仅读取数据而没有任何图像解码,而在kotlin中,您首先将其解码为Bitmap,然后compress()将其返回-如果您想要加快速度,只需调用InputStream即可获得Resources#openRawResource并无需任何解码即可读取图像资源

答案 1 :(得分:0)

它与将其转换为字节的方式有关...您可以发表您的文章吗? getBytesFromBitmap函数吗?另外,本机代码的转换实际上应该在后台线程中完成,在这种情况下,请上传您的结果。