对象创建约束
尽量不要在构造函数之外创建对象,至少应努力遵守这一原则。
TNWX · Javen205/TNWX
TNWX 是一个基于 TypeScript 与 Node.js 的微信系开发脚手架,覆盖微信公众号、微信支付、微信小游戏、微信小程序以及企业微信/企业号等场景。其特点是可以较快速地集成到任意 Node.js 框架中,如 Express、Nest、Egg、Koa 等。仓库标签...
本仓库是 cocos2d 面向 Android 平台的 Java 移植版本,代码基线来自 cocos2d-android-0.82,并在此基础上从 cocos2d-iphone 0.99.4 继续移植。README 的叙述重心并不在玩法或 API 教程,而在一个非常具体的问题上:如何在 Java/Android 环境下减少垃圾回收(GC)带来的卡顿。作者围绕这一点整理了一整套编码约定与工具类,并记录了移植过程中对调度器、纹理生命周期、线程模型等部分的改造思路。
需要说明的是,README 并未给出 Stars、构建脚本、依赖清单或功能完整度声明,仓库中提到的若干 Demo 是否仍可直接运行也需自行核验。下文内容均以 README 中明确写出的信息为依据。
尽量不要在构造函数之外创建对象,至少应努力遵守这一原则。
需要更新状态时调用对象的 `set` 方法,而不是每次都 new 一个新对象。
`CG/cc<Typename>Utils` 系列工具类被设计为不产生垃圾。
`org.cocos2d.types.util.PoolHolder` 持有若干对象池,用于复用 `CGPoint` 这类小对象;该类面向栈式使用,要求 `get()` 的调用次数不低于 `free()` 的次数。多线程场景另有 `ConcOneClassPool`。
`org.cocos2d.utils.collections` 包内的类主要供内部使用,不产生垃圾,用于频繁变更的数据结构。
引入 Javolution 的 `TextBuilder` 作为 `StringBuilder` 的替代,同样不产生垃圾;README 举例说明 `CCDirector` 的 `showFPS()` 已不再是垃圾产生源。
`org.cocos2d.utils` 包内提供 `PlistParser`,可将 plist 读入 `HashMap`。
CCScheduler 现在可以使用 UpdateCallback 接口替代「按方法名调度调用」的方式。README 认为这是更符合 Java 习惯的方案,并且不会为 GC 制造垃圾。
README 给出了几条与 Android 线程相关的经验:
Activity 暂停时所有 OpenGL 资源都会被销毁,需要重新创建。纹理来源各不相同,因此 CCTexture2D 中定义了一个接口,其中包含 load() 方法,实现该接口的类不得持有正在使用它的 CCTexture2D 引用。README 说明通常无需关心这一机制,例外是使用自己的 Bitmap 初始化纹理时,load() 的实现需由使用者自行完成(可参考 ActionsTest.java 中 ActionDemo 构造函数)。此外,通过 CCSprite.sprite(Bitmap image, String key) 从位图初始化精灵时,位图会被复制并保存在内存中以便重建,应尽量避免这种 CCTexture2D 初始化方式;调用 initWith... 是自由的,但重建逻辑需自行负责。
移植自 iPhone 的 Sky Tower 场景使用固定的 320x480 尺寸,因此 CCDirector 的代码被修改为可以请求指定尺寸的 screenSize_。README 认为这符合 CCDirector 的逻辑预期,但会使 2D 投影变为默认投影。示例做法是:先调用 CCDirector.sharedDirector().setScreenSize(320, 480),再通过 createLayoutParams() 依据 DisplayMetrics 计算等比缩放后的宽高,并以 Gravity.CENTER 居中显示。
CCDirector 的 pause/resume 并不意味着渲染线程必须停止;但 Activity 暂停时确实需要停止渲染线程,因此 Activity 的 onPause/onResume 与 CCDirector 的 pause/resume 应当是相互独立的方法。
README 未提供 Gradle 配置、依赖版本或构建命令,仅给出以下线索:
http://code.google.com/p/cocos2d-android-1/,README 称该处有若干 Demo 可供查看。Bitmap 纹理。由于 Google Code 服务已停止,上述外链能否访问、Demo 是否仍可运行,均需自行核验。
这个仓库更适合作为「Java 移动端 2D 引擎在 GC 压力下的工程实践」来阅读,而不是当作入门教程:
PoolHolder 与 ConcOneClassPool,理解栈式对象池的 get/free 配对约束。CCScheduler 的 UpdateCallback 改造,对比传统按方法名调度的差异。CCTexture2D 的 load() 接口与 Activity 生命周期,理解 OpenGL 资源销毁后重建的责任划分。阅读时建议以 README 列出的约定为检查清单,逐条在源码中定位对应实现,避免把文档中的设计意图误当作已验证的功能。
Farbrausch 2001—2011 年 demo 工具源码合集,使用 C++,涉及 demoscene 与 D...
jfduke3d 是 JonoF 对 3D Realms《Duke Nukem 3D》的源码移植,基于其 Build...
id Software 以 GPL 许可证发布的《雷神之锤3竞技场》(Quake III Arena)源...