Зарегистрированные пользователи не просматривают эту тему.
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
Гружу меш кодом из СДК, основная часть которого приведена ниже, сообственно вопрос, почему при загрузке модели Dwarf из того же СДК, наблюдаеться катастрофическое падение ФПС с 2200 до 150 на довольно неслабой машине. Может кто укажет на пробленый участок кода? Ну и еще вопрос, имеет ли смысл не париться и использовать DXUT, или лучше все писать самому?
HRESULT Mesh::InitGeometry(LPCSTR models, LPDIRECT3DDEVICE9 pDevice)
{
//ResetWindow;
LPD3DXBUFFER pD3DXMtrlBuffer;
// Load the mesh from the specified file
if( FAILED( D3DXLoadMeshFromX(models, D3DXMESH_SYSTEMMEM,
pDevice, NULL,
&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials,
&g_pMesh ) ) )
{
// If model is not in current folder, try parent folder
if( FAILED( D3DXLoadMeshFromX(models, D3DXMESH_SYSTEMMEM,
pDevice, NULL,
&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials,
&g_pMesh ) ) )
{
MessageBox(NULL, «Не найдена модель», «TwinEngine», MB_OK);
return E_FAIL;
}
}
// We need to extract the material properties and texture names from the
// pD3DXMtrlBuffer
D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
g_pMeshMaterials = new D3DMATERIAL9[g_dwNumMaterials];
if( g_pMeshMaterials == NULL )
return E_OUTOFMEMORY;
g_pMeshTextures = new LPDIRECT3DTEXTURE9[g_dwNumMaterials];
if( g_pMeshTextures == NULL )
return E_OUTOFMEMORY;
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
// Copy the material
g_pMeshMaterials = d3dxMaterials.MatD3D;
// Set the ambient color for the material (D3DX does not do this)
g_pMeshMaterials.Ambient = g_pMeshMaterials.Diffuse;
g_pMeshTextures = NULL;
if( d3dxMaterials.pTextureFilename != NULL &&
lstrlenA(d3dxMaterials.pTextureFilename) > 0 )
{
// Create the texture
if( FAILED( D3DXCreateTextureFromFileA( pDevice,
d3dxMaterials.pTextureFilename,
&g_pMeshTextures ) ) )
{
// If texture is not in current folder, try parent folder
const CHAR* strPrefix = «textures/»;
CHAR strTexture[MAX_PATH];
StringCchCopyA( strTexture, MAX_PATH, strPrefix );
StringCchCatA( strTexture, MAX_PATH, d3dxMaterials.pTextureFilename );
// If texture is not in current folder, try parent folder
if( FAILED( D3DXCreateTextureFromFileA( pDevice,
strTexture,
&g_pMeshTextures ) ) )
{
MessageBox(NULL, «Не найдена текстура», «TwinEngine», MB_OK);
}
}
}
}
// Done with the material buffer
pD3DXMtrlBuffer->Release();
return S_OK;
}
|
|
12 февраля 2009, 18:52:57
|
| |
селёдка

01010 01010
bubuntu u$ver
Карма: +1/-0
Сообщений: 93
Офлайн
|
а де ти, власне, використовуєш цю функцію??? її тре раз використати при завантеженні геометрії, а не в кожному кадрі
|
|
13 февраля 2009, 00:47:15
|
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
if (AllInit())
{
ShowWindow( hWnd, SW_SHOWDEFAULT );
UpdateWindow( hWnd );
MSG msg;
ZeroMemory( &msg, sizeof(msg) );
while( msg.message!=WM_QUIT)
{
if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
...
Render();
}
}
}
Вот кусок кода с обработкой сообщений и рендером, а использую функцию в AllInit()
|
|
13 февраля 2009, 09:46:16
|
селёдка

Карма: +0/-0
Сообщений: 63
Откуда: 127.0.0.1
Офлайн
|
на фпс влияет только то, что выполняется каждый кадр. ищи в цикле прорисовки а не в загрузке.
|
|
13 февраля 2009, 14:13:24
|
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
Вот код из цикла прорисовки, но как на меня дело не в нем.
bool Mesh:  rawMesh(LPDIRECT3DDEVICE9 pDevice)
{
for( DWORD i=0; i<g_dwNumMaterials; i++ )
{
// Set the material and texture for this subset
pDevice->SetMaterial( &g_pMeshMaterials );
pDevice->SetTexture( 0, g_pMeshTextures );
// Draw the mesh subset
g_pMesh->DrawSubset( i );
}
return true;
}
|
|
13 февраля 2009, 19:46:09
|
селёдка

Карма: +0/-0
Сообщений: 63
Откуда: 127.0.0.1
Офлайн
|
посмотри чему равняется g_dwNumMaterials. закомментируй построчно код в цикле и выяви какая строка сильней всго давит на фпс
|
|
13 февраля 2009, 20:44:55
|
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
g_dwNumMaterials равняеться 9, и получаеться что
D3DXLoadMeshFromX(models, D3DXMESH_SYSTEMMEM,
pDevice, NULL,
&pD3DXMtrlBuffer, NULL, &g_dwNumMaterials,
&g_pMesh )
именно функция загрузки меша являеться тем самым тормозом, ну и следовательно вопрос какой формат моделей оптимально использовать и где об этом можно почитать доку?
|
|
13 февраля 2009, 22:11:19
|
селёдка

Карма: +0/-0
Сообщений: 63
Откуда: 127.0.0.1
Офлайн
|
убери код загрузки модели из цикла и напиши её перед ним.
|
|
14 февраля 2009, 00:14:29
|
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
Так кода загрузки модели и нету в цикле, модель грузиться один раз.
|
|
14 февраля 2009, 00:21:22
|
селёдка

Карма: +0/-0
Сообщений: 63
Откуда: 127.0.0.1
Офлайн
|
тогда D3DXLoadMeshFromX не может влиять на фпс.
2200 это при пустой сцене? отрисуй модель 10 раз за кадр и посмотри как фпс изменится. возможно, 150 фпс это нормально.
|
|
14 февраля 2009, 01:14:54
|
селёдка

01010 01010
bubuntu u$ver
Карма: +1/-0
Сообщений: 93
Офлайн
|
подивись скільки видає DirectxViwer, чи як його там (утилітка є в стандартному наборі СДК), можливо двоя модель сильно деталізована
« Последний раз изменено: 14 февраля 2009, 03:39:23 BrucE »
|
|
14 февраля 2009, 03:37:33
|
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
2200 при пустой сцене, если выводит Torus из стандартного набора с детализацией 16к полигонов то такого проседания нет, а тут есть, причем модель не особо детализирована, как на меня не больше 2к полигонов. А если вывести 10 таких моделей то фпс падает до 15. Хотя в другом примере «ShadowVolume» из СДК при точно такой самой модели около 400 ФПС, хотя там рисуеться еще и тень, правда там все делаеться через DXUT.
|
|
14 февраля 2009, 11:52:21
|
селёдка

01010 01010
bubuntu u$ver
Карма: +1/-0
Сообщений: 93
Офлайн
|
приатач тоді в файл повний код, бум розбиратись
|
|
14 февраля 2009, 12:35:07
|
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
|
|
14 февраля 2009, 15:21:36
|
селёдка

01010 01010
bubuntu u$ver
Карма: +1/-0
Сообщений: 93
Офлайн
|
void Render()
{
AltTab(); //спробуй закоментувати цю перевірку, можливо вона все тормозить
if(pDevice)
{
// Очистим область вывода темно-синим цветом
pDevice->Clear( 0, NULL,
D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_XRGB(0,0,12  , 1.0f, 0 );
// Рисуем сцену
if( SUCCEEDED( pDevice->BeginScene() ) )
{ //доцільніше створювати освічення в іншій ф-ції, а не в кожному кадрі
// создаем источник света
D3DLIGHT9 light=
{ D3DLIGHT_DIRECTIONAL, // бесконечно удаленный источник
{1,1,0,0}, // диффузное освещение: желтый цвет
{0,0,0,0},
{0.1f,0.1f,0.1f,1}, // рассеянный свет: тусклый белый
{0,0,0},
{7,-2,1} // вектор направления
} ;
//pDevice->SetLight( 1, &light ) ;
pDevice->LightEnable( 1, TRUE ) ;
//аналогічно з матеріалом
// создаем материал
D3DMATERIAL9 mtrl;
//Инициализируем его
mtrl.Ambient = WHITE;
mtrl.Diffuse = WHITE;
mtrl.Specular = WHITE;
mtrl.Emissive = WHITE;
mtrl.Power = 0.0f;
//pDevice->SetMaterial( &mtrl ) ; // тим більше що він тут і не ініціалюзується
//SetupMatrices();
CMesh.DrawMesh(pDevice);
DrawMyText(pDevice, hFont, FPS, 10, 10, 500, 700, D3DCOLOR_ARGB(250, 250, 250, 50));
поки все що замітив, ще щось знайду відпишу
З.І. за чим ти вивчаєш Дірект? можу дещо порадити(скинути з своєї інфи)
|
|
14 февраля 2009, 17:08:26
|
малёк
Карма: +0/-0
Сообщений: 33
Офлайн
|
Пробывал коментировать AltTab(), но дело не в нем
ДиректХ пытаюсь изучать разбираясь в СДК плюс роюсь в интернете.
|
|
14 февраля 2009, 17:24:52
|