フィルタ処理の際のメモリについて(Hyper-Paint チュートリアル 使い方 講座)

Hyper-Paintのフィルタ処理の際にはキャンバス画像をメモリに読み込んでからフィルタ処理を行いその後メモリ内容をキャンバス画像に書き戻しています、これら一連の処理はキャンバス画像の大きさにより3種類の方法のどれかで行います。

1の方法、
この方法はキャンバス画像を一度に全てをメモリに読み込んで処理を行いその後メモリを再びキャンバス画像に書き戻す方法です。勿論メモリは処理直前に確保し使用後に開放します、この方法はメモリを多く必要とし速度は高速です。但し比較的少ない搭載メモリのパソコンで比較的大きな画像を処理するとスワップが発生しそのために遅くなってしまいます。
2の方法
独自の方法でメモリを画像の横1ライン分用意して画像の1ライン分をこのメモリに読み込み処理してその後このメモリを画像の1ライン分に書き戻します、これを画像の上から下に繰り返します。この方法だと画像の横サイズが800ピクセルの時で3.2Kbyteだけ横サイズが10000ピクセルで40Kbyteしか使いません。ですのでメモリ不足には絶対になりません。
この方法は1の方法に比べメモリが非常に少なくてすみ多少速度的に1に比べ遅くなりますが画像が大きくてもスワップなどは起こりません。ただ複数の行の値が必要な場合には向いていません。
3の方法はdelphiのscanlineを使う方法で2の場合と同様スワップなどは起こりません。また複数の行の値が必要な場合にも簡単です。但し速度的には3つのうち一番処理速度が遅い方法です。

1の方法の処理にかかる時間を100とすると状況にもよりますが2の方法は110〜120程度、3の方法は200〜250ぐらいになります。

Hyper-paintではフィルタ処理するキャンバス画像が搭載メモリの大きさから十分に処理可能の場合は1の方法で処理します搭載メモリの大きさが足りない場合は2以降の方法で処理します、搭載メモリが比較的少ない場合にも多少スワップが起こる場合があってもほぼ快適に処理可能です。2を使うか3を使うかは処理が1ラインの値のだけで処理できる場合は2の方法を使い、複数の行の値の処理が必要の場合は3の方法を使っています。
ちなみに筆描画は筆の大きさの程度のメモリしか使いません。

こうすることによって比較的少ないメモリを搭載しているパソコンでも快適に使えるようにしています。
但し画像が大きくなるとスワップがそれほど起こらなくともメモリアクセスのトータルの回数はそれだけ多くなりフィルタ処理の計算回数も多くなるのでそれなりに処理に時間がかかるようになります、また画像が大きくなるとそれだけで多くのメモリを必要としますのでスワップは起こり易くなます。これはあたりまえですね。

最近メモリが少ない場合動作にどのように影響があるか少し試してみた。方法は指定した大きさのメモリを確保して消費するメモリを圧迫するツールを作成して使用して行った試したOSはXPとVistaで行った。残りメモリを300メガや50メガなどにして試したが描画もフイルタ処理もスワップなどは起こらずほぼ快適に使用ができた。画像の大きさは5000x4000やそれ以上のものも行ったがXP、Vistaともメモリ管理はわりと優秀なようで搭載メモリが少ないパソコンでも問題なく使用できるようです。
XP以降のwindowsですと1Gバイト以上など搭載したパソコンだとメモリを大量に使ってもwindowsがうまいことやってくれるようで殆どメモリ不足にならないようです。

メモリを画像の横1ライン分を用意して行う方法は遠い昔PC-9801というパソコンでOSはMS-DOSでフルカラーでお絵かきやレタッチができるソフトを開発している頃に考えた方法です。
PC9801では本来グラフィックで使える色は16色だけでしたがフルカラーボードを使えば600X400Pixelの画面でフルカラーを扱うことができました。
MS-DOSはメモリが640Kbyteしか無くその中からOSで使われる分を除けば400Kbyteさらにソフトをそのメモリに読み込むと残りは200Kbyte程度です。この僅かなメモリで当時はフィルタ処理を行っていたのです。もっと昔のことを言えばMSXバソコンなどは32Kbyteや64Kbyteさらに昔のポケコンなどは2Kbyteなどと現在では想像もつかない僅かなメモリしか使えなかったのです。そういう時代には現在のように恵まれた性能は無かったためより工夫をしてソフト作りをしていたのです。
例えば現在のCPUには浮動小数点演算の機能がありますが当時のCPUにはありませんので浮動小数点演算のCPUを別個に取り付ける必要があり画像の回転のように小数点以下の計算が必要な場合には普通に作った場合にはとても時間がかかって遅くなりますが工夫をして浮動少数点演算のないCPUでも高速に回転できるように工夫などもしていました。
Windows95時代もメモリ量は32Mbyteとか48Mbyteとか現在に比べると極僅かでした。この時代のHyper-Paintはフィルタ処理にはMS-DOS時代と同じ画像の横1ライン分しか使わない方法を取っていたのですが(この方法では横サイズが800ピクセルの時で3.2Kbyteだけ横サイズが10000ピクセルで40Kbyteしか使いません)ベクターのレビューに「ある程度大きな画像を扱うには処理能力の高いパソコンが必要」と他のソフトには書かないのにわざわざ書かれました。ある程度大きな画像がどの程度の画像がどれくらいの大きさか不明ですが当時のデジカメの解像度はかなり低くせいぜい640x480とか800x600程度でそれより大きく2000x1600くらいでもHyper-Paintで全く問題がありませんでしたのでベクターにそのことを話て書き換えてもらおうと思ったのですがベクターと話がかみ合わず「憶測で書かれるのは困る、結局分かってもらうにはソースファイルを見て貰うしか無いですね」と話たらベクターは怒って「じゃベクターへの掲載を止めますか!」なんていったので私は「じゃあそうして下さい」というとベクターはここで正気にもどり慌てて「早まるな!」などとめちゃくちゃなことがありました。またその後にレビューに「操作性に癖がある」と書いたのもベクターでいまだになにかと迷惑を受けているベクターのレビューにしろなににしろ他人の著作物に付いて書く場合は可能な限り慎重にし根拠の無い憶測で書くことは作者に対して失礼であると共に迷惑でありユーザーに間違った情報を流し誤解を招いてしまうので謹んでもらいたいものです。
windows95で作るようになって現在よりはかなりメモリは少ないですがMS-DOSの時代に比べれば格段に多くあれもできるこれもできるとまるで天国にいるような感じでしたのであのように書かれたのはとても納得がいかなかったのです。MS-DOSの時代は機能を増やすとプログラムサイズが大きくなり使えるメモリが小さくなるので機能を増やす時はプログラムを小さく作る工夫を積み重ね(最適化)空いたメモリ分を機能追加に使うなど繰り返していましたのでそれに比べると天国のようなわけです。
レビュを書く際にいくらか知ったかぶりしたいのかも知れないが実際にソフト作成をした事もなくまたソフトの内部について知りもせずに、またいろんな条件下で隅々まで使って見もせずにレビューを書かれるとこういう事になります。

1年ぐらい前からメモリの使い方の仕様を若干変更しました。そのきっかけから書くと。
あるユーザーの方の質問で塗りつぶしをしてアンドゥをすると白い矩形状になるというものでしたがこちらでは再現しませんでした。3、4回のメールのやり取りの中で搭載メモリが6ギガあることを考えてみるとHyper-Paintで使えるメモリの大きさを調べているglobalmemorystatusというapiが確か4ギガ以上は認識できないはずと思い出しこれが原因と思い修正して送ってみたら一発で直ったということでした。
その関係から64ビットOSの可能性のあるwin7、win8以上のOSの場合は搭載メモリも1、ないし2ギガは一般的に普通なのでメモリの節約はしないように変更しました。
GlobalMemoryStatusEXというapiなら4ギガ以上でもメモリ量を取得できるがこれは64ビット対応コンパイラでないと使うことができない。ですからwin XP以前は従来どおり取得したメモリから十分あるか判断してwin7、win8などでは64ビットOSで4ギガを超えている可能性を考え取得したメモリにかかわらず十分メモリがあると判断しています。
win XP以前かwin7、win8かはHyper-Paintの中で取得している。
ただし64ビットOSで6Gとか8Gとかのメモリを搭載していてもHyper-Paint側では4Gまでしか確保できません。このほかHyper-Paintでは一つ一つのフィルタでどれくらいのキャンバスサイズまで処理可能がテストしてそれ以上のサイズの場合はメッセージダイアログで「処理できない」旨を知らせ中断するような仕様になっています。
こんなことまで書く必要はないのですが過去にベクターに憶測で間違ったことを書かれた経験があるからです。

               Home         Back


inserted by FC2 system