IBitmapPager コア インタフェースは、3ds Max 2010導入され、自動制限モードをサポートするよう拡張されたビットマップ ページャに関連する設定を公開しています。
ビットマップ ページャの UI は、[カスタマイズ](Customize) > [基本設定](Preferences) > [レンダリング](Render)タブからは完全に削除され、MAXScript でのみコントロールできるようになりました。
インタフェース > コア インタフェース > IBitmapPager |
警告: |
---|
ビットマップ ページャは、特に非常に大きな出力イメージ サイズ(4K 以上)にレンダリングする際に、メモリ不足の問題の発生を最小限に抑えることでシステムの安定性を向上させるために、レンダラーの メモリ フットプリントを削減します。 ただし、ページャは、ディスクにメモリをスワップすることにより機能しているため、パフォーマンスが低下します。 メモリのフットプリントに問題がない場合、たとえば 64 ビット OS で 64 ビット版の 3ds Max を実行している場合などでは、次の MAXScript 呼び出しを使用して ページャを無効にするとレンダリングのパフォーマンスが向上する可能性があります。 IBitmapPager.enabled = false この値は、シーンを再ロードするまで 有効になりません。 この値の変更は表面的にはいつでも可能で、値の書き込みはファイルの保存時に行われます。ただし、ディスクのページングはシーンのロード時以外には有効または無効になることはありません。ただし、ディスクのページングはシーンのロード時以外に有効または無効になることはありません。このため、この値の変更は、シーンを保存してから再ロードしない限り、有効にはなりません。 |
プロパティ:
IBitmapPager.enabled : boolean : Read|Write
true に設定すると、ビットマップ ページャが有効になります。
false に設定すると、ビットマップ ページャが無効になります。
既定値は true です。
詳細については、上の警告を参照してください。
IBitmapPager.pageFilePath : filename : Read|Write
ページ ファイルのパスを取得/設定します。既定値は、[カスタマイズ](Customize) > [システム パスを設定](Configure System Paths) > [ページ ファイル](Page File)エントリで指定された、 getDir #pagefile で返されるページ ファイル パスです。
IBitmapPager.memoryPadding_percent : float : Read|Write|Validated by Range: 0.0 to 1.0
メモリ パディングの割合を、0.0 ~ 1.0 の範囲の値として取得/設定します。これは使用可能なメモリの割合(百分率)です。既定値は 0.2 (20%) です。
IBitmapPager.memoryLimit_percent : float : Read|Write|Validated by Range: 0.0 to 1.0
メモリ上限の割合を 0.0 ~ 1.0 の範囲の値として取得/設定します。これはパディングされたメモリの割合(百分率)です。既定値は 0.1 です。
IBitmapPager.memoryLimitAutoMode : boolean : Read|Write
true に設定すると、下で説明するヒューリスティックな方法によりメモリの上限が自動的に計算されます。既定値は true です。
IBitmapPager.memoryLimit_megabytes : integer : Read
メモリ上限をメガバイト単位で取得します。
IBitmapPager.memoryUsedForPager_megabytes : integer : Read
ページャが使用するメモリをメガバイト単位で取得します。
IBitmapPager.memoryTotalForPager_megabytes : integer : Read
ページャの合計メモリをメガバイト単位で取得します。
IBitmapPager.memoryPadding_megabytes : integer : Read
パディング メモリをメガバイト単位で取得します。
IBitmapPager.memoryAvailablePadded_megabytes : integer : Read
使用可能なパディングされたメモリをメガバイト単位で取得します。
最初に、使用可能なメモリの量が計算されます。これは、ページャが割り当てできる合計量からパディング量を引いたものです。パディングは既定値では 20% です。
システムがレンダリングしない場合、上限は使用可能メモリの 50% に設定されます。たとえば、1GB のメモリが空いている場合、20% が引かれて 800 MB になり、その 50% つまり 400MB をページャが使用します。
システムがレンダリングを行う場合、ページャは自身のメモリ上限とレンダラー用に確保されているメモリの間でバランスを取ります。ページャの目標は、自身の全ビットマップに十分なメモリを保持することで、それ以外にはありません。レンダラーの目標は未知です。レンダラーのメモリ ニーズを計測する方法はないため、この目標は使用可能な全メモリと等しいものと仮定されます。この 2 つの目標が合算され、システム全体の目標となります。ページャは合計に対する自身の目標の割合と等しいメモリ量を確保します。たとえば、1GB の空きメモリ(800MB が使用可能とみなされる)があった場合、全ビットマップの合計サイズが 400 MB であれば、ページャとレンダラーの目標はそれぞれ 400MB、800MB となり、システム全体では 1200MB となります。1200MB に対する 400MB の割合は 1/3 です。このため、ページャの上限は使用可能な 800MB の 1/3、つまり 266MB に設定されます。
2 つの調整が行われます。
第 1 の調整: レンダリング中、ページャの目標が使用可能メモリの 25% 未満になった場合、ページャは自己制限を破棄し、上限を全体の目標と同じ量に設定します。たとえば、すべてのビットマップが使用可能メモリの 18% 以内に収まる場合、前の式では上限は 15% になりますが、ページャはこの制限を全体にあたる 18% に設定します。
第 2 の調整: レンダリング中、ページャは上限を使用可能なメモリの 10% 未満の値、または 50% 以上の値に設定しません。
内部では、自動モード調整が次のイベントで行われます。NOTIFY_SYSTEM_STARTUP、NOTIFY_SYSTEM_POST_RESET、NOTIFY_FILE_POST_OPEN、NOTIFY_SYSTEM_POST_NEW、NOTIFY_PRE_RENDER、NOTIFY_POST_RENDER。
3ds Max 2011 より前のリリースでは、MAXScript で複数の render() 呼び出しが実行されると、前回のレンダリング結果がメモリに残り、自動的にリリースされませんでした。それらを消すためには、ユーザは手動ガベージ コレクションを呼び出さなくてはなりませんでした。このためメモリおよびディスクの領域がビットマップ ページャのために無駄に使われてしまっていました。
この問題は、3ds Max 2011 では定期的なガベージ コレクションをレンダリング後に自動的に実行することで修正されました。
MAXScript を介してレンダリングを実行した場合、システムはビットマップによるメモリの使用量の増加を計測するようになりました。システムはこの値を 1 つのレンダリングからその次まで合計し、その合計が一定のしきい値を超えた場合に必ずはガベージ コレクションを実行します。現在、しきい値は[カスタマイズ](Customize)メニュー > [基本設定](Preferences)ダイアログ ボックス > [MAXScript]タブで設定される MAXScript Heap サイズです。そのため、ガベージ コレクションは複数のレンダリング()呼び出しに従って実行されます。その際に要求される呼び出しの数はレンダリングのサイズによって異なり、レンダリングが大きくなるとガベージ コレクションをトリガする頻度が上がります。
ガベージ コレクションは前のレンダリング()呼び出しによって割り当てられたいかなるメモリおよびディスク スペースを、それらの呼び出しの結果が変数.に保存されていない限り、解放します。たとえば、myImage=render() を呼び出すと、レンダリングされたイメージは変数 myImage によって保持され、異なる値が myImage に割り当てられるまで収集されない、ということになります。このため、MAXScript ユーザは、大きなイメージについては後でそのイメージが必要にならない限り、変数に割り当てたままにしておかないように注意を払う必要があります。変数に割り当てられたイメージを解除するには、たとえば myImage=undefined 変数を未定義の状態に設定します。
それでもディスク領域を使い果たしてしまう可能性があります。ディスクがフルの場合、新規のハンドリングはガベージ コレクションを実行することが必ずしも必要ではないため、レンダリングが失敗する可能性があります。新規のハンドリングは、MAXScript のレンダリングによって消費されるディスク領域の量に下限境界を設けることで、その可能性を低減します。