トップページ > 記事閲覧
読み込み画面
名前:にこよん 日時: 2018/05/04 05:13

こんばんは DXライブラリでは非同期で読み込んでいる物(ここでは画像と音楽の両方を指す)の個数を取得することができるので ローディング画面でローディングバーや何%読み込んでますの様なものを描画することができます しかし、画像と音楽を同時に読み込んだりすると速さが偏ってしまったり、 1つのファイルしか読み込むものがなかった時にこれができなくなってしまいます 何かいい方法はありますでしょうか?(私は容量でやりたいのですが、可能でしょうか?)
メンテ

Page: 1 |

Re: 読み込み画面 ( No.1 )
名前:Raster 日時:2018/05/05 05:56

ファイルが1個だけの場合、0%か100%だとイマイチなので、どこまで読み込みが済んでいるかを知る手段が あるだろうか、ということだと思いますが、たぶん無いのではと思います。 ファイルが1個の場合、ファイルの読み込みが終わるまでは(どれだけ読んでいるかは全く考慮せず)一律の割合で パーセントを増やし、想定(※ここでは3秒)より早く読み込みが終われば伸びを加速するプログラムを書きました。 「3秒」より長いことは想定していませんので、「3秒」をいかに適切に設定するかが肝になります。 なお2個以上の場合は「普通に」読んでいるだけなので、カクツキがあります。 #include "DxLib.h" #include <string> using namespace std; typedef std::basic_string<TCHAR> tstring; int nSHandle[5000]; int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { DxLib::ChangeWindowMode(true); DxLib::SetWindowSize(640, 480); if (DxLib::DxLib_Init() == -1) return -1; DxLib::SetDrawScreen(DX_SCREEN_BACK); FILEINFO info; double dPercent = 0; int nFCount = 0; // 対象となるファイル数 TCHAR buf[MAX_PATH]; DWORD_PTR hFHandle = NULL; tstring sFolder = TEXT("x:\xxxxx\xxxxxx\xxxxx\"); // Ogg群のあるフォルダを指定! if (sFolder[sFolder.length() - 1] != '\\') sFolder += TEXT("\\"); DxLib::SetUseASyncLoadFlag(TRUE); // 非同期ON hFHandle = DxLib::FileRead_findFirst((sFolder + TEXT("*.ogg")).c_str(), &info); if (hFHandle != (DWORD_PTR)-1) { do { DxLib::sprintfDx(buf, TEXT("%s%s"), sFolder.c_str(), info.Name); nSHandle[nFCount++] = DxLib::LoadSoundMem(buf); } while (DxLib::FileRead_findNext(hFHandle, &info) >= 0); } DxLib::SetUseASyncLoadFlag(FALSE); // (これ以降の新規ハンドルは)非同期OFF while (!DxLib::ProcessMessage()) { DxLib::ClearDrawScreen(); int nNLoad = DxLib::GetASyncLoadNum(); if (nFCount < 2) { // ファイルが少ない時 (1個だけの場合) if (nNLoad == 0) dPercent += 5.0; // 読み終わったら加速 else dPercent += 100.0 / (3.0 * 60.0); // 「最長3秒」での想定。ファイルサイズによってこの秒数を変えるとよいかも } else { // ファイルが多い時 (ファイルの残数が減ればゲージを伸ばす) dPercent = 100.0 * ((double)(nFCount - nNLoad) / (double)nFCount); } if (dPercent > 100.0) dPercent = 100.0; // 追加 DxLib::sprintfDx(buf, TEXT("残り %d"), nNLoad); DxLib::DrawString(16, 200, buf, DxLib::GetColor(255, 255, 255)); DxLib::DrawBox(16, 220, 16 + (int)((double)(640 - 32) * dPercent / 100.0), 220 + 32, DxLib::GetColor(255, 255, 0), TRUE); DxLib::ScreenFlip(); if (dPercent == 100.0 && nNLoad == 0) break; // 修正 } DxLib::WaitKey(); // 追加 DxLib::InitSoundMem(); return DxLib::DxLib_End(); } ※2018/05/05 05:55 下の10行くらいを追加/修正しました。(100%オーバー対策、最後キー待ち)
メンテ
Re: 読み込み画面 ( No.2 )
名前:管理人 日時:2018/05/04 23:46

> 私は容量でやりたいのですが、可能でしょうか? すみません、できません 読み込み時間はファイルからデータをメモリに読み込む処理だけではなく、読み込んだ後に行う 圧縮データの解凍処理や、解凍したデータを DirectX 関連の機能に組み込む処理などにも 時間が掛かっているので、容量だけで何%読み込みが終わったかを判断することはできません ( 例えば、wavファイルは mp3ファイルより容量が大きいですが、同じ再生時間のファイルの場合 大抵 mp3ファイルの方が読み込み時間が長くなります( mp3ファイルはデコードに時間がかかるため ) ) この問題の完全な解決には決定的なものはないので、仮に私が取り組む場合は Rasterさんが ご提案されている『想定の読み込み時間』の方法を強化して、『想定の読み込み時間』を 『実際に読み込み処理をして読み込み時間を計測したものにする』ということをするかも、と考えています つまり、事前に LoadGraph や MV1LoadModel で読み込んだ際の時間を GetNowCount などを使用して計測しておき、 計測した時間を『ファイル読み込み時間リスト』のファイルに出力して、実際の実行時のプログレスバーの %表示には『ファイル読み込み時間リスト』から読み込みに掛かる時間を想定して経過時間に応じて プログレスバーの%を増やすというものです ただ、この方法も『ファイル読み込み時間リスト』の作成に使用したPCと、実際に実行するPCとの 性能の差が大きければ大きいほど誤差が大きくなったり、そもそもPCの場合は2回目以降の読み込みでは キャッシュが効いて同じPCでも読み込み時間が変化したりするので、どの程度有効かはわからないという問題がありますが・・・
メンテ
Re: 読み込み画面 ( No.3 )
名前:にこよん 日時:2018/05/05 01:20

> Raster 様 サンプルとアイデアをありがとうございます とりあえず動作は思っていたように動いていました ただ、コードを理解するのにもう少し時間をくださいm(__)m (改造して流用したいです...) > 管理人 様 他の処理に時間がたくさんかかってしまうのはわかったのですが、その上で(デコード時間は考えないことにして)容量を取得する関数を実装することは可能でしょうか? 確かにおっしゃられているとおりなのですが、その話を聞いた感じだと、 一般的に市販されているゲームの読み込みを見ると100%まで行った後、しばらく止まるものがほとんどなので、割と何とかなりそうに感じてしまいます あらかじめ大体の時間を用意しておくのと大差ないかもしれませんが、どちらかというと作りたいからというか自己満足なので... 他のユーザーからしたら余りいらない機能だと思うので、時間がかかりそうなら大丈夫ですm(__)m
メンテ
Re: 読み込み画面 ( No.4 )
名前:管理人 日時:2018/05/05 02:51

> その上で(デコード時間は考えないことにして)容量を取得する関数を実装することは可能でしょうか? こちらは非同期で読み込もうとしているファイルの残り読み込み容量ということでしょうか? 仮にそうだとしますと、すみません、実装はできません libjpeg や libogg などの外部のライブラリを使用して読み込んでいるファイルフォーマットについては ファイル読み込みの処理は外部のライブラリが主導して行っているので、DXライブラリ側が正確な 残り読み込み容量を取得することができないという問題や、3Dモデルファイルのようにテクスチャなどが 別ファイルになっている場合は、ある程度ファイルを読み進めないと読み込むファイルの総量が分からない などの問題があるためです ( 仮に技術的な問題がクリアできたとしても現在の非同期読み込み処理にかなり手を加えないといけないので  その作業時間を捻出できないという根本的な問題もありますが・・・ (- -;; )
メンテ
Re: 読み込み画面 ( No.5 )
名前:にこよん (解決) 日時:2018/05/05 05:46

> 管理人 様 そのような問題があるのですね 無茶なことを聞いてすみませんでした(-_-;) ご回答ありがとうございました Raster 様から頂いたサンプルを参考に作り替えようと思います
メンテ
Re: 読み込み画面 ( No.6 )
名前:Raster(解決) 日時:2018/05/05 05:59

にこよんさん ちょっと直しました。(読み込みに時間がかかって100%オーバーする場合の対応)
メンテ

Page: 1 |

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

   クッキー保存