Flutters资源加载速度比原生Android快

问题描述 投票:-2回答:2

我正在尝试将从资源中获取的图像转换为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]);
    }
  }

Kotlin代码:

 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的转换大约需要50ms,而原生代的大约需要2000-3000ms。我认为Threading可能就是这种情况,所以我试图在后台线程上为本机代码运行此转换,但它没有帮助。你能告诉我为什么会有这么不同的时间,以及如何在本机代码中更好地实现它?有没有办法省略转换到Bitmap等?也许这让它变得如此之久。

编辑。添加了getBytesFromBitmap函数

android flutter bitmap drawable
2个回答
4
投票

您看到的差异是,在颤动的代码中,您只是在没有任何图像解码的情况下读取您的数据,而在kotlin中,您首先解码到Bitmap,然后您将compress()ing回来 - 如果您想要加速它只需通过调用InputStream获得Resources#openRawResource并且无需任何解码即可读取您的图像资源


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.