+にゃんにゃんにゃんこの演習+ DXライブラリにおける画像読み込み速度のテスト

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DXライブラリにおける画像読み込み速度のテスト

DXライブラリに「乗算済みアルファ」が実装されました
これでほぼデメリットなしで色漏れや透明な画面に描画した場合の黒ずみ問題を解決できます!
ほぼ唯一のデメリットといえばロード時に画像を変換するコスト。

前回、DXライブラリでの各画像形式の読み込み時間の差を計測したのですが、その結果、PNGかDDSかの二択だとわかりました。
なので今回は比較する形式をその2つに絞って、乗算済みアルファへの変換を含む各条件でどれだけ読み込み時間に差が出るのかを調べたので公表してみたり。
お酒飲みつつ計測したデータなのでだいぶ適当ですが、複合して見てみればある程度有用なデータにはなるはず。

全ては快適なゲームの為に!
続きは以下。











◆その前に
WindowsXP、Pentium4 2,8GHz、ハードディスクドライブで測定。前回と同じ。
計測時間は5回繰り返した平均。

読み込みに使う画像はSTG用の弾画像を引き伸ばしたもの。
画像ファイルのサイズは、2048x2048の場合、無圧縮DDSが16.0MB、PNGが2.83MB。
1024x1024の場合、無圧縮DDSが4.0MB、PNGが0.98MB。
前回の画像と違って内容の密度がやや低い為、容量が減ったからか、もしくは展開処理が早いのか、PNGの読み込みが少しだけ高速になった。



◆(A)素の状態での読み込み
非アーカイブ状態の2048x2048の画像を、4枚、普通にLoadGraphで読み込むのに掛かった時間。
形式計測値
DDS753ms
PNG2859ms



◆(B)メモリに画像を読み込んでからの読み込み
非アーカイブ状態2048x2048の画像を、4枚、CreateGraphFromMemで読み込むのに掛かった時間。
画像をメモリに読み込む処理に掛かった時間も含む。
形式計測値
DDS1024ms
PNG2855ms
<このデータからわかること>
無圧縮のDDS画像はそのサイズゆえ、一旦メモリに読み込むことで、35%程度のオーバヘッドが生じる?
しかしそれでもDDSの方が圧倒的に早い。
PNG画像の場合は通常のロードと速度は差がないようだ。




◆(C)乗算済みアルファに変換しての読み込み
非アーカイブ状態の2048x2048の画像を、4枚、普通にLoadGraphで乗算済みアルファに変換して読み込むのに掛かった時間。
形式計測値
DDS989ms
PNG3068ms
<このデータからわかること>
乗算済みアルファに変換するコストは200msちょい。(2048x2048の画像一枚だと50msちょい)
割合にして30%程度のコスト。
画像をロードしてから変換するので、当然各形式による変換時間の差は出ない。
ちなみに、メモリに読み込んだ後、乗算済みアルファに変換してロードした場合は
形式計測値
DDS1274ms
PNG3066ms
だった。
単純にコストを合算しただけだね。



◆(D)DXアーカイブからの読み込み(画像サイズが2048x2048の場合)
アーカイブ状態2048x2048の画像を、4枚、CreateGraphFromMemで読み込むのに掛かった時間。
画像をメモリに読み込む処理に掛かった時間も含む。
うっかりメモリに読み込む処理で計測してしまったので、(B)と比較してください。
形式計測値
DDS1087ms
PNG2859ms
<このデータからわかること>
どちらもほとんど差がない。DDSが10%以下のオーバヘッドがあるかどうか。
「あれ? と、いうとこはDXライブラリではアーカイブしても読み込み速度は変わらない?」と思いきや、そういうことではない。
DXライブラリでは、「既に圧縮されているファイル形式」と「10MB以上のファイル」は圧縮されずに格納される等の仕様があるので、この場合は両方共ファイルが圧縮されてないのです(DDSが16MBなので圧縮されない)。
まぁ、圧縮が掛からない場合、その画像をロードするにあたって、コストがほぼ掛からないということだけはわかったかな……



◆(E)DXアーカイブからの読み込み(画像サイズが1024x1024の場合)
アーカイブ状態1024x1024の画像を、16枚、CreateGraphFromMemで読み込むのに掛かった時間。
画像をメモリに読み込む処理に掛かった時間も含む。
面積が1/4の画像を4倍の枚数ロードするので、ロードする総面積は一緒です。
(D)
ではDDSに圧縮が掛からなかったけど、今回はDDSにアーカイブの圧縮が掛かります。
形式計測値
DDS1378ms
PNG3269ms
<このデータからわかること>
このデータから得られる情報は2つあります。
1つ目に、アーカイブにて圧縮されたデータをロードするのに30%程度のコストが掛かること(メモリに読み込まない場合なら45%?)
2つ目、これはDXアーカイブとは関係ないのですが……
画像のロード回数が増えたことにより、PNGの読み込み時間が増加したこと。
DDSのロード時間は、画像を分割したとしても、単純に画像の累計面積に比例します。
しかし、PNG画像は読み込み回数が増加する度に展開処理によるオーバヘッドが割合増加するようです。



◆その他、調べてる最中に得られたこと
C++標準のファイル操作関数を使った場合と、DXライブラリのFileRead系列の関数を使った場合では、差はなかった。





◆要点まとめ
・無圧縮DDSの読み込みはやはりPNGよりも非常に高速。
・乗算済みアルファに変換するコストはDDS読み込みの場合でも30%。
・一旦画像ファイルをメモリに確保しておいて、メモリ上の画像データから読み込むのは、DDSのみ30%のコスト。
・DXアーカイブより読み込む場合、コストはほぼない。しかし無圧縮画像のみ数%~45%もコストが増加。
・DDSばかりオーバヘッドが掛かってるように見えるが、それでもPNGよりは高速。
・実はこの記事はDDSを推進する目的にある。






以上。

本来自分用の計測データなため、わかりにくい部分が多いと思いますが、適当に抽出してください。



















どうでもいいこと。

そもそも余計な暗号化等しなければ、ゲームの画像は一括ロード数秒で済むため、それほど高速化に躍起になる必要はない。
でも、ちりも積もれば山となる。普段からロードの高速化を心掛けておくに越したことはないので、やっぱり読み込みが高速な無圧縮DDSは流行らせたい。

DDSは対応してるイメージエディタが少ないのが難点。
ファイルフォーマット自体は簡単なので、私が自作のDDS変換ソフトでも配布したらいいのかな……悩み中。

DXライブラリに付属してくるアーカイバを改造して、画像ファイルがあったら自動的に中身をDDSに変換して格納するように書き換えればいいかも?
そうすればリリースバージョンを高速にできるし。

まぁ、それはそのうちにでも考えよう。

テーマ : ゲーム製作 関連
ジャンル : ゲーム

コメントの投稿

Secre

+サークルのサイト+
森の中の猫の小屋 author:稲塚 春
+twitter+
+エントリサーチ+
+カテゴリ別エントリ+
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。