我正在为DirectX编写一个.X文件解析器类。当我尝试解析大文件时,创建枚举对象的调用失败。
我认为这是因为文件的大小...当前类适用于较小的文件,例如tiger.x(31 kb)。但是,当我尝试加载一个较大的文件,例如tiny.x(1500 kb)时,创建枚举对象的调用失败...这里是CXParser.cpp的摘录:
#include "CXParser.h"
#include "d3dx9xof.h"
BOOL CXParser::Parse(char *filename, void** data)
{
LPD3DXFILE pDXFile = NULL;
LPD3DXFILEENUMOBJECT pEnum = NULL;
LPD3DXFILEDATA pDataObj = NULL;
SIZE_T nChildren = NULL;
DWORD Depth = 0;
int iFileLength=0;
HANDLE hFile=NULL;
DWORD dwBytesRead=0;
LPVOID fileBuffer = NULL;
hFile = CreateFileA (filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
iFileLength = GetFileSize (hFile, NULL);
fileBuffer = malloc (iFileLength + 2) ;
ReadFile(hFile, fileBuffer, iFileLength, &dwBytesRead, NULL);
BeginParse(data);
if(FAILED(D3DXFileCreate(&pDXFile)))
{
MessageBox(NULL, L"Could not Create DX File Interface Object", L"ERROR", MB_OK);
return false;
}
if(FAILED(pDXFile->CreateEnumObject((LPVOID)filename, DXFILELOAD_FROMFILE, &pEnum)))
{
MessageBox(NULL, L"Could not Create DX Enumeration Object", L"ERROR", MB_OK); pDXFile->Release();
return false; // function exits here when loading large .X files
}
if(FAILED(pEnum->GetChildren(&nChildren)))
{
MessageBox(NULL, L"Could not Enumerate .X File", L"ERROR", MB_OK);
return false;
}
for(SIZE_T index = 0; index < nChildren; index++)
{
if(SUCCEEDED(pEnum->GetChild(index, &pDataObj)))
{
if(!pDataObj->IsReference())
{
GetObjectName(pDataObj);
ParseObject(pDataObj, Depth, NULL);
pDataObj->Release();
}
}
}
EndParse(data);
pEnum->Release();
pDXFile->Release();
return TRUE;
}
我的问题是:
是否可以在解析之前将.X文件加载到内存缓冲区?
另外,我注意到tiger.x和tiny.x为浮点值保留了不同的位数(标题是不同的):
tiger.x的标题:xof 0302txt 0064
tiny.x的标题:xof 0303txt 0032
加载.X文件进行枚举时,这种差异是否会导致问题?
答案 0 :(得分:0)
如果这是默认的tiny.x模型,我只是看到它在枚举时因意外指定无效路径而失败。我在枚举之前添加了文件路径检查(我使用了boost :: filesystem :: exists(path))。
我建议添加这样的检查,因为上面的代码示例没有这样的显式检查,因此您的模型可能具有无效的名称,因此错误可能会产生误导。