У меня проблема с перегревом, телефон выключается через пару часов работы. Я хочу запустить это 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.