# Game **Repository Path**: zhangkede/game ## Basic Information - **Project Name**: Game - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-16 - **Last Updated**: 2026-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Game — Android 原生游戏开发骨架 & 学习路线 一个基于 **GameActivity + NDK + OpenGL ES 3.0** 的原生游戏工程, 在此之上补齐了真实游戏必需的四大件:**固定步长循环、帧时间统计、帧同步(Swappy)、精灵批渲染**。 同时附带一套完整的「**Android 应用开发 → 游戏开发**」知识体系文档。 --- ## 一、工程里有什么 | 文件 | 作用 | 对应知识 | |---|---|---| | `app/src/main/cpp/main.cpp` | 主循环:排空事件 → 输入 → 固定步长 N 次 → 插值渲染 | [05-游戏循环](docs/guide/05-游戏循环与客户端架构.md) | | `GameLoop.h/.cpp` | 固定步长 + 累加器 + 螺旋死亡防护 + avg/P95/worst 统计 | [05-游戏循环](docs/guide/05-游戏循环与客户端架构.md) | | `FramePacing.h/.cpp` | Swappy 封装,替换 `eglSwapBuffers`,不可用自动回退 | [07-性能优化](docs/guide/07-性能优化方法论.md) | | `SpriteBatch.h/.cpp` | 精灵批渲染:动态 VBO + 静态索引 + VAO | [03-OpenGL ES](docs/guide/03-OpenGL-ES实战.md) | | `ObjectPool.h` | 定容对象池,运行期零分配 | [05-游戏循环](docs/guide/05-游戏循环与客户端架构.md) | | `Renderer.h/.cpp` | EGL 生命周期、正交投影、粒子系统(prev/curr 插值) | [02/03 章](docs/guide/03-OpenGL-ES实战.md) | **交互**:触摸/拖动屏幕会在该位置喷发粒子(对象池 + 合批),观察 logcat: ``` [Game] particles=2048/2048 spriteDrawCalls=1 sprites=2048 [Frame] fps=60.1 avg=16.6ms p95=17.2ms worst=21.5ms steps=1 frames=612 ``` `spriteDrawCalls=1` 就是合批的证明:2000 个精灵只发了一次 `drawElements`。 --- ## 二、快速开始 ```bash ./gradlew :app:assembleDebug adb install -r app/build/outputs/apk/debug/app-debug.apk adb logcat -s AndroidOut # 看 [Frame] / [Game] 统计 ``` > Gradle 需要 **JDK 25**(见 `gradle/gradle-daemon-jvm.properties`),首次构建会自动下载。 --- ## 三、文档导航 ### 📘 知识体系(从零到精通) | # | 文档 | 内容 | |---|---|---| | 00 | [总览与心智模型](docs/guide/00-总览与心智模型.md) | 应用 vs 游戏的思维差异、一帧的生命周期 | | 01 | [数学基础](docs/guide/01-数学基础.md) | 向量/矩阵/MVP/四元数/法线逆转置推导 | | 02 | [GPU 架构与渲染管线](docs/guide/02-GPU架构与渲染管线.md) | 管线全流程、深度测试、TBR 移动端架构 | | 03 | [OpenGL ES 实战](docs/guide/03-OpenGL-ES实战.md) | EGL 生命周期、VAO/FBO/UBO、纹理、常见坑 | | 04 | [Vulkan](docs/guide/04-Vulkan.md) | 对象模型、同步三件套、移动端要点 | | 05 | [游戏循环与架构](docs/guide/05-游戏循环与客户端架构.md) | 固定步长、ECS、对象池、内存 | | 06 | [物理碰撞与动画](docs/guide/06-物理碰撞与动画.md) | 积分、宽相/窄相、手感、骨骼蒙皮 | | 07 | [性能优化方法论](docs/guide/07-性能优化方法论.md) | 瓶颈定位、CPU/GPU/带宽优化、合批实测 | | 08 | [网络同步](docs/guide/08-网络同步.md) | 帧同步 vs 状态同步、延迟补偿 | | 09 | [引擎生态与职业路线](docs/guide/09-引擎生态与职业路线.md) | Unity/UE/原生对比、AGDK 全家桶 | | 10 | [分级路线与自检](docs/guide/10-分级路线与自检清单.md) | L1→L5 路线 + 每级自检题 + 资源 | | 11 | [本工程代码导读](docs/guide/11-本工程代码导读.md) | 源码逐文件讲解与验证方法 | ### 📗 面试篇 | # | 文档 | 题数 | |---|---|---| | 00 | [面试总纲](docs/interview/00-面试总纲.md) | 答题方法论、评分点 | | 01 | [图形基础](docs/interview/01-图形基础.md) | 5 题(MVP、深度、透明、AA、四元数) | | 02 | [OpenGL ES](docs/interview/02-OpenGL-ES.md) | 4 题(VAO、FBO/UBO、纹理、shader 卡顿) | | 03 | [移动端与 Android](docs/interview/03-移动端与Android.md) | 5 题(Surface、TBR、帧同步、输入) | | 04 | [架构与物理](docs/interview/04-架构与物理.md) | 4 题(固定步长、同步方案、ECS、碰撞) | | 05 | [设计排障与 JNI](docs/interview/05-设计排障与JNI.md) | 5 题(30fps 排查、万敌渲染、引擎设计、JNI) | --- ## 四、学习建议 **有 Android 基础的人最大的优势**是生命周期、NDK/JNI、系统级调试与性能意识; **最大的短板**是图形学与数学。 推荐顺序:`00 → 01 → 02 → 03 → 05 → 07`,然后按 `10` 的分级清单自测。 每学完一章,就在本工程里改代码验证(比如学完合批,就去看 `SpriteBatch` 的 `drawCallCount`)。 --- ## 五、构建状态 - ✅ C++ 代码已通过 NDK 28 的 `clang++ -fsyntax-only -Wall -Wextra` 检查 (**启用 Swappy** 与 **不启用 Swappy** 两条编译路径均无 error) - ⚠️ 完整 Gradle 构建需要 JDK 25;若 `~/.gradle/jdks` 的下载锁被其他进程占用 (常见于 IDE 的 `kotlinLSPProjectDeps`),等它结束后重新执行 `./gradlew :app:assembleDebug` 即可