私はScalaでコンピューターグラフィックスアプリケーションをプログラミングしています。このアプリケーションは、RGBクラスを使用して画像内のあるポイントの色を返します。ご想像のとおり、カラーRGBオブジェクトを返す関数は何度も呼び出されます。
class RGB(val red: Int, val green: Int, val blue: Int) { }
次のようによく使用される関数getPixelRGBがあります
val color:RGB = getPixelRGB(image, x, y)
問題は、この関数を100万回呼び出すと、100万個の一意のRGBオブジェクトインスタンスが生成される可能性があることです。これは非常に魅力的な状況ではありません。これについて私が持っているいくつかの考えがあります:
getPixelRGBは、無限の回数呼び出された場合、無限の数のオブジェクトを作成する可能性がありますが、RGBに対して生成できる可能な組み合わせは最大255 * 255 * 255しかないため、無限の数のオブジェクトである必要はありません。したがって、作成されるオブジェクトの数は有限である必要があります。この関数は、オブジェクトプールを使用するように調整できます。オブジェクトプールを使用する場合は、その色に対して同じプールされたオブジェクトインスタンスを返す前に、ある時点で同じ色を返します。
このRGBをIntとしてエンコードできます。Intのメモリオーバーヘッドは通常のScala/Javaオブジェクトよりも少なく、Javaオブジェクトのメモリオーバーヘッドは余分です。Scala Int型は4バイト幅であるため、最初の3バイトはRGB値を格納できます。getPixelRGBメソッドからRGBではなくIntを返すだけで、メモリのオーバーヘッドが少なくなると思います。しかし、RGBクラスの納得を保ちながらこれを行うにはどうすればよいですか?
おそらく、そしてそれらは短命のオブジェクトであり、ガベージコレクターはそれらを迅速に再利用する必要があることを私は読みました。しかし、私はまだそれについて心配しています。GCは、私がすぐに捨てていることをどのようにして知るのですか?とても紛らわしい。
したがって、一般的に、私の質問は、このgetPixelRGBをよりメモリフレンドリーにする方法ですか?また、私もそれについて心配する必要がありますか?