Ресурс трепетает быстрее, чем родной Android - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь преобразовать изображение, полученное из ресурсов, в ByteArray, который позже будет отправлен через Socket.Я измерял время каждого из этих преобразований.

Я делал это как на Flutter, так и на нативном Android (Kotlin).Все тесты были выполнены на одном изображении, размер которого составлял около 1-2 МБ.

Код флаттера:

 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()
  }

Я действительно ожидал, что нативный код будет намного быстрее, чем код Флаттера, но это не так.. Преобразование для флаттера занимает около 50 мс, а для родного - около 2000-3000 мс.Я подумал, что может иметь место Threading, поэтому я попытался запустить это преобразование в фоновом потоке для собственного кода, но это не помогло.Подскажите, пожалуйста, почему так по-разному, и как я могу лучше реализовать его в нативном коде?Есть ли способ пропустить приведение к растровому изображению и т. Д.?Может быть, это так долго.

РЕДАКТИРОВАТЬ.Добавлена ​​функция getBytesFromBitmap

Ответы [ 2 ]

4 голосов
/ 20 апреля 2019

разница, которую вы видите, заключается в том, что в коде флаттера вы просто читаете свои данные без какой-либо дешифровки изображения, в то время как в котлине вы сначала декодируете до Bitmap, а затем compress() возвращаете его - если хотите ускорить его просто наберите InputStream, позвонив по номеру Resources#openRawResource и прочитав ваш ресурс изображения без какого-либо декодирования

0 голосов
/ 19 апреля 2019

Это как-то связано с тем, как вы конвертируете его в байты ... Не могли бы вы опубликовать свой getBytesFromBitmap func? Кроме того, преобразование в нативный код действительно должно выполняться в фоновом режиме, в этом случае загрузите свои результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...