Проблема с перегревом Android Camera2 Renderscript

У меня проблема с перегревом, телефон выключается через пару часов работы. Я хочу запустить это 24/7, пожалуйста, помогите мне улучшить это:

Я использую интерфейс Camera2, формат RAW, за которым следует скрипт рендеринга для преобразования YUV420888 в rgba. Мой рендерскрипт выглядит следующим образом:

#pragma version(1)
#pragma rs java_package_name(com.sensennetworks.sengaze)
#pragma rs_fp_relaxed

rs_allocation gCurrentFrame;
rs_allocation gByteFrame;
int32_t gFrameWidth;

uchar4 __attribute__((kernel)) yuv2RGBAByteArray(uchar4 prevPixel,uint32_t x,uint32_t y)
{

    // Read in pixel values from latest frame - YUV color space
    // The functions rsGetElementAtYuv_uchar_? require API 18
    uchar4 curPixel;
    curPixel.r = rsGetElementAtYuv_uchar_Y(gCurrentFrame, x, y);
    curPixel.g = rsGetElementAtYuv_uchar_U(gCurrentFrame, x, y);
    curPixel.b = rsGetElementAtYuv_uchar_V(gCurrentFrame, x, y);

    // uchar4 rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v);
    // This function uses the NTSC formulae to convert YUV to RBG
    uchar4 out = rsYuvToRGBA_uchar4(curPixel.r, curPixel.g, curPixel.b);

    rsSetElementAt_uchar(gByteFrame, out.r, 4 * (y*gFrameWidth + x) + 0 );
    rsSetElementAt_uchar(gByteFrame, out.g, 4 * (y*gFrameWidth + x) + 1 );
    rsSetElementAt_uchar(gByteFrame, out.b, 4 * (y*gFrameWidth + x) + 2 );
    rsSetElementAt_uchar(gByteFrame, 255, 4 * (y*gFrameWidth + x) + 3 );

    return out;
}

Здесь я вызываю скрипт рендеринга для преобразования в rgba:

@Override
        public void onBufferAvailable(Allocation a) {
            inputAllocation.ioReceive();

            // Run processing pass if we should send a frame
            final long current = System.currentTimeMillis();
            if ((current - lastProcessed) >= frameEveryMs) {
                yuv2rgbaScript.forEach_yuv2RGBAByteArray(scriptAllocation, outputAllocation);
                if (rgbaByteArrayCallback != null) {
                    outputAllocationByte.copyTo(outBufferByte);
                    rgbaByteArrayCallback.onRGBAArrayByte(outBufferByte);
                }
                lastProcessed = current;
            }
        }

И это обратный вызов для запуска обработки изображений с использованием OpenCV:

@Override
    public void onRGBAArrayByte(byte[] rgbaByteArray) {

        try {
            /* Fill images. */
            rgbaMat.put(0, 0, rgbaByteArray);

            analytic.processFrame(rgbaMat);

            /* Send fps to UI for debug purpose. */
            calcFPS(true);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Все это работает со скоростью ~ 22 кадра в секунду. Я внимательно проверил, утечек памяти нет. Но поработав некоторое время даже с выключенным экраном, телефон сильно нагревается, и сам выключается. Обратите внимание, что если я удалю часть обработки изображений, проблема останется. Что может быть не так с этим? Я мог включить приложение камеры телефона и оставить его работать часами без проблем.

  • Вызывает ли рендерскрипт нагрев?
  • 22 кадра в секунду вызывают жар? Может, мне уменьшить?
  • Вызывает ли перегрев фоновая служба Android?

Спасибо.

ps: я тестировал это на LG G4 с полной поддержкой интерфейса Camera2.


person VB4EVA    schedule 30.03.2017    source источник
comment
как долго ты держишься на камеру? Потому что аппаратное обеспечение камеры преобразует 24 кадра В СЕКУНДУ в видео. Если вы постоянно запускаете это с течением времени, это много дискового ввода-вывода, которое будет генерировать тепло. Звучит логично для меня.   -  person JoxTraex    schedule 30.03.2017
comment
Камера, RenderScript, OpenCV, а также потенциальный ввод-вывод и использование сети могут легко довести телефон до его теплового предела. Одна вещь, которую вы можете попробовать, это использовать более низкое разрешение, или более низкую частоту кадров, или прикрепить к нему радиатор :)   -  person Miao Wang    schedule 30.03.2017


Ответы (1)


Теоретически ваше устройство должно само дросселироваться, если оно начинает перегреваться, и никогда не выключаться. Это просто уменьшит частоту кадров по мере прогрева устройства. Но, к сожалению, некоторые устройства не так хороши в этом, как должны были бы.

По сути, все, что снижает использование вашего процессора / графического процессора, снижает энергопотребление и тепловыделение. Основные советы:

  • Не копируйте буферы. Каждая копия стоит очень дорого, когда вы делаете это со скоростью ~ 30 кадров в секунду. Здесь вы копируете из Allocation в byte[], а затем из этого byte[] в rgbaMat. Это в 2 раза дороже, чем простое копирование из Allocation в rgbaMat. К сожалению, я не уверен, что есть прямой способ скопировать из распределения в rgbaMat или создать выделение, которое поддерживается той же памятью, что и rgbaMat.
  • Вы уверены, что вместо этого не можете выполнять обработку OpenCV для данных YUV? Это сэкономит вам много накладных расходов; преобразование RGB-> YUV недешево, если оно не выполняется аппаратно.
  • Существует также встроенный RS, ScriptIntrinsicYuvToRgb, который может повысить производительность. чем ваша рукописная петля.
person Eddy Talvala    schedule 30.03.2017