2011-12-15 10 views
1

MFC/WinAPIアプリケーションウィンドウにビットマップを表示する必要があります。ビットマップサイズはさまざまです。たとえば、40MB、100MB、500MB、700MB、1GBなどです。アプリケーションウィンドウに収まらない巨大なビットマップは、スクロールバーで表示する必要があります。巨大なビットマップを処理する

メモリがCreateFileMapping + CreateDIBSectionで割り当てられていても、いくつかの大きなサイズのビットマップを作成できないという問題があります。

このようなケースを処理するアプローチはありますか?私はビットマップを多くの小さな部分に分割する必要があると思いますが、これが正しい方法であるかどうかはわかりません。

+0

私は真剣にページングテクニックを考えています(非常に大きな画像の場合は特に!):ゲームを考えてみましょう。テクスチャのほんの一部(見た目のもの)がすぐに読み込まれます。また、「低解像度バージョン」のようなテクニックは、距離のものや(場合によっては「読み込み中」)、この場合に使用されます。もちろん、それは問題を多少複雑にします。そして、*特に*いくつかの画像フォーマットをデコード/読み込みが困難にします。すでにこれを行っているか、書いているライブラリを見つけてください。あまりにも複雑です! - あなた自身:-)(しかし、おそらく事前に分割されているか、大量の画像に馴染んでいる形式ですか?) –

+1

WIC APIは巨大なビットマップを扱うのに適しています。 Windowsの64ビット版を入手するのが迅速な解決策です。 http://msdn.microsoft.com/en-us/library/windows/desktop/ee719655%28v=vs.85%29.aspx –

答えて

2

作成するビットマップのサイズはどのくらいですか?あなたが当てる可能性のある限界は、仮想アドレス空間です。これは、環境に応じて、32ビットコードが2GB、3GBまたは4GBです。最も簡単な解決策は、64ビットコードに移行することです。

このイメージを表示するには、ソースイメージの一部をクライアント領域に合わせるカスタムウィンドウ/コントロールを実装し、スクロールバーを管理してユーザーがイメージをナビゲートできるようにします。このようなウィンドウの実装には、何年もの間開発されたscollbar対応のウィンドウと比べて、特有のことはありません。 Scroll Bar Functionsこれを入手してください。 CreateFileMapping/MapViewOfFile

更新:

あなたはCreateFileMappingに割り当てるメモリはすぐに、プロセスのアドレス空間にマッピングされ、これはあなたがマップすることができるより多くを割り当てるためのオプションを残していません。割当要求を満たすと、Windowsは実際に実ページを予約していないことに注意してください。システムはその割り当てが可能であることを確認し、後でオンデマンドで効果的に割り当てます。

この単純なプローブツールFileMappingVirtualAddress.exeを使用すると、すべてのことがどのように機能し、アプリでどのくらい割り当てることができるか見積もることができます。このユーティリティは、起動時にできるだけ多くのCreateFileMapping 256 MBブロックを実行し、手動でボックスをチェックすることにより、すでに存在するファイルマッピング上でMapViewOfFileを実行します。実際の制限は仮想アドレス空間(環境に応じて2,3または4 GB)であることがわかりますが、それ以上割り当てることはできません。

enter image description here

はまた、あなたが大きなブロックのためMapViewOfFileを要求した場合、システムは、連続したアドレスブロックでこれを満たすために必要であることに注意してくださいので、このアドレス空間が利用できるようにする必要があり、スペースの断片化が問題かもしれません。

大きなビットマップを使用すると、実際には完全なビットマップが必要なくなり、画像タイルをタイル単位で処理することができます。

ダウンロードリンクを切り捨て、/LARGEADDRESSAWAREなしで構築された64ビット版と32ビット版のTracをブラウズして、動作の違いを確認することもできます。

+0

作成に失敗したビットマップのサイズは約700MBです。私は正常にCreateFileMappingを介してそのサイズのハンドルを作成しましたが、CreateDIBSectionは失敗しました(nullを返します)。私は3,5GBのRAMとWinXPの32ビットを持って、仮想メモリは4GBに設定されています。 – Rom098

+0

32ビットXPの仮想アドレス空間の制限は、デフォルトで2 GBです。いわゆる4GB RAMチューニングを使用して3GBに拡張することができます。http://support.microsoft.com/kb/291988 'CreateFileMapping'はあなたにもっと多く(実際にはさらに4GB)を割り当てることができますが、全体をマップすることはできません'MapViewOfFile'を使用してプロセスに追加するには、部分的に行う必要があります。 –

+0

MapViewOfFileがマップできる最大サイズはどのように知ることができますか? (私のシステムでは〜670MBですが、システムによって異なると思います) – Rom098

0

合計GDIリソースと単一ビットマップサイズは、Windowsでは制限されたリソースです。同時に、単純な配列サイズは、仮想アドレス空間と利用可能な物理メモリによってのみ制限されます。したがって、イメージ全体をピクセルの単純な配列として保持し、必要な部分だけをGDIビットマップに変換して表示する必要があります。

+3

アレイサイズは物理メモリによって制限されません。仮想アドレス空間のサイズに決して近づくことはありません。 *連続したメモリのチャンクを作成するために使用できるアドレス空間の最大の穴は、ほとんどの32ビットWindowsインストールで約650メガバイトです。アドレス空間は、コードとヒープによって断片化されます。 SysInternalsのVMMapは洞察を提供します。 –

+0

まあ、最大の配列サイズが仮想アドレス空間または物理メモリと等しいとは言いませんでした。つまり、仮想アドレス空間と物理メモリが配列サイズを制限する要因になります。また、配列のサイズはGDIリソースよりも制限されていません。GDIビットマップよりも多くのピクセルをプレーンな配列に保つことが可能です。 –

関連する問題