はかせのラボ

私の頭の中を書いていく雑記ブログです

C++ フォルダ配下のファイル一括読み込み②

あいさつ

どうも、はかせです。
一気に冷え込みましたね。
私はいつにも増して凍えております。
今回は前回作った機構を本プロジェクトに入れてみようと思います。

対してすることもなかった・・・

さぁ!っと意気込みたいところですが、
実装に関しては九割五分前回で終わっているので大して変わっておりませんorz
強いて言うならば組み込む際にわざわざchar、stringで処理せず、
最初からwchar_t、wstringでやればいんじゃね?
と思い、そうしたぐらいですかね。
あと変換処理は不要になったのでまるっと消しましたw
ではコードです。

#include "stdafx.h"
#include "DirLoder.h"
#include <Windows.h>
#include <string>

using namespace MyDirectX;
using namespace std;

vector<wstring> DirLoder::GetFilePathInDir(const wstring & dirName, const wstring & extension) noexcept(false)
{
	HANDLE hFind;
	//defined at Windwos.h
	WIN32_FIND_DATA win32fd;
	//ファイル名の配列
	std::vector<std::wstring> fileNames;

	//探すファイル名指定 ワイルドカードを使用
	std::wstring searchName = dirName + L"\\*." + extension;
	//ファイル検索
	hFind = FindFirstFile(searchName.c_str(), &win32fd);

	//見つからなかったか
	if (hFind == INVALID_HANDLE_VALUE)
	{
		throw std::runtime_error("file not found");
	}

	//次のファイルがある限り読み込み続ける
	do
	{
		//ディレクトリなら無視
		if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {}
		//ファイルパスを取得
		else
		{
			//ファイル名
			std::wstring fileName = win32fd.cFileName;
			//渡されたディレクトリ配下を示す
			auto dirPath = dirName + _T("/");
			//ファイル名と合わせてパス生成
			fileName.insert(0, dirPath);
			fileNames.push_back(fileName);
		}
	} while (FindNextFile(hFind, &win32fd));
	//閉じる
	FindClose(hFind);

	return fileNames;
}

変換処理がなくなったのでincludeとかが減ってスッキリしました。

ちょっと起こったこと

これでテクスチャがまるっと読み込めるぞ!ってことで読み込んだら
なんかメモリ使用量が6倍くらいになりました。

ただテクスチャ数枚増えただけじゃそんな増えるとは思えませんでした。
なんで同じテクスチャを複数読んでいるとか疑って調べてみましたがそんなこともありませんでした。

んで、結果から言うとそもそも読み込もうとしてたテクスチャがデカすぎただけでした。
テクスチャのpngサイズは800kbぐらいなんですが、
解像度が6047*6047とかいうえぐいものでしたw
いつも使っている512*512の解像度に変更したら解決しました。

テクスチャ読み込みをするときはサイズだけでなく
解像度とかも気を付けないとメモリが死にますねw

あとがき

今回は前回の続きで作ったものを取り込んでみました。
実装には詰まらなくなってきましたが、
しょうもないとこで躓くのは相変わらずですねw

ただこういうミスって結構忘れないんで、
いい経験だと思って笑っときます。

それでは今回はこの辺でノシ

今回作ったものはgithubに上げました
github.com