RGSS2を知る(8)

Viewportの実装をメモリ消費から調べてみる。


DirectXでテクスチャやサーフェイスを作る場合、ビデオメモリかシステムメモリかどっちに取るかを選べる。
ビデオメモリが足りない場合にどのデータをどうする、とか、そういうのを自分で管理するプログラムをがんばって作るならそれでもいいが、普通は面倒なのでDirectXがよきにはからってくれるMANAGEDを指定する。
MANAGEDにすると両方に作られて、システムメモリのほうを書き換えたら自動でビデオメモリに転送してくれるし、ビデオメモリが足りなければ使ってないものを消して節約してくれる(ようだ)。
欠点はレンダーターゲットに指定できないこと。


まあ、とりあえずBitmapはMANAGEDかSYSTEMMEMで取られているのではないかと。

a = Array.new(100) do Bitmap.new(640,480) end
loop do
end

32bit色の画像を640*480サイズで作るとだいたい1.2MBとなる。
100個作れば120MBだ。
何もスクリプトを書かない状態で起動するとメモリ消費は16MBほどで、上のスクリプトを実行すると136MBとなった。
だいたい計算は合っている。

a = Array.new(100) do Viewport.new(0,0,640,480) end
loop do
end

Viewportを100個作っても16MBだった。
ビデオメモリに取得されてレンダーターゲット指定でサーフェイスを描いているとメインメモリを消費しないから、明らかにビデオメモリを超えるサイズになるよう1000個作ってもエラーは出なかった。
ビデオメモリがいっぱいだったときにシステムメモリから取得して自前で管理しているならメモリ消費が増えるはずだし、やっぱりViewportはサーフェイスを作っていないのだろう。
となるとViewportのflashとかはSprite描画時に重ねて反映しているのか。