在实时3D应用程序中(在Android Studio和OpenGL ES中使用java编写,虽然这对于这个问题并不重要)但帧速率开始显着下降,因为每帧操作重载堆/ gc 使用线程安全的final
对象,每个对象为大多数操作转换new
个对象。 (例如,添加两个3d点一起创建了一个new
点对象,丢弃旧点。)
Android的垃圾收集器很快就发现了年轻人堆中的巨大负担,但是在滞后之后暂时冻结了游戏。解决方案是使用编写为寄存器的不安全对象(操作修改原始点而不是转换新点)并将这些类似寄存器的类存储为父类中的字段。 GC将它们快速迁移到旧堆中,避免任何真正的GC开销,直到父级被回收。
问题是,应该将临时原语(例如int i
和float t
)也存储为“寄存器”以避免java环境每次取消分配?
该项目大约有50个类,每个类有大约5个临时值,每个4个字节。它们每帧重复使用大约十次,每秒30帧,或每分钟 17MB 。将它们作为寄存器(类字段)保留在堆栈上仅 1,000字节。
这些原语是否应该存储为类对象以避免冗余重新分配?这个问题实际上是从堆栈中释放原语是否需要花费大量的CPU时间。