缥帙各舒散,前后互相逾。这篇文章主要讲述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函数吗?另外,本机代码的转换确实应该在后台线程中完成,请在这种情况下上传您的结果。
推荐阅读
- Linkedin signin(无法检索访问令牌:appId或重定向uri与授权代码或授权代码已过期不匹配)
- 如何解决Symfony 4中的KnpPaginator异常(即使应用容器中存在服务”knp_paginator”,也找不到)
- 如何在C#中将Unixtime转换为DateTime类,反之亦然
- 2020年最值得学习的编程语言列表
- 如何磨练/提高你的编码技能()
- 如何解决C#WinForms构建异常(ClickOnce不支持请求执行级别” requireAdministrator”。)
- 关于HTML/CSS模板的7个惊人秘密
- 如何在任何环境下强制基于C#的WinForms应用程序以管理员权限运行()
- Golang与Node比较(性能,可伸缩性及更多)