トップページ > 記事閲覧
グラフィックハンドルの数の限界について
名前:山太郎 日時: 2021/12/30 15:48

はじめまして、お世話になってます。 グラフィックハンドルについて質問です。 グラフィックハンドルの数を増やすことは可能でしょうか? 現在、下記の様な仕様でキャラクターを作成しています。  @同じ画像を流用したキャラクターが同時に複数登場する(50-100ほど)  Aキャラクターは複数のパーツで構成されて、キャラクターごとに色が異なる。  Bキャラクターは複数のアニメーションを行う。(100〜200キロバイトの画像が500枚程) 同じ画像を色を変化させて描画していますが、数が多いため、描画の度に色を変化させると処理が重くなってしまいました。 そのため、色を変化させた画像をキャラクターごとにメモリー上に保持するようにしましたが、 今度はグラフィックハンドルの数が限界に達してしまい、管理できるキャラクターの数に限界が生まれてしまいます。 (色の変化には、GraphFilterを使用しています) 出来るだけ多くのキャラクターを管理出来るようにするため、 グラフィックハンドルの数を増やすことは可能でしょうか?
メンテ

Page: 1 |

Re: グラフィックハンドルの数の限界について ( No.1 )
名前:sereparu 日時:2021/12/30 17:51

グラフィックハンドルの最大数は下記URLのスレッドによると 262144個(古いバージョンだと32768個)となっていますが 余程の大ボリュームのゲームでは無い限り、この最大数を超えることは無いと思います。 ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4981 (先頭に「h」を追加してください) グラフィックハンドルを無駄に作り過ぎていませんか? 1つの画像ファイルに1人のキャラクター、1つのパーツ、1つのアニメーションパターンを描いていて それら1つ1つにグラフィックハンドルを割り当ててDrawGraphで描画する、というような作り方になっていませんか? それだと、もしかしたら最大数を超えてしまうかも知れません。 グラフィックハンドル数を抑えたい場合、以下の方法が一般的だと思います。 ・1つの画像に複数のキャラクター、パーツ、アニメーションパターンをまとめておいて DrawRectGraph や DrawModiGraph 等で、画像内の各キャラクターが描かれている所の左上座標を指定して描画する ・一度にすべての画像にグラフィックハンドルを割り当てるのではなく シーンごとに必要な画像のみにグラフィックハンドルを割り当てる ・シーンごとに不要な画像のグラフィックハンドルを DeleteGraph で削除する (また必要になったら LoadGraph で読み込み直す) 詳しいやり方は上記URLのスレッドで管理人さんがマップチップの例を出して説明されています。
メンテ
Re: グラフィックハンドルの数の限界について ( No.2 )
名前:管理人 日時:2022/01/02 22:34

ご返信が遅くなり申し訳ありません sereparuさんのご助言の内容を踏まえてもやはりグラフィックハンドルの数が足りない、 という場合はグラフィックハンドルの限界数を増やしてみようと思いますので、 その際はその旨のご返答をお書き込みください m(_ _)m
メンテ
Re: グラフィックハンドルの数の限界について ( No.3 )
名前:たけ 日時:2022/01/06 18:20

外部から失礼します。 今すぐではなくていいのですが、将来的にグラフィックハンドルの限界数を増やしていただけると助かります。 私も山太郎さんと同じような問題が今後発生する可能性があります。 一応スプライトシートに画像をまとめていますが、今後更に一度に描写するキャラクターが徐々に増えていくとグラフィックハンドルの限界数を超えてしまうのではないかと不安があります。
メンテ
Re: グラフィックハンドルの数の限界について ( No.4 )
名前:sereparu 日時:2022/01/07 14:37

すみません。 グラフィックハンドルの限界数を増やしてほしいと要望されている方には余計なお世話かもしれませんが 限界数を増やしても、根本的な問題は解決しないと思います。 現時点でグラフィックハンドルの限界数に達するような作り方では 限界数を増やしても、いずれまた限界数を超えることになりかねません。 個人的には、新しい機能の追加要望やバグ改善要望などは問題ないと思いますが リソースを増やしてほしいという要望は際限が無いので、あまり好ましくないと考えています。 限界数を心配する気持ちも分かりますが、現在の限界数の範囲内で 制作者側で何とか工夫してグラフィックを管理すべきだと思います。 ゲームが作れない原因を、提供されている環境に求めるのは良くないです。 今一度作り方を見直してみてはどうでしょうか?
メンテ
Re: グラフィックハンドルの数の限界について ( No.5 )
名前:通りすがり 日時:2022/01/07 15:22

話を誤読してるかもしれないけど, ハンドルの個数がどうの以前にメモリ使用量の観点でちょっと考えた方が良いのでは? とか思ったり. > 100〜200キロバイトの画像 を > 262144個(古いバージョンだと32768個) で足りないくらい大量に一度にメモリに保持するんすか? 約 100[KB] 前後の物を 32768個 だとしたらざっくり概算で 3200[MB]以上,すなち 3[GB] 以上に. 1個が 200[KB] ならばその倍で 6[GB] 以上になりますが. (このくらいなら現在のPCならOKなの? ひと昔前のPC使ってる人としては恐怖感が^^) 仮に 262144個 の側で足りないって言ってるとしたら,その8倍になりますぜ? 「富豪的プログラミング」というスタイルでも限度って物があるのでは……
メンテ
Re: グラフィックハンドルの数の限界について ( No.6 )
名前:管理人 日時:2022/01/08 22:32

> sereparuさん 通りすがりさん ご意見ありがとうございます 個人的には 32768個から 262144個に増やした時のように、何れ『いまどき262144個は少ない』と 感じるくらいPC性能が上がるような気がしますので、それを見越して今の内に増やしておいても良いかも と思う部分もあります( 確認してみたところ、Ver1.67( 2001年 )の頃のグラフィックハンドルの最大数は 1024個でした ) > たけさん 現在の4倍くらいの数( 100万個くらい )でしたら簡単に増やせますので、 実際に足りなくなってしまいましたらご連絡ください m(_ _)m
メンテ
Re: グラフィックハンドルの数の限界について ( No.7 )
名前:山太郎 日時:2022/02/07 22:00

> 管理人様、たけさん、sereparuさん、通りすがりさん   皆さま、たくさんのご回答、ご指摘ありがとうございます。  返信が遅れてしまい、大変申し訳ございません。  ゲーム内容としては、アクアリウムのシュミレータの様なものを想定しております。  その仕様上、下記は実現したい内容です。  ・キャラクターは、個体ごと、パーツ別に色が異なる。  ・アニメーションで動く  ・数多くのキャラクターが同時に描画される  ・水槽の切り替えが素早く行える。  @パーツわけに関して  キャラクターは回転描画を想定しているのですが、  DrawModiGraph・DrawRectGraphには、回転描画の機能がなかったため、  パーツとアニメーションに関しては、現状バラバラに分けて登録しているのが現状です。  私の不勉強でしたら申し訳ないのですが、位置指定描画と回転描画の両方を満たす関数はなかったと思いますが、  両方を満たす関数がございましたら、教えていただけると助かります。  Aグラフィックハンドルの限界に関して  確認したところ、自分の環境では32768で限界に達しておりました。  新しいバージョンに更新して使用いたします。  ご指摘ありがとうございました。  Bメモリ使用量関係について  ご指摘の通り、富豪的プログラミングにはなっています・・・。  現状、限界まで使用した段階で1G〜2G使用しています。  当初は、必要最低限の画像をメモリに保持するようにしていたのですが、  その場合だと、パーツごとに色が異なる仕様上、どうしても水槽の切り替え時にロード時間が必要になってしまいました。  水槽の切り替えはシームレスに行いたいという思いがあり、現状ではメモリに多くの画像を保持した状態になっています。  水槽の切り替えをシームレスに行うという仕様を諦めれば、  皆さまのご指摘から問題は解決しそうです。  自分の中でも仕様について決定できていない部分もありますので、  取捨選択しながら実装していきたいと思います。    この度はありがとうございました。      
メンテ
Re: グラフィックハンドルの数の限界について ( No.8 )
名前:sereparu 日時:2022/02/07 23:54

>DrawModiGraph・DrawRectGraphには、回転描画の機能がなかったため、 以下のURLのページにDrawModiGraph を使って 回転描画を実現させる方法が書かれていますので、ご参考ください。 (13番目の書き込みのqweaさんが書かれた行列を使用しているソースです) ttps://dixq.net/forum/viewtopic.php?t=18936#p144304 (URLの先頭に「h」を追加してください)
メンテ
Re: グラフィックハンドルの数の限界について ( No.9 )
名前:通りすがり 日時:2022/02/08 11:22

> キャラクターは、個体ごと、パーツ別に色が異なる。 いわゆる「色違い」みたいな話であれば,パレット切替みたいな手段はとれないのでしょうか? (このライブラリにそのような手段があるのか否か知りませんが)
メンテ
Re: グラフィックハンドルの数の限界について ( No.10 )
名前:管理人 日時:2022/02/09 02:55

> 山太郎さん > 私の不勉強でしたら申し訳ないのですが、位置指定描画と回転描画の両方を満たす関数はなかったと思いますが、 > 両方を満たす関数がございましたら、教えていただけると助かります。 すみません、リファレンスには載っていない非公開の関数なのですが、以下のようなものがあります int DrawRectRotaGraph( int x, int y, int SrcX, int SrcY, int Width, int Height, double ExtRate, double Angle, int GraphHandle, int TransFlag, int ReverseXFlag = FALSE, int ReverseYFlag = FALSE ) ; int DrawRectRotaGraph2( int x, int y, int SrcX, int SrcY, int Width, int Height, int cx, int cy, double ExtRate, double Angle, int GraphHandle, int TransFlag, int ReverseXFlag = FALSE, int ReverseYFlag = FALSE ) ; int DrawRectRotaGraph3( int x, int y, int SrcX, int SrcY, int Width, int Height, int cx, int cy, double ExtRateX, double ExtRateY, double Angle, int GraphHandle, int TransFlag, int ReverseXFlag = FALSE, int ReverseYFlag = FALSE ) ; それぞれ DrawRotaGraph, DrawRotaGraph2, DrawRotaGraph3 の描画範囲指定版です ただ、DrawRotaGraph, DrawRotaGraph2, DrawRotaGraph3 に比べて CPU負荷が凄く高いので、 DrawRectRotaGraph, DrawRectRotaGraph2, DrawRectRotaGraph3 を使用して大量に描画処理を行うと CPU負荷が高くなり処理落ちが発生する、ということになるかもしれません… > 通りすがりさん DXライブラリには標準ではパレット切替の機能はありません ( GPU を使わないソフトウェアレンダリングモードでは描画する画像が256色以下の場合はパレット切替が行えますが、  GPU を使わないため描画処理性能が大幅に低下するのであまり実用的ではありません… )
メンテ
Re: グラフィックハンドルの数の限界について ( No.11 )
名前:通りすがり 日時:2022/02/09 10:36

なるほど. インデクスカラーほどの自由度でなくとも 例えば色相をオフセットして描画してやるとかできれば「色違い」に使える可能性はある気がする (…けども,そういうのをやりたいならもうこのライブラリを離れて自前でシェーダでも書いてろっていう話になるのかな…?)
メンテ
Re: グラフィックハンドルの数の限界について ( No.12 )
名前:kanamaru 日時:2022/02/09 12:32

色違いは下記のサイトの小技2つ目が使えませんか?(自分の記事ですが。) ttps://qiita.com/takuro7021/items/3922e584ca0308be4da2 先頭にhをつけてください。 とは言ってもキャラクターのデザインによっては使えませんが。 また、負荷がどれぐらいかわかんないですし。
メンテ
Re: グラフィックハンドルの数の限界について ( No.13 )
名前:sereparu 日時:2022/02/09 14:12

すみません。 先ほど DrawModiGraph で回転描画する方法を案内しましたが DrawModiGraph ではそもそも位置指定描画できないので、趣旨とは違う案内になってしまっていました。 位置指定描画をする場合は DrawRectModiGraph になりますが 管理人さんが書かれた DrawRectRotaGraph の方が使いやすいかと思います。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存