需求
我们的 YUV 超级夜景算法的输出是 YUV 数据,客户由于要在结果图上绘制水印,需要我们给他们输出 ARGB_8888 的数据。
分析
YUV 数据在 Java 中可以直接通过公式计算转换为 ARGB 数据,但是由于用了多个循环,效率会比较低,在客户的平台 Qualcomm MSM6125 上 12M 的图大概需要用 400ms。400ms 对于 2.5s 的算法耗时来说算得上庞然大物了。所以得想一下其他思路来解决这个问题。
客户反馈了一个 SDK 的 crash log,跑 monkey testing 报出来的问题。trace 信息如下:
本文是对 2018 年读书的一个总结,写这篇文章的时候正读完「人类简史」这本书,「人类简史」非常棒,读的过程中和读完后都思绪万千,特别想写点东西。今天正值除夕的前一天,此刻我正在回家的动车上,趁着想写东西的这股劲,对去年读过的书做一个总结。
在 build.gradle 的 defaultConfig - externalNativeBuild - cmake 下有一个 cppFlags 的配置项。它的作用是定义 C++ 编译时的 flags:
|
|
在做三摄算法集成项目的时候,因为手机有三个摄像头,所以存在两种不同的双摄人像模式,分别是 1 倍人像模式(以下简称 1x)和 2 倍光变人像模式(以下简称 2x)。我们没有在 App 层面使用同时打开两个 camera id 的方式来打开双摄,因为这样逻辑会稍微复杂,所以我们是在底层做了这件事,在上层我们只需要打开新增的 camera id,就可以同时打开两个摄像头。
「阿里巴巴 Android 开发手册」中第 5.3 节对新建线程做了如下强制性要求:
新建线程时,必须通过线程池提供(AsyncTask 或者 ThreadPoolExecutor 或者其他形式自定义的线程池),不允许在应用中自行显式创建线程。
并对此做了如下的说明:
使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。另外创建匿名线程不便于后续的资源使用分析,对性能分析等会造成困扰。
嗯,有理有据,让人信服。接下来将介绍 Thread Pools, Thread Pool Executors 以及它们在 Android 中的使用。