IBitmapPager コア インタフェースは、3ds Max 2010導入され、自動制限モードをサポートするよう拡張されたビットマップ ページャに関連する設定を公開しています。
ビットマップ ページャの UI は、[カスタマイズ](Customize) > [基本設定](Preferences) > [レンダリング](Render)タブからは完全に削除され、MAXScript でのみコントロールできるようになりました。
インタフェース > コア インタフェース > IBitmapPager |
true に設定すると、ビットマップ ページャが有効になります。
false に設定すると、ビットマップ ページャが無効になります。
ページ ファイルのパスを取得/設定します。既定値は、[カスタマイズ](Customize) > [システム パスを設定](Configure System Paths) > [ページ ファイル](Page File)エントリで指定された、 getDir #pagefile で返されるページ ファイル パスです。
メモリ パディングの割合を、0.0 ~ 1.0 の範囲の値として取得/設定します。これは使用可能なメモリの割合(百分率)です。既定値は 0.2 (20%) です。
メモリ上限の割合を 0.0 ~ 1.0 の範囲の値として取得/設定します。これはパディングされたメモリの割合(百分率)です。既定値は 0.1 です。
true に設定すると、下で説明するヒューリスティックな方法によりメモリの上限が自動的に計算されます。既定値は true です。
使用可能なパディングされたメモリをメガバイト単位で取得します。
最初に、使用可能なメモリの量が計算されます。これは、ページャが割り当てできる合計量からパディング量を引いたものです。パディングは既定値では 20% です。
システムがレンダリングしない場合、上限は使用可能メモリの 50% に設定されます。たとえば、1GB のメモリが空いている場合、20% が引かれて 800 MB になり、その 50% つまり 400MB をページャが使用します。
システムがレンダリングを行う場合、ページャは自身のメモリ上限とレンダラー用に確保されているメモリの間でバランスを取ります。ページャの目標は、自身の全ビットマップに十分なメモリを保持することで、それ以外にはありません。レンダラーの目標は未知です。レンダラーのメモリ ニーズを計測する方法はないため、この目標は使用可能な全メモリと等しいものと仮定されます。この 2 つの目標が合算され、システム全体の目標となります。ページャは合計に対する自身の目標の割合と等しいメモリ量を確保します。たとえば、1GB の空きメモリ(800MB が使用可能とみなされる)があった場合、全ビットマップの合計サイズが 400 MB であれば、ページャとレンダラーの目標はそれぞれ 400MB、800MB となり、システム全体では 1200MB となります。1200MB に対する 400MB の割合は 1/3 です。このため、ページャの上限は使用可能な 800MB の 1/3、つまり 266MB に設定されます。
内部では、自動モード調整が次のイベントで行われます。NOTIFY_SYSTEM_STARTUP、NOTIFY_SYSTEM_POST_RESET、NOTIFY_FILE_POST_OPEN、NOTIFY_SYSTEM_POST_NEW、NOTIFY_PRE_RENDER、NOTIFY_POST_RENDER。
mental ray の上限は、上記のページャの調整が行われた後、ページャが確保した残りの使用可能な全メモリに等しくなります。これは、ページャによって定義されたパディングを尊重します。たとえば、1GB の空きメモリがある場合、800MB が使用可能とみなされます。ページャの上限は常に使用可能メモリの 10% ~ 50% であるため、mental ray の上限は 800MB の 50% ~ 90%、つまり 400MB ~ 720MB となります。
内部的には、ページャの上限は NOTIFY_PRE_RENDER の間に更新されます。これに対し、mental ray の上限は後でシーン オプションを変換するときに更新されるため、最新のページャ上限を使用できます。
3ds Max 2011 より前のリリースでは、MAXScript で複数の render() 呼び出しが実行されると、前回のレンダリング結果がメモリに残り、自動的にリリースされませんでした。それらを消すためには、ユーザは手動ガベージ コレクションを呼び出さなくてはなりませんでした。このためメモリおよびディスクの領域がビットマップ ページャのために無駄に使われてしまっていました。
この問題は、3ds Max 2011 では定期的なガベージ コレクションをレンダリング後に自動的に実行することで修正されました。
MAXScript を介してレンダリングを実行した場合、システムはビットマップによるメモリの使用量の増加を計測するようになりました。システムはこの値を 1 つのレンダリングからその次まで合計し、その合計が一定のしきい値を超えた場合に必ずはガベージ コレクションを実行します。現在、しきい値は[カスタマイズ](Customize)メニュー > [基本設定](Preferences)ダイアログ ボックス > [MAXScript]タブで設定される MAXScript Heap サイズです。そのため、ガベージ コレクションは複数のレンダリング()呼び出しに従って実行されます。その際に要求される呼び出しの数はレンダリングのサイズによって異なり、レンダリングが大きくなるとガベージ コレクションをトリガする頻度が上がります。
ガベージ コレクションは前のレンダリング()呼び出しによって割り当てられたいかなるメモリおよびディスク スペースを、それらの呼び出しの結果が変数.に保存されていない限り、解放します。たとえば、myImage=render() を呼び出すと、レンダリングされたイメージは変数 myImage によって保持され、異なる値が myImage に割り当てられるまで収集されない、ということになります。このため、MAXScript ユーザは、大きなイメージについては後でそのイメージが必要にならない限り、変数に割り当てたままにしておかないように注意を払う必要があります。変数に割り当てられたイメージを解除するには、たとえば myImage=undefined 変数を未定義の状態に設定します。
それでもディスク領域を使い果たしてしまう可能性があります。ディスクがフルの場合、新規のハンドリングはガベージ コレクションを実行することが必ずしも必要ではないため、レンダリングが失敗する可能性があります。新規のハンドリングは、MAXScript のレンダリングによって消費されるディスク領域の量に下限境界を設けることで、その可能性を低減します。