我正在用 Scala 编写一个计算机图形应用程序,它使用 RGB 类返回图像中某个点的颜色。可以想象,返回颜色 RGB 对象的函数被多次调用。
class RGB(val red: Int, val green: Int, val blue: Int) { }
有一个函数 getPixelRGB 经常使用如下
val color:RGB = getPixelRGB(image, x, y)
问题是我可能会调用这个函数一百万次,然后我相信它会生成一百万个唯一的 RGB 对象实例,这是一个非常没有吸引力的情况。对此我有一些想法:
如果 getPixelRGB 被调用无数次,它可能会创建无限数量的对象,但它不一定是无限数量的对象,因为 RGB 最多只能生成 255 * 255 * 255 种可能的组合。所以创建的对象数量“应该”是有限的。可以调整此函数以使用对象池,如果它要返回与某个时间相同的颜色,则它可以返回该颜色的相同池对象实例。
我可以将此 RGB 编码为 Int。Int 的内存开销比普通的 Scala/Java 对象少,Java 对象有额外的内存开销。由于 Scala Int 类型是 4 个字节宽,前 3 个字节可以存储 RGB 值。我假设只从 getPixelRGB 方法返回 Int 而不是 RGB 会减少内存开销。但是,如何在仍然具有 RGB 类的说服力的同时做到这一点?
据说,它们是短命的对象,我已经读过垃圾收集器应该迅速回收它们。不过我还是很担心。GC 怎么知道我很快就把它扔掉了?如此混乱。
所以总的来说,我的问题是如何让这个 getPixelRGB 对内存更友好?我也应该担心吗?