Flutters 资源加载速度比原生 Android
Flutters resource load faster than native Android
我正在尝试将从资源获取的图像转换为 ByteArray
稍后将通过套接字发送。我一直在测量每次转换的时间。
我在 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 毫秒。
我认为线程可能就是这种情况,所以我尝试 运行 在本机代码的后台线程上进行此转换,但没有帮助。
你能告诉我为什么时间上有这么大的不同吗?我如何才能在本地代码中更好地实现它?有没有办法省略对位图等的转换?也许这让它这么长。
编辑。添加了 getBytesFromBitmap 函数
这与您将其转换为字节的方式有关...请问 post 您的
getBytesFromBitmap 函数?另外,本机代码的转换确实应该在后台线程中完成,请在这种情况下上传您的结果。
您看到的不同之处在于,在 flutter 代码中,您只是读取数据而无需任何图像解码,而在 kotlin 中,您首先解码为 Bitmap
,然后 compress()
将其返回 -如果你想加快速度,只需通过调用 Resources#openRawResource
获得 InputStream
并在不进行任何解码的情况下读取你的图像资源
我正在尝试将从资源获取的图像转换为 ByteArray 稍后将通过套接字发送。我一直在测量每次转换的时间。
我在 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 毫秒。 我认为线程可能就是这种情况,所以我尝试 运行 在本机代码的后台线程上进行此转换,但没有帮助。 你能告诉我为什么时间上有这么大的不同吗?我如何才能在本地代码中更好地实现它?有没有办法省略对位图等的转换?也许这让它这么长。
编辑。添加了 getBytesFromBitmap 函数
这与您将其转换为字节的方式有关...请问 post 您的 getBytesFromBitmap 函数?另外,本机代码的转换确实应该在后台线程中完成,请在这种情况下上传您的结果。
您看到的不同之处在于,在 flutter 代码中,您只是读取数据而无需任何图像解码,而在 kotlin 中,您首先解码为 Bitmap
,然后 compress()
将其返回 -如果你想加快速度,只需通过调用 Resources#openRawResource
获得 InputStream
并在不进行任何解码的情况下读取你的图像资源