RenderScript 运行时 API 参考

概览

RenderScript 是一种高性能运行时,可在原生级别提供计算操作。RenderScript 代码在运行时在设备上编译,以实现平台独立性。

本参考文档介绍了 RenderScript 运行时 API,您可以使用这些 API 用 C99 编写 RenderScript 代码。RenderScript 计算头文件会自动为您包含。

要使用 RenderScript,您需要利用此处记录的 RenderScript 运行时 API 以及 RenderScript 的 Android 框架 API。有关 Android 框架 API 的文档,请参阅 android.renderscript 软件包参考。

有关如何使用 RenderScript 进行开发以及运行时和 Android 框架 API 如何交互的更多信息,请参阅 RenderScript 开发者指南RenderScript 示例

数值类型

标量

RenderScript 支持以下标量数值类型

8 位 16 位 32 位 64 位
整数 char, int8_t short, int16_t int32_t long, long long, int64_t
无符号整数 uchar, uint8_t ushort, uint16_t uint, uint32_t ulong, uint64_t
浮点数 half float double

向量

RenderScript 支持长度为 2、3 和 4 的固定大小向量。向量使用通用类型名称后跟 2、3 或 4 来声明。例如,float4int3double2ulong4

要创建向量字面量,请使用向量类型后跟花括号括起来的值,例如 (float3){1.0f, 2.0f, 3.0f}

向量的条目可以使用不同的命名样式访问。

可以通过在变量名后跟一个点和以下内容来访问单个条目

  • 字母 x、y、z 和 w,
  • 字母 r、g、b 和 a,
  • 字母 s 或 S,后跟一个从零开始的索引。

例如,对于 int4 myVar;,以下是等效的:
myVar.x == myVar.r == myVar.s0 == myVar.S0
myVar.y == myVar.g == myVar.s1 == myVar.S1
myVar.z == myVar.b == myVar.s2 == myVar.S2
myVar.w == myVar.a == myVar.s3 == myVar.S3

可以使用多个字母或索引连接组成的标识符一次性访问向量的多个条目。结果向量的大小等于指定的条目数量。

在上面的示例中,可以使用 myVar.yzmyVar.gbmyVar.s12myVar.S12 访问中间的两个条目。

条目不必是连续的或按递增顺序排列。条目甚至可以重复,只要我们不是试图对其进行赋值。您也不能混合命名样式。

以下是可以或不可以进行的示例:
float4 v4;
float3 v3;
float2 v2;
v2 = v4.xx; // Valid
v3 = v4.zxw; // Valid
v3 = v4.bba; // Valid
v3 = v4.s032; // Valid
v3.s120 = v4.S233; // Valid
v4.yz = v3.rg; // Valid
v4.yzx = v3.rg; // Invalid: mismatched sizes
v4.yzz = v3; // Invalid: z appears twice in an assignment
v3 = v3.xas0; // Invalid: can't mix xyzw with rgba nor s0...
v3 = v4.s034; // Invalid: the digit can only be 0, 1, 2, or 3

矩阵和四元数

RenderScript 支持固定大小的浮点方阵,尺寸为 2x2、3x3 和 4x4。类型命名为 rs_matrix2x2rs_matrix3x3rs_matrix4x4。操作列表请参阅矩阵函数

四元数也通过 rs_quaternion 得到支持。操作列表请参阅四元数函数

类型
char2 两个 8 位有符号整数
char3 三个 8 位有符号整数
char4 四个 8 位有符号整数
double2 两个 64 位浮点数
double3 三个 64 位浮点数
double4 四个 64 位浮点数
float2 两个 32 位浮点数
float3 三个 32 位浮点数
float4 四个 32 位浮点数
half 16 位浮点值
half2 两个 16 位浮点数
half3 三个 16 位浮点数
half4 四个 16 位浮点数
int16_t 16 位有符号整数
int2 两个 32 位有符号整数
int3 三个 32 位有符号整数
int32_t 32 位有符号整数
int4 四个 32 位有符号整数
int64_t 64 位有符号整数
int8_t 8 位有符号整数
long2 两个 64 位有符号整数
long3 三个 64 位有符号整数
long4 四个 64 位有符号整数
rs_matrix2x2 2x2 32 位浮点矩阵
rs_matrix3x3 3x3 32 位浮点矩阵
rs_matrix4x4 4x4 32 位浮点矩阵
rs_quaternion 四元数
short2 两个 16 位有符号整数
short3 三个 16 位有符号整数
short4 四个 16 位有符号整数
size_t 无符号大小类型
ssize_t 有符号大小类型
uchar 8 位无符号整数
uchar2 两个 8 位无符号整数
uchar3 三个 8 位无符号整数
uchar4 四个 8 位无符号整数
uint 32 位无符号整数
uint16_t 16 位无符号整数
uint2 两个 32 位无符号整数
uint3 三个 32 位无符号整数
uint32_t 32 位无符号整数
uint4 四个 32 位无符号整数
uint64_t 64 位无符号整数
uint8_t 8 位无符号整数
ulong 64 位无符号整数
ulong2 两个 64 位无符号整数
ulong3 三个 64 位无符号整数
ulong4 四个 64 位无符号整数
ushort 16 位无符号整数
ushort2 两个 16 位无符号整数
ushort3 三个 16 位无符号整数
ushort4 四个 16 位无符号整数

对象类型

以下类型用于操作 RenderScript 对象,例如 allocations、samplers、elements 和 scripts。这些对象大多数是使用 Java RenderScript API 创建的。

类型
rs_allocation allocation 的句柄
rs_allocation_cubemap_face 用于选择立方体贴图面的枚举
rs_allocation_usage_type 指定 allocation 使用方式的位字段
rs_data_kind Element 数据种类
rs_data_type Element 基本数据类型
rs_element element 的句柄
rs_sampler Sampler 的句柄
rs_sampler_value Sampler Wrap T 值
rs_script Script 的句柄
rs_type Type 的句柄
rs_yuv_format YUV 格式

转换函数

以下函数将数值向量类型转换为另一种类型,或将一种颜色表示转换为另一种颜色表示。

函数
convert 转换数值向量
rsPackColorTo8888 从浮点数创建 uchar4 RGBA
rsUnpackColor8888 从 uchar4 创建 float4 RGBA
rsYuvToRGBA 将 YUV 值转换为 RGBA

数学常量和函数

以下数学函数可以应用于标量和向量。当应用于向量时,返回值是将该函数应用于输入的每个条目所得到的向量。

例如:
float3 a, b;
// The following call sets
// a.x to sin(b.x),
// a.y to sin(b.y), and
// a.z to sin(b.z).
a = sin(b);

有关将输入解释为 n 维空间中单个向量的函数(例如 distance() 和 length()),请参阅向量数学函数

对 32 位浮点数进行数学运算的精度受 pragma rs_fp_relaxed 和 rs_fp_full 的影响。在 rs_fp_relaxed 下,次正规值可能会被刷新为零,并且舍入可能会朝零方向进行。相比之下,rs_fp_full 要求正确处理次正规值,即小于 1.17549435e-38f 的值。rs_fp_rull 还要求四舍五入到最近偶数。

使用常见数学函数的变体可以实现不同的精度/速度权衡。名称以以下开头的函数

  • native_: 可能具有精度较低的自定义硬件实现。此外,次正规值可能会被刷新为零,可以使用向零舍入,并且可能无法正确处理 NaN 和无穷大输入。
  • half_: 可能会使用 16 位浮点数执行内部计算。此外,次正规值可能会被刷新为零,并且可以使用向零舍入。

常量
M_1_PI 1 / pi,作为一个 32 位浮点数
M_2_PI 2 / pi,作为一个 32 位浮点数
M_2_SQRTPI 2 / sqrt(pi),作为一个 32 位浮点数
M_E e,作为一个 32 位浮点数
M_LN10 log_e(10),作为一个 32 位浮点数
M_LN2 log_e(2),作为一个 32 位浮点数
M_LOG10E log_10(e),作为一个 32 位浮点数
M_LOG2E log_2(e),作为一个 32 位浮点数
M_PI pi,作为一个 32 位浮点数
M_PI_2 pi / 2,作为一个 32 位浮点数
M_PI_4 pi / 4,作为一个 32 位浮点数
M_SQRT1_2 1 / sqrt(2),作为一个 32 位浮点数
M_SQRT2 sqrt(2),作为一个 32 位浮点数
函数
abs 整数的绝对值
acos 反余弦
acosh 反双曲余弦
acospi 反余弦除以 pi
asin 反正弦
asinh 反双曲正弦
asinpi 反正弦除以 pi
atan 反正切
atan2 比值的反正切
atan2pi 比值的反正切,除以 pi
atanh 反双曲正切
atanpi 反正切除以 pi
cbrt 立方根
ceil 不小于某个值的最小整数
clamp 将值限制在某个范围内
clz 前导 0 位数
copysign 将一个数的符号复制到另一个数
cos 余弦
cosh 双曲余弦
cospi 一个数乘以 pi 的余弦
degrees 将弧度转换为角度
erf 数学误差函数
erfc 数学余误差函数
exp e 的一个数次方
exp10 10 的一个数次方
exp2 2 的一个数次方
expm1 e 的一个数次方减一
fabs 浮点数的绝对值
fdim 两个值的正差
floor 不大于某个值的最小整数
fma 乘加
fmax 两个浮点数的最大值
fmin 两个浮点数的最小值
fmod 取模
fract 正小数部分
frexp 二进制尾数和指数
half_recip 以 16 位精度计算的倒数
half_rsqrt 以 16 位精度计算的平方根的倒数
half_sqrt 以 16 位精度计算的平方根
hypot 斜边
ilogb 以 2 为底的指数
ldexp 从尾数和指数创建浮点数
lgamma 伽马函数的自然对数
log 自然对数
log10 以 10 为底的对数
log1p 值加 1 的自然对数
log2 以 2 为底的对数
logb 以 2 为底的指数
mad 乘加
max 最大值
min 最小值
mix 混合两个值
modf 整数和小数部分
nan 非数字
nan_half 非数字
native_acos 近似反余弦
native_acosh 近似反双曲余弦
native_acospi 近似反余弦除以 pi
native_asin 近似反正弦
native_asinh 近似反双曲正弦
native_asinpi 近似反正弦除以 pi
native_atan 近似反正切
native_atan2 近似比值的反正切
native_atan2pi 近似比值的反正切,除以 pi
native_atanh 近似反双曲正切
native_atanpi 近似反正切除以 pi
native_cbrt 近似立方根
native_cos 近似余弦
native_cosh 近似双曲余弦
native_cospi 近似一个数乘以 pi 的余弦
native_divide 近似除法
native_exp 近似 e 的一个数次方
native_exp10 近似 10 的一个数次方
native_exp2 近似 2 的一个数次方
native_expm1 近似 e 的一个数次方减一
native_hypot 近似斜边
native_log 近似自然对数
native_log10 近似以 10 为底的对数
native_log1p 近似值加 1 的自然对数
native_log2 近似以 2 为底的对数
native_powr 近似正底数的指数幂
native_recip 近似倒数
native_rootn 近似 n 次方根
native_rsqrt 近似平方根的倒数
native_sin 近似正弦
native_sincos 近似正弦和余弦
native_sinh 近似双曲正弦
native_sinpi 近似一个数乘以 pi 的正弦
native_sqrt 近似平方根
native_tan 近似正切
native_tanh 近似双曲正切
native_tanpi 近似一个数乘以 pi 的正切
nextafter 下一个浮点数
pow 底数的指数幂
pown 底数的整数指数幂
powr 正底数的指数幂
radians 将角度转换为弧度
remainder 除法的余数
remquo 除法的余数和商
rint 舍入到偶数
rootn N 次方根
round 远离零点舍入
rsRand 伪随机数
rsqrt 平方根的倒数
sign 值的符号
sin 正弦
sincos 正弦和余弦
sinh 双曲正弦
sinpi 一个数乘以 pi 的正弦
sqrt 平方根
step 如果小于某个值则为 0,否则为 1
tan 正切
tanh 双曲正切
tanpi 一个数乘以 pi 的正切
tgamma 伽马函数
trunc 截断浮点数

向量数学函数

这些函数将输入参数解释为 n 维空间中向量的表示。

对 32 位浮点数进行数学运算的精度受 pragma rs_fp_relaxed 和 rs_fp_full 的影响。详情请参阅数学常量和函数

使用常见数学函数的变体可以实现不同的精度/速度权衡。名称以以下开头的函数

  • native_: 可能具有精度较低的自定义硬件实现。此外,次正规值可能会被刷新为零,可以使用向零舍入,并且可能无法正确处理 NaN 和无穷大输入。
  • fast_: 可能会使用 16 位浮点数执行内部计算。此外,次正规值可能会被刷新为零,并且可以使用向零舍入。

函数
cross 两个向量的叉积
distance 两点之间的距离
dot 两个向量的点积
fast_distance 两点之间的近似距离
fast_length 向量的近似长度
fast_normalize 近似归一化向量
length 向量的长度
native_distance 两点之间的近似距离
native_length 向量的近似长度
native_normalize 近似归一化向量
normalize 归一化向量

矩阵函数

这些函数允许您操作 2x2、3x3 和 4x4 维度的方阵。它们对于图形转换特别有用,并且与 OpenGL 兼容。

我们对行和列使用零基索引。例如,rs_matrix4x4 的最后一个元素位于 (3, 3)。

RenderScript 使用列主序矩阵和基于列的向量。向量的变换通过后乘向量完成,例如 (matrix * vector),由 rsMatrixMultiply() 提供。

要创建一个同时执行两个变换的变换矩阵,请将两个源矩阵相乘,并将第一个变换作为右参数。例如,要创建一个应用变换 s1 后再应用 s2 的变换矩阵,请调用 rsMatrixLoadMultiply(&combined, &s2, &s1)。这源自 s2 * (s1 * v),即 (s2 * s1) * v

我们有两种风格的函数用于创建变换矩阵:rsMatrixLoadTransformation 和 rsMatrixTransformation。前者风格简单地将变换矩阵存储在第一个参数中。后者修改一个预先存在的变换矩阵,以便新的变换首先发生。例如,如果您在一个已经执行缩放的矩阵上调用 rsMatrixTranslate(),则当结果矩阵应用于向量时,将首先执行平移,然后执行缩放。

函数
rsExtractFrustumPlanes 计算视锥体平面
rsIsSphereInFrustum 检查球体是否在视锥体平面内
rsMatrixGet 获取一个元素
rsMatrixInverse 原地反转矩阵
rsMatrixInverseTranspose 原地反转并转置矩阵
rsMatrixLoad 加载或复制矩阵
rsMatrixLoadFrustum 加载视锥体投影矩阵
rsMatrixLoadIdentity 加载单位矩阵
rsMatrixLoadMultiply 乘以两个矩阵
rsMatrixLoadOrtho 加载正交投影矩阵
rsMatrixLoadPerspective 加载透视投影矩阵
rsMatrixLoadRotate 加载旋转矩阵
rsMatrixLoadScale 加载缩放矩阵
rsMatrixLoadTranslate 加载平移矩阵
rsMatrixMultiply 将矩阵乘以向量或另一个矩阵
rsMatrixRotate 对变换矩阵应用旋转
rsMatrixScale 对变换矩阵应用缩放
rsMatrixSet 设置一个元素
rsMatrixTranslate 对变换矩阵应用平移
rsMatrixTranspose 原地转置矩阵

四元数函数

以下函数用于操作四元数。

函数
rsQuaternionAdd 添加两个四元数
rsQuaternionConjugate 共轭四元数
rsQuaternionDot 两个四元数的点积
rsQuaternionGetMatrixUnit 从四元数获取旋转矩阵
rsQuaternionLoadRotate 创建旋转四元数
rsQuaternionLoadRotateUnit 表示围绕任意单位向量旋转的四元数
rsQuaternionMultiply 将四元数乘以标量或另一个四元数
rsQuaternionNormalize 归一化四元数
rsQuaternionSet 创建四元数
rsQuaternionSlerp 两个四元数之间的球面线性插值

原子更新函数

要更新多个线程共享的值,请使用以下函数。它们确保值以原子方式更新,即内存读取、更新和内存写入以正确的顺序完成。

这些函数比它们的非原子等价函数慢,因此只在需要同步时使用它们。

请注意,在 RenderScript 中,即使您没有显式创建线程,您的代码也很可能在单独的线程中运行。RenderScript 运行时经常会将一个内核的执行分割到多个线程中。更新全局变量应使用原子函数。如果可能,修改您的算法以完全避免使用它们。

函数
rsAtomicAdd 线程安全加法
rsAtomicAnd 线程安全按位与
rsAtomicCas 线程安全比较并设置
rsAtomicDec 线程安全减法
rsAtomicInc 线程安全增法
rsAtomicMax 线程安全最大值
rsAtomicMin 线程安全最小值
rsAtomicOr 线程安全按位或
rsAtomicSub 线程安全减法
rsAtomicXor 线程安全按位异或

时间函数和类型

以下函数可用于获取当前时钟时间和当前系统运行时间。不建议在内核内部调用这些函数。

类型
rs_time_t 自 1970 年 1 月 1 日以来的秒数
rs_tm 日期和时间结构
函数
rsGetDt 上次调用以来的经过时间
rsLocaltime 转换为本地时间
rsTime 自 1970 年 1 月 1 日以来的秒数
rsUptimeMillis 系统运行时间(毫秒)
rsUptimeNanos 系统运行时间(纳秒)

Allocation 创建函数

以下函数可用于从 Script 创建 Allocations。

这些函数可以直接或间接从可调用函数中调用。如果某些控制流路径可能导致从 RenderScript 内核函数调用这些函数,则会生成编译器错误。

函数
rsCreateAllocation 创建给定 Type 的 rs_allocation 对象。
rsCreateElement 创建指定数据类型的 rs_element 对象
rsCreatePixelElement 创建指定数据类型和数据种类的 rs_element 对象
rsCreateType 创建具有指定 Element 和形状属性的 rs_type 对象
rsCreateVectorElement 创建指定数据类型和向量宽度的 rs_element 对象

Allocation 数据访问函数

以下函数可用于获取和设置构成 allocation 的单元格。

  • 使用 rsGetElementAt* 和 rsSetElementAt 函数访问单个单元格。
  • 可以使用 rsAllocationCopy* 和 rsAllocationV* 函数复制多个单元格。
  • 通过 sampler 获取值,请使用 rsSample
rsGetElementAt 和 rsSetElement* 函数有点误命名。它们获取或设置的不是 elements(类似于数据类型),而是 cells。可以把它们想象成 rsGetCellAt 和 rsSetCellAt。

函数
rsAllocationCopy1DRange 在 allocation 之间复制连续单元格
rsAllocationCopy2DRange 在 allocation 之间复制矩形区域的单元格
rsAllocationVLoadX 从标量的 allocation 获取向量
rsAllocationVStoreX 将向量存储到标量的 allocation 中
rsGetElementAt 从 allocation 返回一个单元格
rsGetElementAtYuv_uchar_U 获取 YUV allocation 的 U 分量
rsGetElementAtYuv_uchar_V 获取 YUV allocation 的 V 分量
rsGetElementAtYuv_uchar_Y 获取 YUV allocation 的 Y 分量
rsSample 从纹理 allocation 中采样值
rsSetElementAt 设置 allocation 的一个单元格

对象特性函数

以下函数可用于查询 Allocation、Element 或 Sampler 对象的特性。这些对象是从 Java 创建的。您无法从脚本中创建它们。

Allocations

Allocations 是用于向 RenderScript 内核传递数据和从 RenderScript 内核接收数据的主要方法。

它们是结构化的单元格集合,可用于存储位图、纹理、任意数据点等。

这个单元格集合可能具有多个维度(X、Y、Z、Array0、Array1、Array2、Array3)、面(用于立方体贴图)和细节级别(用于 mipmapping)。

有关创建 Allocations 的详细信息,请参阅 android.renderscript.Allocation

Elements

在 RenderScript 中,“element”一词的用法有些模糊,它既表示 Allocation 单元格的类型信息,也表示该类型的实例化。例如

  • rs_element 是类型规范的句柄,并且
  • 在诸如 rsGetElementAt() 的函数中,“element”表示类型的实例化,即 Allocation 的一个单元格。

以下函数允许您查询类型规范的特性。

Element 可以指定 C 语言中找到的简单数据类型,例如整数、浮点数或布尔值。它还可以指定 RenderScript 对象的句柄。基本类型列表请参阅 rs_data_type

Elements 可以指定基本类型的固定大小向量版本(大小为 2、3 或 4)。Elements 可以组合成复杂的 Elements,创建类似于 C 结构定义。

Elements 还可以有一个 kind,它是用于解释像素数据的语义信息。请参阅 rs_data_kind

创建常见元素的 Allocations 时,您只需使用许多预定义 Element 中的一个,例如 F32_2

要创建复杂的 Elements,请使用 Element.Builder Java 类。

Samplers

Sampler 对象定义如何在内核中将 Allocations 读取为结构。请参阅 android.renderscript.S

函数
rsAllocationGetDimFaces 存在多个面
rsAllocationGetDimLOD 存在细节级别
rsAllocationGetDimX X 维度的大小
rsAllocationGetDimY Y 维度的大小
rsAllocationGetDimZ Z 维度的大小
rsAllocationGetElement 获取描述 Allocation 单元格的对象
rsClearObject 释放对象
rsElementGetBytesSize Element 的大小
rsElementGetDataKind Element 的种类
rsElementGetDataType Element 的数据类型
rsElementGetSubElement 复杂 Element 的子元素
rsElementGetSubElementArraySize 复杂 Element 子元素的数组大小
rsElementGetSubElementCount 子元素数量
rsElementGetSubElementName 子元素的名称
rsElementGetSubElementNameLength 子元素名称的长度
rsElementGetSubElementOffsetBytes 实例化子元素的偏移量
rsElementGetVectorSize Element 的向量大小
rsIsObject 检查空句柄
rsSamplerGetAnisotropy Sampler 的各向异性
rsSamplerGetMagnification Sampler 放大值
rsSamplerGetMinification Sampler 缩小值
rsSamplerGetWrapS Sampler Wrap S 值
rsSamplerGetWrapT Sampler Wrap T 值

内核调用函数和类型

rsForEach() 函数可用于调用脚本的根内核。

其他函数用于获取正在执行的内核调用的特性,例如维度和当前索引。这些函数接受 rs_kernel_context 作为参数。

类型
rs_for_each_strategy_t 建议的单元格处理顺序
rs_kernel 内核函数的句柄
rs_kernel_context 内核调用上下文的句柄
rs_script_call_t 单元格迭代信息
函数
rsForEach 启动一个内核
rsForEachInternal (内部 API)在当前 Script 中启动内核(带有插槽号)
rsForEachWithOptions 启动带有选项的内核
rsGetArray0 指定内核上下文的 Array0 维度中的索引
rsGetArray1 指定内核上下文的 Array1 维度中的索引
rsGetArray2 指定内核上下文的 Array2 维度中的索引
rsGetArray3 指定内核上下文的 Array3 维度中的索引
rsGetDimArray0 指定内核上下文的 Array0 维度的大小
rsGetDimArray1 指定内核上下文的 Array1 维度的大小
rsGetDimArray2 指定内核上下文的 Array2 维度的大小
rsGetDimArray3 指定内核上下文的 Array3 维度的大小
rsGetDimHasFaces 指定内核上下文是否存在多个面
rsGetDimLod 指定内核上下文的细节级别数
rsGetDimX 指定内核上下文的 X 维度的大小
rsGetDimY 指定内核上下文的 Y 维度的大小
rsGetDimZ 指定内核上下文的 Z 维度的大小
rsGetFace 指定内核上下文的 Face 坐标
rsGetLod 指定内核上下文的细节级别维度中的索引

输入/输出函数

这些函数用于

  • 向 Java 客户端发送信息,以及
  • 发送已处理的 allocation 或接收下一个要处理的 allocation。

函数
rsAllocationIoReceive 从队列接收新内容
rsAllocationIoSend 向队列发送新内容
rsSendToClient 向客户端发送消息,非阻塞
rsSendToClientBlocking 向客户端发送消息,阻塞

调试函数

以下函数旨在用于应用开发期间。不应在发布的生产应用中使用它们。

函数
rsDebug 记录消息和值

图形函数和类型

RenderScript 的图形子系统在 API 级别 23 时已移除。