CD起動の場合LoadImageに時間がかかる – プログラミング – Home

CD起動の場合LoadImageに時間...
 
通知
すべてクリア

CD起動の場合LoadImageに時間がかかる


VID
 VID
(@VID)
ゲスト
結合: 9年前
投稿: 3
Topic starter  

MFC、VS2012

アニメーションのため、10枚ほどのBMPを読み込んで起動するアプリを作成しています。

HDDからの起動ではほぼ待ち時間無しで起動しているのですが、
CDに焼いて起動しようとすると異常に時間がかかります。
どうも、LoadImageでBMPを読み込むのに時間がかかっているようで、
1枚あたり3秒程度かかっています。(画像は一枚200~300KBほど)

CDの初回起動時のみの動作のようで、一度起動した後に
再度起動するとキャッシュ?に読み込まれているのか
HDDと同程度の速さで起動してきます。

BMPを多くするとさらに時間がかかってしまうので、
何とか起動を早くする方法は無いでしょうか?
※アプリの都合上、BMPは外部から読む込むものとさせてください。

試しにスレッドを立てて同時読み込みしてみましたが、
CDにアクセスのためか、余計に時間がかかってしまいました・・・


引用解決済
トピックタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 4年前
投稿: 828
 

あまり思いつきませんが、

1.ファイルエクスプローラが裏でアクセスする場合があります。
エクスプローラは閉じておきましょう。
2.CD挿入をきっかけに起動するアプリがあれば止めておきましょう。
3.「PIO病」になっていないことも確認したほうが良いかもしれません。

しかし、CDは原理的にファイルのアクセスは遅いですね。
USBメモリの方がはるかに早いです。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

CDでは仕方が無い部分もあるかと思われますが……。
回転停止していた場合、スピンアップして読み込み可能になるまでにそれなりに時間が掛
かります。
# 実行ファイルの読み込みが先だって行われているハズなので、大丈夫…なはずなんです
けどねぇ。

>1枚あたり3秒程度かかっています。(画像は一枚200~300KBほど)

今時等倍で動作しているとは思えませんが、
等倍の場合の転送速度は秒間150KB程度ですので、大きいファイルだと時間がかかるかも
知れません。
# 構造上ファイルが外周近くにある方が転送速度は上がるはず…ですが。
# (シークで差し引きがあるからなんとも…。基本、シーケンシャルに読み出す事が前提の
メディアですからねぇ…)
# http://www.way-on.com.tw/PCbasal/kiso/hikari3.htm
# CLVだと外周に行くにつれ回転速度を変化させる必要が……。

>BMPを多くするとさらに時間がかかってしまうので、
>何とか起動を早くする方法は無いでしょうか?
>※アプリの都合上、BMPは外部から読む込むものとさせてください。

BMPを圧縮して、テンポラリにBMPファイルとして展開、そちらから読み込む。というのは
駄目ですか?
読み込み=>展開=>テンポラリに書き出し
と手間が増えますが、元々遅い光学ドライブよりはマシではないかと……。


返信引用
VID
 VID
(@VID)
ゲスト
結合: 9年前
投稿: 3
Topic starter  

お二方、ご回答ありがとうございます。

>仲澤@失業者さん
すべて問題無かったですが、アクセスが遅いままです。
USBメモリで配布出来たら楽だったんですけどね・・・

>瀬戸っぷさん
試しに、

1.アプリを起動(画面だけ表示)
2.スレッドで裏でBMP読み込み
3.アニメーション開始

としてみたのですが、アプリの起動は比較的早いのですが
やはりアニメーション開始までが時間がかかってしまいます。

時間を計測してみると、やはりスレッド内のLoadImageのところで時間がかかっていま
す。
CD読み込み可能になってからBMP読み込みを開始しても遅いみたいですね。

圧縮⇒展開からの読み出し~は
HDDへのファイルコピーは行わないという前提で作っているので無理なのです。
案を下さったのにすみません。


返信引用
K
 K
(@K)
ゲスト
結合: 22年前
投稿: 98
 

> 圧縮⇒展開からの読み出し~は
> HDDへのファイルコピーは行わないという前提で作っているので無理なのです。

LoadImage() は使えなくなるかもしれませんが、
HDD (ファイル) に書き出さずにオンメモリで処理すればどうでしょう?


返信引用
VID
 VID
(@VID)
ゲスト
結合: 9年前
投稿: 3
Topic starter  

>Kさん
オンメモリで処理とは、具体的にどういう技術でしょうか?
MFCで実現可能そうですか?


返信引用
K
 K
(@K)
ゲスト
結合: 22年前
投稿: 98
 

> オンメモリで処理とは、具体的にどういう技術でしょうか?

「HDDに書くのはダメ」なら「書かずにメモリ上で処理すればいい」(のでは?)
というだけの話です。

> MFCで実現可能そうですか?

例えば zlib の uncompress() のプロトタイプは

extern int uncompress( Byte* dest, uLong* destLen, const Byte* source, uLong
sourceLen);

こんな感じですから、圧縮した内容を source に置いて呼べば、それを展開した結果が
dest に格納されます。
DLL ですから、普通に C/C++ から呼べます。

まぁ別に zlib にこだわる必要はありませんが。


返信引用
AR2
 AR2
(@ar2)
Estimable Member
結合: 4年前
投稿: 110
 

あまり参考にならないかもですが私の場合の事例です

アニメーション用に約100枚ほど画像を読み込んだ後にCImageListを生成していました
そこで生成したCImageListでWrite/Readメソッドを使い、1個のファイルとして保存/読
み出してI/O回数を減らす高速化ということをしたことがあります
もちろんCImageListは同じサイズ、同じ色数など制限がありますが、比較的に容易に実現
できるので条件が合うようなら試してみてください
アニメーションのようなパラパラ漫画的なものなら、ちょうどマッチすると思いますよ


返信引用
aetos
(@aetos)
Noble Member
結合: 4年前
投稿: 1480
 

圧縮しておけば、ディスク I/O を減らす効果はありますね。

画像の圧縮と言えば JPEG や PNG です。
多少の画像劣化を許容してもサイズを減らす方を優先するなら JPEG ですね。
で、どうやら、MFC なら CImage::Load を使えば、JPEG も PNG もそのまま読み込めるよ
うです。

https://msdn.microsoft.com/ja-jp/library/tf4bytf8.aspx

JPEG より圧縮率が高く、しかし MFC がサポートしていないフォーマットを採用したいん
だ、という場合は何か手を考えなければいけないでしょうけど。
まずは PNG や JPEG(画像の劣化具合と速度のバランスを図りつつ)で試してみて、許容
範囲に収まるかどうかを調べてみてはいかがでしょうか。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました