首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Camera2 Renderscript过热问题

Android Camera2 Renderscript过热问题
EN

Stack Overflow用户
提问于 2017-03-30 03:22:06
回答 1查看 748关注 0票数 1

我有一个过热的问题,它关闭了我的手机运行了几个小时。我想24小时运行,请帮我改进一下:

我使用Camera2接口,原始格式之后是renderscript来将YUV420888转换为rgba。我的renderscript如下所示:

代码语言:javascript
复制
#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;
}

这就是我调用renderscript以转换为rgba的地方:

代码语言:javascript
复制
@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运行图像处理的回调:

代码语言:javascript
复制
@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 The的速度进行。我仔细检查过了,没有内存泄漏。但在运行了一段时间后,即使在屏幕关闭,手机变得非常热,并关闭了自己。注意:如果删除图像处理部分,问题仍然存在。这会有什么问题吗?我可以打开手机摄像头应用程序,让它在没有问题的情况下运行数小时。

  • 是renderscript引起的热度吗?
  • 22 Does会引起热吗?也许我该减一点?
  • Android后台服务会引起热吗?

谢谢。

ps:我是在LG G4上测试的,它支持完全的Camera2接口。

EN

回答 1

Stack Overflow用户

发布于 2017-03-30 19:51:32

从理论上讲,如果你的设备开始过热,并且永远不关机,它就应该自行关闭。这只会降低您的帧速率,因为设备升温。但不幸的是,有些设备在这方面做得不太好。

基本上,任何减少CPU / GPU使用的东西都会降低功耗和发热。基本提示:

  • 不要复制缓冲区。当你在30 you时,每一份拷贝都是非常昂贵的。在这里,您将从分配复制到byte[],然后从该byte[]复制到rgbaMat。这相当于将分配复制到rgbaMat所花费的2倍。不幸的是,我不确定有什么方法可以直接将分配复制到rgbaMat,或者创建一个与rgbaMat相同的内存支持的分配。
  • 您确定不能对YUV数据进行OpenCV处理吗?这将为您节省大量开销;如果不使用硬件,则RGB->YUV转换并不便宜。
  • 还有一个RS内在的ScriptIntrinsicYuvToRgb,它可能给你比手写循环更好的性能。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43107932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档