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

缥帙各舒散,前后互相逾。这篇文章主要讲述Flutters资源加载速度比原生Android快相关的知识,希望能为你提供帮助。
我正在尝试将从资源中获取的图像转换为ByteArray,稍后将通过Socket发送。我一直在测量每次转换的时间。
【Flutters资源加载速度比原生Android快】我已经在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函数
答案您看到的差异是,在颤动的代码中,您只是在没有任何图像解码的情况下读取您的数据,而在kotlin中,您首先解码到Bitmap,然后您将compress()ing回来 - 如果您想要加速它只需通过调用InputStream获得Resources#openRawResource并且无需任何解码即可读取您的图像资源
另一答案它与将其转换为字节的方式有关...你能发布你的getBytesFromBitmap函数吗?另外,本机代码的转换确实应该在后台线程中完成,请在这种情况下上传您的结果。

    推荐阅读