在 安 卓 设 备 上 对 移 动 游 戏 进 行 性 能 分 析 和 优 化 Remi Breton 乐 逗 游 戏
为 什 么 要 进 行 分 析 与 优 化 访 问 多 个 设 备 和 用 户 减 少 安 卓 安 装 包 (APK) 大 小 来 增 加 下 载 量 提 高 游 戏 性 能 和 改 善 加 载 时 间 找 出 性 能 瓶 颈 优 化 和 减 少 开 发 工 作 量
中 国 市 场 概 况
中 国 排 名 前 20 位 的 设 备 三 星 三 星 HTC HTC 三 星 三 星 HTC 摩 托 罗 拉 HTC HTC - Galaxy S - Galaxy S 2 - Desire - Desire HD - Galaxy S 3 - Galaxy Ace - Desire S - Defy - Incredible S - Wildfire 三 星 三 星 魅 族 谷 歌 小 米 HTC 三 星 三 星 现 代 三 星 - Galaxy Note 2 - Galaxy Note - M9 - Galaxy Nexus - Mi-One - Wildfire S - Galaxy SL - Galaxy Tab - S800 - Galaxy Gio * 地 瓜 游 戏 中 心 在 2011 年 到 2013 年 之 间 收 集 的 数 据
图 形 处 理 器 (GPU) 供 应 商 Adreno - PowerVR - Mali - Tegra - Vivante - VideoCore - * 软 件 渲 染 器 - 44.7 % 26.7 % 19.1 % 1.6 % 1.6 % 0.5 % 5.8 %
中 央 处 理 器 (CPU) 指 令 集 架 构 ARMv5 0.3% ARMv7 81.1% ARMv6 18.5% x86 0.1%
ARMv7 图 形 OpenGL ES 图 形 处 理 器
ARMv7 规 格 随 机 存 取 存 储 器 (RAM) 中 央 处 理 器 (CPU) * 97% 的 1000 MHz 总 线 为 单 核 CPU
ARMv7 目 标 设 备 OpenGL ES : 2.0 物 理 内 存 : 512 mb CPU 内 核 : 单 核 心 CPU 速 度 : 1000 MHz 安 卓 API : 2.3 覆 盖 中 国 74% 的 设 备 覆 盖 中 国 91% 的 ARMv7 设 备 前 9 位 三 星 Galaxy S 三 星 Galaxy S2 三 星 Galaxy S3 三 星 Galaxy Note HTC Desire HTC Desire HD HTC Desire S HTC Incredible S 魅 族 M9
ARMv6 图 形 OpenGL ES 图 形 处 理 器 供 应 商
ARMv6 规 格 随 机 存 取 存 储 器 (RAM) 中 央 处 理 器 (CPU)
ARMv6 目 标 设 备 ( 高 ) OpenGL ES : 2.0 物 理 内 存 : 256 mb CPU 内 核 : 单 核 心 CPU 速 度 : 600 MHz 安 卓 API : 2.3 覆 盖 中 国 93% 的 设 备 覆 盖 中 国 60% 的 ARMv6 设 备 前 8 位 三 星 Galaxy Ace 三 星 Galaxy Gio 三 星 Galaxy Mini 三 星 Galaxy 550 HTC Wildfire S HTC Legend 东 信 MTW20 华 为 Sonic
ARMv6 目 标 设 备 ( 低 ) OpenGL ES : 物 理 内 存 : CPU 内 核 : 1.1 256 mb 单 核 心 前 6 位 HTC Wildfire HTC Hero HTC Magic *CPU *CPU *GPU CPU 速 度 : 安 卓 API : 528 MHz 2.2 华 为 C8500 摩 托 罗 拉 Backflip a 摩 托 罗 拉 Cliq *CPU *GPU *GPU 覆 盖 中 国 99% 的 设 备 覆 盖 中 国 95% 的 ARMv6 设 备 * 75% 的 CPU 渲 染
Unity 支 持 中 央 处 理 器 指 令 集 OpenGL ES 安 卓 API ARMv6 ARMv7 x86 1.x 2.0 3.0 3.1 最 小 最 大 Unity 3.5 2.0.1 4.2 Unity 4.0 2.0.1 4.2 Unity 4.1 2.0.1 4.2 Unity 4.2 2.0.1 4.2 Unity 4.3 2.3.1 4.3 Unity 4.5 Unity 4.6 Unity 5.0 * * 自 动 自 动 自 动 自 动 自 动 自 动? 2.3.1 2.3.1 2.3.1 4.4 4.4 4.4
了 解 内 存
RAM 内 存 分 配 256 mb 512 mb - 物 理 内 存 ( 统 一 ) 50 mb ~54 mb ~130 mb - Linux 内 核 40 mb ~72 mb ~34 mb ~72 mb ~120 mb - 安 卓 操 作 系 统 进 程 ( 隐 藏 ) - 进 程 ( 持 续 & 可 见 ) - 系 统 - android.process.acore - com.android.sysmui - com.android.phone - com.android.smspush - com.android.nfc 30 mb 20 mb 10 mb ~95 mb ~190 mb - 可 用 0 mb
内 存 占 用 同 样 的 游 戏 在 不 同 的 设 备 上 ( 安 卓 安 装 包 大 小 为 35mb) Adreno PowerVR Tegra
Shell 命 令 dumpsys meminfo dumpsys meminfo <PID> cat /proc/meminfo procrank ( 所 有 进 程 和 进 程 类 ) ( 目 标 进 程 ) ( 整 个 设 备 ) ( 包 括 系 统 进 程 在 内 的 所 有 进 程 ) * 并 不 总 是 可 用 进 程 - 可 以 通 过 USB 远 程 桌 面 执 行 adb shell dumpsys meminfo - 可 以 记 录 到 文 件 或 剪 贴 板 adb shell dumpsys meminfo >FileName.txt adb shell dumpsys meminfo Clip * 返 回 数 据 会 根 据 设 备 安 卓 版 本 的 不 同 而 有 所 不 同
了 解 纹 理
OpenGL ES 内 部 纹 理 格 式 内 部 纹 理 格 式 R G B A L D S Bits Unity ALPHA8 8 8 Alpha 8 LUMINANCE8 8 8 LUMINANCE4_ALPHA4 4 4 8 LUMINANCE8_ALPHA8 8 8 16 RGB565 5 6 5 16 RGB 16 Bit RGB8 8 8 8 24 RGB 24 Bit RGB10 10 10 10 30 RGBA4 4 4 4 4 16 RGBA 16 Bit RGB5_A1 5 5 5 1 16 RGBA8 8 8 8 8 32 RGBA 32 Bit RGB10_A2 10 10 10 2 32 DEPTH24_STENCIL8 24 8 32 深 度 ( 玩 家 设 置 ) DEPTH_COMPONENT16 16 16 深 度 ( 玩 家 设 置 ) DEPTH_COMPONENT24 24 24 DEPTH_COMPONENT32 32 32
固 定 速 度 的 纹 理 100% 45% 27% 7% 3% >1% ETC1 > 所 有 OpenGL ES 2.0 & 更 高 版 本 的 图 形 处 理 器 ATC> Andreno PVRT> PowerVR(iOS 100%) ETC2 > 所 有 OpenGL ES 3.0 & 更 高 版 本 的 图 形 处 理 器 DXTC> Tegra & Vivante ASTC> 支 持 的 * OpenGL ES 3.0 图 形 处 理 器 ( 苹 果 A8) * Adreno 420 / Mali Midgard 2nd-Gen / Tegra K1 / PowerVR Series6XT / Vivante GC7000
RGBA 32 RGB ETC RGB PVR RGBA PVR RGBA 16 32 bpp 4 bpp 4 bpp 4 bpp 16 bpp 颜 色 比 较 alpha 比 较 大 小 256 kb (1 纹 理 256kb) 64 kb (2 纹 理 32kb) 64 kb (2 纹 理 32kb) 32 kb (1 纹 理 32kb) 128 kb (1 纹 理 128kb)
着 色 器
修 改 与 优 化 经 过 修 改 需 要 Split Alpha 的 着 色 器 创 建 自 定 义 着 色 器 使 用 Unity 内 置 的 移 动 着 色 器 减 少 指 令 集 的 着 色 器 数 量 避 免 舍 弃 固 定 功 能 ( 阿 尔 法 测 试 ) 限 制 Unity 遗 留 的 图 形 用 户 界 面 系 统 Unity 遗 留 的 字 体 系 统
多 次 构 建 创 造
优 点 / 缺 点 优 点 - 提 高 每 个 目 标 的 性 能 - 在 更 好 的 手 机 上 实 现 更 好 的 图 形 - 每 个 目 标 的 文 件 包 更 小 缺 点 - 更 多 的 资 产 创 建 和 管 理 - 更 多 的 代 码 创 建 和 管 理 - 更 多 的 着 色 器 变 化 - 构 建 分 布 的 复 杂 性 - 更 多 的 测 试 和 调 试
纹 理 优 化
颜 色 拆 分 Alpha 通 道 [ R ] [ G ] [ B ] [ A ] [ R G B ] [ R G B ]
删 除 副 本 前 后 颜 色 Alpha 使 用 的 4 种 纹 理 使 用 的 3 种 纹 理
调 整 纹 理 大 小 根 据 设 备 屏 幕 大 小 调 整 纹 理 尺 寸 颜 色 256 x 256 Alpha 256 x 256 Alpha 64 x 64 需 要 分 辨 率 可 以 减 少
方 形 2 次 幂 (SPOT) 只 使 用 SPOT 纹 理 32 x 32 64 x 64 128 x 128 256 x 256 512 x 512 1024 x 1024 2048 x 2048 转 换 非 方 形 纹 理 分 割 纹 理 - 创 建 新 对 象 合 并 纹 理 / 创 建 贴 图 集 - 改 变 对 象 UV 坐 标
减 少 文 件 包 大 小 [ 1024 x 1024 ] 在 内 存 当 中 总 是 采 用 512 kb 316 kb 的 安 卓 安 装 包 287 kb 的 安 卓 安 装 包
其 他 资 产 优 化
几 何 数 据 缩 减 / 删 除 顶 点 索 引 顶 点 颜 色 UV 1 / UV 2 正 常 蒙 皮 权 重
在 Unity 中 动 画 键 缩 减 在 FBX 中
音 频 尺 寸 缩 减 视 频 强 制 使 用 单 声 道 转 换 为 OGG/MP3 格 式 减 少 比 特 率 (kbps) 创 建 实 时 影 像 转 换 为 OGG 格 式 减 少 比 特 率 (kbps) ( 使 用 不 同 品 质 的 视 频 / 音 频 ) http://developer.android.com/guide/appendix/media-formats.html
性 能 分 析
找 出 性 能 瓶 颈 中 央 处 理 器 顶 点 处 理 绘 图 调 用 太 多 顶 点 太 多 复 杂 的 脚 本 或 物 理 每 个 顶 点 的 计 算 太 多 带 宽 片 元 处 理 未 压 缩 的 大 纹 理 片 元 太 多, 超 量 绘 制 高 分 辨 率 的 帧 缓 冲 (framebuffer) 每 个 片 元 的 计 算 太 多
减 少 内 存 占 用 优 化 类 型 资 产 修 改 ( 纹 理 音 频 模 型 动 画 ) 代 码 修 改 ( 内 存 管 理 内 存 泄 露 ) 解 决 性 能 瓶 颈 CPU 中 央 处 理 器 GPU 图 形 处 理 器 减 少 文 件 包 大 小
分 析 工 具 Adreno - PowerVR - Mali - Tegra - Vivante - VideoCore - Adreno Profiler PVRTune / PVRTrace Mali Graphics Debugger / ARM DS-5 Streamline PerfHUD / Tegra Graphics Debugger / Tegra System Profiler 无 无 All - Unity - Android SDK tools ( 安 卓 软 件 开 发 工 具 包 ) Unity Profiler( 仅 支 持 Unity 专 业 版 )
分 析 器 要 求 根 设 备 ( 可 选 ) USB 调 试 启 用 ( 开 发 人 员 选 项 ) 互 联 网 权 限 启 用 的 安 卓 安 装 包 - 在 AndroidManifest.xml 文 件 中 <uses-permission android:name="android.permission.internet" /> - 在 Unity 中
连 接 过 程 启 动 设 备 上 的 PVRPerfServer PVRTune su cd /data/data/com.powervr.pvrhub/bin./pvrhubdaemon & 安 卓 调 试 桥 (ADB) 命 令 adb forward tcp:6520 tcp:6520 启 动 PVRTune 并 连 接 到 : pvrtune://localhost 启 动 目 标 应 用 程 序
PVRTune Core Overview - Frames per second (FPS) - GPU task load - CPU load - Memory total / use - Shader Clock Cycle per pixel - Shader Clock Cycle per vertex - Shader load: Pixel - Shader load: Vertex Primitive Clipping - Primitives per frame: on-screen - Vertice per frame: on-screen Texturing - Texture unit(s) load
PerfHUD ES 连 接 过 程 关 闭 目 标 应 用 程 序 安 卓 调 试 桥 (ADB) 命 令 adb shell setprop debug.perfhudes 1 启 动 目 标 应 用 程 序 启 动 PerfHUB ES
性 能 仪 表 板 (Performance DashBoard) Speed Bar Directed Tests - Ignore Draw Calls - Null Fragment Shader CPU Monitor - Draw Calls Per Frame Batching Histogram - Draw Calls Per Frame Status Bar - fps - Primitive Count
帧 调 试 器 Frame Scrubber - FBO (FrameBuffer Object) Frame Overview - Total Vertices / Primitives - Texture Number - Program Number Geometry Viewer - Attribute State Viewer Texture Viewer Shader Viewer
帧 分 析 器 Bucket Definition Unit Utilization Draw Call Unit Utilization Draw Call Unity Bottleneck Draw Call Duration Draw Call Shader Waits Vertex Count Triangle Count Vertex Attribute Count
Adreno 分 析 器 连 接 过 程 启 动 目 标 应 用 程 序 启 动 Adreno 分 析 器 Click 'Connect...' to open this - Select Target Application - Click 'Connect' button
图 示 记 录 器 指 标 查 看 EGL (App Metrics Grapher) - FPS GPU General - % Busy GPU Shader Processing - % Shaders Busy - % Time Shading Fragment/Vertices 覆 盖 GL API - Disable Draw Elements GL Texture State - Force Linear/Nearset Filtering - Force Small Textures
Srubber
注 解
GL 文 本 / 帧 统 计 混 合 - 已 启 用 选 取 - 已 启 用 渲 染 调 用 - # gldraw 调 用 几 何 - 总 顶 点 - 总 图 元 杂 项 - 总 纹 理 使 用 纹 理 格 式
顶 点 数 据 索 引 数 据 元 数 据 几 何 数 据 顶 点 UV1 UV2 顶 点 索 引 顶 点 三 角
纹 理 浏 览 器 /Mipmap 贴 图 视 图
程 序 浏 览 器 / 着 色 器 视 图
连 接 过 程 Android Device Monitor 启 动 Android Device Monitor
Requirement: Android SDK Tool 20 Android 4.1 (API Level 16) Systrace
Trace
Tracer for OpenGL ES 连 接 过 程 Kill Target Application Get 'Application Package' & 'Main Activity' name aapt dump xmltree OGLES2Water.apk AndroidManifest.xml Set names in options.. Press to start.
Tracer for OpenGL ES
Unity Profiler 连 接 过 程 Build APK using setting.. - Development Build - Autoconnect Profiler ADB command adb forward tcp:54999 localabstract:unity-com.iunity.angrybots Change Active Profiler to "AndroidPlayer(ADB@127.0.0.1:54999)" Press to start.
谢 谢