Войти
ПрограммированиеФорумГрафика

Текстура ест много оперативки (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
17:13, 27 мая 2011

Вот это зачет :) респект RPGman.
Логика понятна, позже буду пробовать реализацию.

> Текстура формата jpeg
А текстуру, я так, просто для сравнения, физический ее размер на диске указал... вроде и так понятно что ее размер в железе в формате argb больше, просто не настолько. Но я сначала std::map применю, потом еще раз проверю.

Еще раз спасибо! :)


#16
9:19, 6 июня 2011

р.р.р не могу разобраться, как тут сделать правильно? киньте табуреткой :)

  map<LPSTR, LPDIRECT3DTEXTURE9> TextureMaps;
  for (DWORD i = 0; i< dwNumber; i++)
  {
    map<LPSTR, LPDIRECT3DTEXTURE9>::iterator ifind = TextureMaps.find( D3DXMeshMaterials[i].pTextureFilename );
      if ( ifind == TextureMaps.end() )     //if ( ifind->first != D3DXMeshMaterials[i].pTextureFilename )
      {
        D3DXCreateTextureFromFile( D3DDevice, D3DXMeshMaterials[i].pTextureFilename, &MeshTexture[i]));       
        TextureMaps.insert ( std::pair<LPSTR, LPDIRECT3DTEXTURE9>(D3DXMeshMaterials[i].pTextureFilename, MeshTexture[i]));
      }
      else
        MeshTexture[i] = ifind->second;
  }

условие постоянно пролетает if ( ifind == end) и грузит текстуру.

#17
10:30, 6 июня 2011

Ты сравниваешь указатели, а не строки.

#18
12:46, 6 июня 2011

да, так и есть. Если не чего не найдено ( ifind указывает на конец контейнера) то грузим текстуру.
А вот если есть... тут я уже не уверен, но до нее не доходит, пока :)

#19
13:26, 6 июня 2011

DX_M
> да, так и есть.
это неправильно

#20
13:35, 6 июня 2011

Спасибо. А как правильно?
Мне так мсдн сказал http://msdn.microsoft.com/ru-ru/library/92cwhskb.aspx , в экзамплах.
if ( m1_RcIter == m1.end( ) )

#21
13:41, 6 июня 2011

DX_M
> А как правильно?

я, конечно, извиняюсь - но вроде как правильно map<string,*> а то даже может не заработать

#22
13:57, 6 июня 2011

Я, конечно, извиняюсь - но вроде как правильно if (!TextureMaps[filename]) ...

#23
14:36, 6 июня 2011

Dimich
> но вроде как правильно if (!TextureMaps[filename]) ...
И какого типа filename? Если указатель, то где гарантии, что для одинакового текста эти указатели одинаковые?
И какого типа TextureMaps? Если мапа, то такая "проверка" родит новый элемент, в котором будет лежать неинициализированный указатель на текстуру, который вероятно окажется ненулевым, и проверка всегда будет "находить" левую текстуру.

#24
16:12, 6 июня 2011

Вы совершенно правы. я бьюсь в попытках сделать все верно.
глобально LPDIRECT3DTEXTURE9* MeshTexture= NULL;

процедура загрузки.

MeshTexture  = new LPDIRECT3DTEXTURE9[dwNumber];

map<LPSTR, LPDIRECT3DTEXTURE9> TextureTable;
for (DWORD i = 0; i< dwNumber; i++)
{
    if ( TextureTable[D3DXMeshMaterials[i].pTextureFilename] )      //где pTextureFilename - LPSTR, да, сравнивает указатели (указатель в контейнере, и указатель на pTextureFilename), как сравнить значения?
    {
      MeshTexture[i] = TextureTable[ D3DXMeshMaterials[i].pTextureFilename ];      //если текстура повторяется, надо дать ей ссылку на уже имеющийся вариант
    }
    else
    {
      D3DXCreateTextureFromFile( D3DDevice, PathToTexture( ScreenPath , D3DXMeshMaterials[i].pTextureFilename, &MeshTexture[i]);      //если такой текстуры не было - загружаем, а ссылку на текстуру кладем в контейнер
      TextureTable.insert( std::pair<LPSTR, LPDIRECT3DTEXTURE9>(D3DXMeshMaterials[i].pTextureFilename, MeshTexture[i])); //после помещения в контейнер, принимает вид: [0] = (0x04cb69e0 "iam_trying.jpg", 0x00000000)
    }
}
// любая попытка поставить в этом коде лишний & или * обрушивается ошибками при компилировании, например: "LPDIRECT3DTEXTURE9: недопустимое использование этого типа в качестве выражения"

#25
16:40, 6 июня 2011

Что такое D3DXMeshMaterials[]?
Если имена текстур там грузятся из файлов, а не заданы в коде, то два идентичных текста будут иметь разные указатели. Поэтому текстуры будут продолжать плодиться.
Последний вариант некорректен. Предыдущий вариант был правильнее, за одним исключением - LPSTR вместо string. Надо было:

  typedef map<string,LPDIRECT3DTEXTURE9> TextureCache;
  TextureCache TextureMaps;
  for (DWORD i = 0; i< dwNumber; i++)
  {
      TextureCache::iterator ifind = TextureMaps.find( D3DXMeshMaterials[i].pTextureFilename );
      if ( ifind == TextureMaps.end() )
      {
        D3DXCreateTextureFromFile( D3DDevice, D3DXMeshMaterials[i].pTextureFilename, &MeshTexture[i]));       
        TextureMaps.insert(make_pair(D3DXMeshMaterials[i].pTextureFilename, MeshTexture[i]));
      }
      else
        MeshTexture[i] = ifind->second;
  }

#26
16:44, 6 июня 2011

DX_M

короче, не парься, найди пример StateManager в sdk и покури его конкретно так

#27
17:42, 6 июня 2011

Я б с удовольствием. Но только когда решу задачу :) Вроде работает!

for (DWORD i=0; i<dwNumber; i++)
{
  if (MeshTexture[i])  MeshTexture[i]->Release(); // :'(
}
Остался один момент на выгрузке:
когда мы выгрузили элемент текстуры, на который ссылались остальные, при выгрузке последующего вылетает и говорит: "  Нарушение прав доступа при чтении "0xfeeef...

#28
17:48, 6 июня 2011

innuendo
> короче, не парься,
rolton | Текстура ест много оперативки
Сейчас на мейле, на глаза попалось :)

#29
17:51, 6 июня 2011

А почему бы просто не так

std::map<std::string, CTexture*> textures;

CTexture* CMaterialManager::LoadTexture(const std::string &filename)
{
  if (textures[filename])
    return textures[filename];

  CTexture* texture = new CTexture(filename);
  textures[filename] = texture;
    return texture;
}
?

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.