Saturated

Java 线程池

限于喜欢 提交于 2021-02-13 17:57:20
1. 引言 合理利用线程池能够带来三个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。但是要做到合理的利用线程池,必须对其原理了如指掌。 2. 线程池的使用 线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池。 [java] view plain copy new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds,runnableTaskQueue, handler); 创建一个线程池需要输入几个参数: corePoolSize(线程池的基本大小):当提交一个任务到线程池时,线程池会创建一个线程来执行任务,即使其他空闲的基本线程能够执行新任务也会创建线程,等到需要执行的任务数大于线程池基本大小时就不再创建。如果调用了线程池的prestartAllCoreThreads方法,线程池会提前创建并启动所有基本线程。 runnableTaskQueue(任务队列):用于保存等待执行的任务的阻塞队列。

用NEON intrinsic实现RGB转YUV420SP(NV12)

馋奶兔 提交于 2020-10-27 03:30:04
如题,现在要把RGB的格式转成YUV格式。 1. 数据的排列方式   先来看看两种数据在内存里是按什么方式排列的 1.1 RGB的排列   如图所示,1组RGB表示1个像素的颜色,每个像素依次排列。图中有8组RGB数据,即8个像素点。 1.2 YUV的排列   如图所示,这里是 YUV420SP(NV12) 的排列方式,YUV的比例为 Y:U:V=4:1:1 。Y代表像素点的明亮度(灰阶),图中有48个Y,即48个像素点。UV代表像素点的色度,1个U和1个V组合到一起能表示一种颜色,在YUV420格式里,1组UV决定了4个像素点的颜色,其对应关系如图所示。U和V加起来的数据量是Y的一半。   YUV的图片还有许多种格式,请参考其它资料。   实际上它在内存里面是按照 Y 1 Y 2 Y 3 Y 4 Y 5 Y 6 Y 7 Y 8 U 1 V 1 U 2 V 2 Y_1Y_2Y_3Y_4Y_5Y_6Y_7Y_8U_1V_1U_2V_2 Y 1 ​ Y 2 ​ Y 3 ​ Y 4 ​ Y 5 ​ Y 6 ​ Y 7 ​ Y 8 ​ U 1 ​ V 1 ​ U 2 ​ V 2 ​ 的顺序排列的,如下图所示。存储的时候数据是连续排列的,解析的时候加上宽和高的信息才成为了一张矩形图片。写代码计算地址偏移的时候要注意行和列的关系。 2. RGB与YUV的转换公式 不知道哪里来的公式

Unity图片与文字的渐变遮罩

做~自己de王妃 提交于 2020-05-07 09:00:04
在做功能时美术有个效果是UGUI的渐变透明,实现上可以用遮罩,但是Unity提供的遮罩RectMask2D是硬裁剪,即超出遮罩范围就alpha直接设为0,没有过渡,所以我就要给这个图片设一个自定义shader让它能支持alpha渐变。 其实就是修改下Unity的UI Default shader,但注意Unity在下载时每个版本都提供了内置着色器,所以你还要选择对应的Unity版本的内置着色器代码。 将UI Default shader的UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);替换为自定义函数,UI Default代码不放了,要从对应版本的Unity(官网)下载,我一开始从网上找了个UI Default shader可能因为接口对不上,连遮罩都不成功。 从Unity的安装目录下找到CGIncludes/UnityUI.cginc inline float UnityGet2DClipping ( in float2 position, in float4 clipRect) { float2 inside = step(clipRect.xy, position.xy) * step(position.xy, clipRect.zw); return inside.x * inside.y; }

ThreadPoolExecutor源码分析及阻塞提交任务方法

巧了我就是萌 提交于 2019-12-05 15:18:33
ThreadPoolExecutor源码 ThreadPoolExecutor 基本使用参考: ThreadPoolExecutor执行过程分析 线程池状态标志 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); ctl 保存了线程池的运行状态(runState)和线程池内有效线程数量(workerCount)。 // Packing and unpacking ctl private static int runStateOf(int c) { return c & ~CAPACITY; } private static int workerCountOf(int c) { return c & CAPACITY; } private static int ctlOf(int rs, int wc) { return rs | wc; } 用 ctl 的高3位来表示线程池的运行状态, 用低29位来表示线程池内有效线程的数量。ctlOf() 方法用于计算出ctl的值。runStateOf()和workerCountOf()方法分别通过CAPACITY来计算得到其runState和workerCount,CAPACITY=29个1。 线程池的运行状态: // runState is