Супер медленная обработка изображений на планшете Android - PullRequest
1 голос
/ 22 августа 2011

Я пытаюсь реализовать алгоритм SLIC суперпикселя в планшете Android ( SLIC )

Я портирую код, который в C ++ для работы со средой Android, используя stl-lib и все.Приложение делает снимок с камеры и отправляет данные для обработки в собственном коде.

Я запустил приложение, но проблема в том, что для обработки одного кадра (640 x 400) потребовалось 20-30 секунд, в то время как в моем ноутбуке работа с приложением visual studio почти мгновенно завершилась бы!

Я проверяю утечку памяти, их нет ... Это что-то, что может привести к тому, что время вычислений будет намного дороже, чем VS2010 в ноутбуке?

Я знаю, что этот вопрос может быть очень открытым ине совсем конкретно, но я тоже в темноте.Надеюсь, вы, ребята, можете помочь.

Спасибо

PS.Я проверяю время выполнения каждого процесса и думаю, что каждая строка времени выполнения кода просто увеличивается.Я не вижу какой-либо конкретной функции, которая занимает больше времени, чем обычно.

PSS.Как вы думаете, следование может вызвать замедление?

  1. Размер памяти: исследуется, во время собственного небольшого паузы показа времени из библиотеки GC
  2. STL: еще не исследовано, возможно ли этоэта функция, такая как vector, max и min, работающая в STL, может вызвать значительное замедление?
  3. среда Android сама по себе?
  4. Более низкая аппаратная спецификация планшета Android (вкладка Acer Iconia - 1 ГГц Nvidia Tegra 250 dual-основной процессор и имеет 1 ГБ оперативной памяти)
  5. Было бы лучше запустить на Java?

PSSS.Если у вас есть время, пожалуйста, проверьте код

1 Ответ

3 голосов
/ 24 августа 2011

Я просмотрел ваш код и могу дать следующие рекомендации:

  1. Прежде всего, вам нужно добавить строку APP_ABI := armeabi-v7a в ваш файл Application.mk. В противном случае ваш код скомпилирован для старой архитектуры armv5te, где у вас нет FPU (эмулируется вся арифметика с плавающей запятой), доступно меньше регистров и т. Д.
  2. Ваша реализация SLIC интенсивно использует double значения с плавающей точкой для вычислений. Вы должны заменить их на float везде, где это возможно, потому что ARM все еще не поддерживает аппаратное обеспечение для типа double.
...