トップページ > 過去ログ > 記事閲覧
マップを表示する
名前:名無し 日時: 2007/03/21 00:11

マップチップの画像を分割して読み込んでマップを表示しようと思いました。 毎回この処理をしてたら重くなるかなと思ったので1回どこかに全体のマップを表示してからいま見える範囲の必要な部分を取り出して表示させようと思ったのですがどうやればいいのでしょうか

Page: 1 |

Re: マップを表示する ( No.1 )
名前:管理人 日時:2007/03/21 08:57

 最近のPCは高速ですので毎回チップを全部描画してもある程度の規則に則れば速度的には 問題ありません。  寧ろ予め何処かに全体のマップを描画して記憶しておく場合、広いマップほど大きな 画像が必要になりますので、速度的にも容量的にも現実的ではありません。  例:ワールドマップの広さが32dot×32dotのチップ縦横256個分の場合  記憶して置くのに必要な画像のサイズ   256chip×32dot=8192dot なので   8192dot×8192dot  その画像の記憶容量   16ビットカラーの場合     8192dot×8192dot×2byte=134217728byte     134217728byte÷1024=131072kbyte     131072kbyte÷1024=128mbyte なので     128メガバイト   32ビットカラーの場合は16ビットカラーの場合の2倍なので256メガバイト となり、これだけで128メガバイト(若しくは256メガバイト)ものVRAMが 必要になってしまい、1万円以上するビデオカードでなければ正常に動作しない ソフトになってしまいます。  毎回チップを全部描画する場合ですが、以下の法則に従うと高速に描画できます。 ・マップチップの画像は1枚の画像にして、LoadDivGraph で読み込む ・マップチップの画像は2のn乗のサイズにする(256x256、256x512、512x512、1024x1024、512x1024(2のn乗(1,2,4,8,16,32,64,128,256,512,1024,2048,4096...)であれば縦横のサイズが違っても大丈夫です)) ・1チップの大きさは32dot×32dotくらい(16dot×16dotでも処理を最適化すれば問題ないと思いますが)  この法則に則れば、則らない場合に比べて何倍も高速に描画できますので、 毎回チップを1枚1枚描画しても大丈夫です。
Re: マップを表示する ( No.2 )
名前:名無し 日時:2007/03/21 10:26

最初にマップを表示したほうがだめなんですね。 法則教えてくれてありがとうございます。 これに従って作っていきたいと思います ありがとうございました
Re: マップを表示する ( No.3 )
名前:U-meda 日時:2007/03/25 09:38

横からすみませんが、マップチップの画像サイズについて。 2のn乗のサイズにするのは、CPU的に扱いやすい数字だからでしょうか? それともDXLib的に関係するのでしょうか? 私は24*24サイズのマップチップを使っているのですが 処理的に問題はでてくるでしょうか?
Re: マップを表示する ( No.4 )
名前:「たく」 日時:2007/03/25 10:25

2のn乗のサイズになるのは DxLib というよりも DirectX の仕様で、その方が処理が早くなると いう特徴があります。このサイズのチップを 1枚づつ読み込んでグラフィックハンドルに 割り当てるのはやや非効率ですが、1枚の大きな 2のn乗サイズのグラフィックに 24x24 サイズの マップチップを沢山埋め込んで、それの一部を 切り出して描画すれば効率が良くなります。 (256x256 ピクセルの画像に 24x24 のチップは 合計100個入りますね) DerivationGraph 関数が参考になります。自分 も今まさにマップ回りいじってるんで参考まで。
Re: マップを表示する ( No.5 )
名前:管理人 日時:2007/03/26 14:35

 U-medaさんどうも、DXライブラリの管理人です。  たくさんが殆どご説明されていますが一応私も。  2のn乗のサイズにするのは、単純に Direct3D が2のn乗のサイズの テクスチャしか扱えないからです。  DXライブラリでは Direct3D を使用しているにも関らず普段2のn乗 ということを気にせずに画像を扱うことが出来ますが、内部では 読み込んだ画像が収まる最小サイズの2のn乗サイズのテクスチャが 使用されているか、若しくは複数の2のn乗サイズのテクスチャに 分割されて管理されています。 例:  900x480 の画像の場合 → 1024x512 のテクスチャを使用  258x256 の画像の場合 → 256x256 のテクスチャと 2x256 のテクスチャを使用 (512x256 のテクスチャでは無駄な部分が多いため分割)  258x258 の画像の場合 → 256x256, 2x256, 256x2, 2x2 のテクスチャを使用  そして、分割されている場合は単純に1枚の画像を描画しようとしても 二つ以上のテクスチャを使うことになるので、描画負荷は1枚のテクスチャを 描画する場合よりも描画するテクスチャを切り替える手間がある分だけ高くなります。  この負荷は128x128くらいより大きい画像になるとテクスチャを切り替える際の 負荷より描画の負荷の方が断然大きくなるので気にすることはないのですが、 16x16 や 8x8 の小さな画像を大量に描画する場合は無視出来ないものとなります。  問題なのは描画に使用するテクスチャの切り替えに掛かる負荷ですので、 16x16のチップを256x256のテクスチャに縦横16個並べて一つの画像にしてしまう等の ことをすればテクスチャの切り替えは発生しないので、この画像に書かれている チップを連続して描画している間は描画に使用するテクスチャの切り替えは一切 発生しない、なので高速。ということになります。  チップ一つのサイズが24x24ですとピッタリ2のn乗のサイズのチップセット画像を 作ることは出来ませんが、例えば縦横10個並べるとサイズは 240x240 になりますが、 残りの10ドットの領域を真っ黒にする等して無理矢理 256x256 のサイズにすれば、 DXライブラリ側は分割を絶対に行いませんので高速に描画することが出来ます。
Re: マップを表示する ( No.6 )
名前:U-meda 日時:2007/03/28 17:40

たくさん、管理人さん分かりやすい回答有り難うございます。 DirectXを使用しているからこその仕様なんですね。 透過色など使って2のn乗サイズにし高速化してみます。

Page: 1 |