OpenGLRenderer 配置

本文档将介绍以充分利用硬件为目标的性能优化。

OpenGLRenderer (libhwui) 属性

本文档将列出您可以用来控制 Android 的 2D 硬件加速渲染管道的所有属性。将 device.mk 中的这些属性设置为 PRODUCT_PROPERTY_OVERRIDES

适用于所有 Android 版本的属性

属性 类型 默认值 说明
ro.zygote.disable_gl_preload boolean false 用于在启动时启用/停用 Zygote 中的 EGL/GL 驱动程序预加载。当此属性设为 false 时,Zygote 将通过调用 eglGetDisplay(EGL_DEFAULT_DISPLAY) 预加载 GL 驱动程序。 目标是加载 Zygote 中的动态库代码,以便与所有其他进程共享。如果驱动程序不支持共享,则将此属性设为 true。

适用于 Android 8.0 及更低版本的属性

属性 类型 默认值 说明
ro.hwui.disable_scissor_opt boolean false

用于启用或停用剪刀优化。接受的值为 true 和 false。如果启用剪刀优化,则 OpenGLRenderer 会尝试选择性启用和停用 GL 剪刀测试,以尽可能不使用剪刀。

如果停用优化,则 OpenGLRenderer 会让 GL 剪刀测试保持启用状态,并根据需要更改剪刀矩形。当剪刀矩形的更改频率超过启用或停用剪刀测试的频率时,某些 GPU(例如 SGX 540)的性能会更好。

ro.hwui.texture_cache_size float 24 定义每个进程纹理缓存的大小(以兆字节为单位)。我们建议使用大容量的缓存,以足够容纳多个 32 位纹理的屏幕(例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 4 MB 的内存,因此缓存应至少为 20 MB)。
ro.hwui.layer_cache_size float 16 定义每个进程图层缓存的大小(以兆字节为单位)。我们建议使用大容量的缓存,以足够容纳 4 个 32 位屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 4 MB 的内存,因此缓存应至少为 16 MB。
ro.hwui.gradient_cache_size 0.5 float 定义每个进程渐变缓存的大小(以兆字节为单位)。单次渐变通常占用 1-4 KB 的内存。建议使用大容量的缓存,以足够容纳至少 12 次渐变。
ro.hwui.patch_cache_size integer 128 定义每个进程中 9-patch 缓存的大小(以千字节为单位)。此缓存仅保留顶点数据,因此可以保持小容量。每个顶点由 4 个浮点数(即 16 个字节)组成。
ro.hwui.path_cache_size float 4 定义每个进程路径缓存的大小(以兆字节为单位)。我们建议使用大容量缓存,以足够容纳至少一个 32 位纹理的屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 4 MB 的内存,因此缓存应至少为 4 MB。
ro.hwui.shape_cache_size float 1 定义每个进程图形缓存的大小(以兆字节为单位)。该值由多个缓存(如圆形和圆角矩形)使用。我们建议使用大容量缓存,以足够容纳至少一个 8 位屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 1 MB 的内存,因此缓存应至少为 1 MB。
ro.hwui.drop_shadow_cache_size float 2 定义每个进程文字阴影缓存的大小(以兆字节为单位)。我们建议使用大容量缓存,以足够容纳两个 8 位纹理的屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 1 MB 的内存,因此缓存应至少为 2 MB。
ro.hwui.r_buffer_cache_size float 2 定义每个进程的渲染缓冲区缓存的大小(以兆字节为单位)。我们建议您使用大容量的缓存,以足够容纳 2 个 8 位的屏幕。例如,在 1280x800 显示屏上,一次全屏缓冲使用大约 1 MB 的内存,因此缓存应至少为 2 MB。如果设备支持 4 位或 1 位模板缓冲,则可以使用更小容量的缓存。
ro.hwui.texture_cache_flush_rate float 0.6 系统会定义内存清理之后保留的纹理缓存所占的比例。当系统需要回收所有应用的内存时,就会触发内存清理。我们建议在这种情况下释放大约 50% 的缓存。
ro.hwui.text_small_cache_width integer 1024 定义默认字体缓存的宽度(以像素为单位)。上限取决于 GPU 上传纹理的速度。 我们建议该宽度不低于 1024 像素、不超过 2048 像素。您还应该使用二次方值。
ro.hwui.text_small_cache_height integer 256 定义默认字体缓存的高度(以像素为单位)。上限取决于 GPU 上传纹理的速度。 我们建议该高度不低于 256 像素、不超过 1024 像素。
ro.hwui.text_large_cache_width integer 2048 定义大号字体缓存的宽度(以像素为单位)。此缓存用于字形过大难以适应默认字体缓存的情形。上限取决于 GPU 上传纹理的速度。我们建议该宽度不低于 2048 像素、不超过 4096 像素。您还应该使用二次方值。
ro.hwui.text_large_cache_height integer 512 定义大号字体缓存的高度(以像素为单位)。大号字体缓存用于字形过大难以适应默认字体缓存的情形。上限取决于 GPU 上传纹理的速度。 我们建议该高度不低于 512 像素、不超过 2048 像素。您还应该使用二次方值。
hwui.text_gamma_correction string lookup 选择文字伽马校正方法。有以下四种方法可供选择:
  • lookup3:基于查询表校正。伽马校正针对黑白文字的表现并不相同(请参见下方的阈值)。
  • lookup:基于单个查询表校正。
  • shader3:由 GLSL 着色器应用校正。伽马校正针对黑白文字的表现并不相同(请参见下方的阈值)。
  • shader:由 GLSL 着色器应用校正。
查询伽马校正在着色器数学受限的 GPU 上表现最出色。着色器伽马校正是节省内存的最佳选择。我们建议使用默认的 lookup 技术,该技术在质量、速度和内存使用方面提供了很好的折衷方案。
hwui.text_gamma float 1.4 定义用于文字伽马校正的伽马值。 该值可以根据设备使用的显示屏进行调整。
hwui.text_gamma.black_threshold integer 64 定义应用黑色伽马校正的亮度阈值上限。 必须在 0-255 的范围内定义该值。
hwui.text_gamma.white_threshold integer 192 定义应用白色伽马校正的亮度阈值下限。 必须在 0-255 的范围内定义该值。
hwui.use_gpu_pixel_buffers boolean true 用于在 OpenGL ES 3.0 硬件上启用或停用 PBO。渲染器会使用 PBO 来执行异步纹理上传,尤其是字体缓存。该属性应始终保持启用状态,但如果使用 PBO 导致出现损坏或性能很低的情况,则可以在设备开发期间停用该属性。因此,该属性不是只读属性。