|
|
|
Канал Игры Мечты: «"Пул наборов вершин" or something» |
|
|
Endeavour
1015 EGP
       Рейтинг канала: 1(2) Репутация: 105 Сообщения: 7041 Откуда: guess Зарегистрирован: 26.05.2005
 |
|
Не нашел топика подходящего, почему-то...
В общем пинаю тут директ3д джаст фор фан, давно хотелось И пишу сразу с претензией на универсальность.
Дошел в туториале до CreateVertexBuffer, и сейчас хочу сделать контейнер для этих наборов вершин, чтобы было типа:
IngameObjectPool[ИНГЕЙМ_КУБИК_НАМБА_1] // свойства конкретного объекта, включая его id, трансформ, id_вершин, чтотоеще.
ModelPool[ТИПИЧНЫЙ_КУБИК] // refcount, буфер вершин, уникальный id набора
Вот с последним что-то у меня не получается. Уникальный ид - чтобы не загружать одну и ту же модель 100500 раз. Была мысль делать црц32 от полного имени файла модели, но что-то как-то она мне не нравится
Второй вариант - делать идшники руками, но как - не пойму.
Как правильно это делается?
* модель в данном тексте - просто набор вершин ;]
И второй вопрос по пути: map или vector?
язык c++
Последний раз редактировалось: Endeavour (18:01 07-07-2011), всего редактировалось 2 раз(а) |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
да обычным вектором можно. последовательный доступ к памяти рулит.
или хеш мапу по строке, но я не думаю что у тебя моделей будет настолько много, чтобы ощутить все прелести поиска за О(1).
_________________ MOV topka, C++ |
|
|
Endeavour
1015 EGP
       Рейтинг канала: 1(2) Репутация: 105 Сообщения: 7041 Откуда: guess Зарегистрирован: 26.05.2005
 |
|
основной вопрос про идшники, как правильно их сделать.
|
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
id = string, который file name, если это вектор.
или хеш функция строки, если тебе зачем-то надо делать хеш мапу.
_________________ MOV topka, C++ |
|
|
Endeavour
1015 EGP
       Рейтинг канала: 1(2) Репутация: 105 Сообщения: 7041 Откуда: guess Зарегистрирован: 26.05.2005
 |
|
если тупо по строке, то получится как-то так
Код: |
render_loop(){
BeginScene();
foreach(IngameObjects as iteratorIngame){
apply_transform(iteratorIngame->TransformMatrix);
render_vertices( Models[iteratorIngame->IdString].VertexBuffer );
}
EndScene(); Present();
} |
не медленно?
зы псевдокод, поэтому синтаксис мап, для удобства.
добавлено спустя 2 минуты:
либо я все взаимосвязи контейнеров не так представил %)
добавлено спустя 1 минуту:
зызы язык c++
Последний раз редактировалось: Endeavour (18:01 07-07-2011), всего редактировалось 4 раз(а) |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
если речь идет о поиске строки
for(int i = 0; i < models.size(); ++i)
if(models[i].id == iteratorIngame->IdString)
render_...
то нет, это не будет узким местом. лучше всего - пиши оба варианта и делай замеры.
какого размера models? если до 100 - не делай замеры - это точно быстрее чем мап
_________________ MOV topka, C++ |
|
|
Endeavour
1015 EGP
       Рейтинг канала: 1(2) Репутация: 105 Сообщения: 7041 Откуда: guess Зарегистрирован: 26.05.2005
 |
|
речь о том, что сравнение цифровых айдишников по-моему сильно побыстрее сравнения строк, учитывая что это делается для каждого объекта в каждом кадре.
основной вопрос: если делать эту связь цифровыми id - как их создавать, чтобы обеспечить уникальность. Может хранить просто число для рендер-цикла, и имя файла для проверки при подгрузке новых моделей?
вопрос про контейнер побочный вообще, скоорее всего вектор возьму и все.
|
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
// Hash function used for lump names.
// Must be mod'ed with table size.
// Can be used for any 8-character names.
// by Lee Killough
unsigned W_LumpNameHash(const char *s)
{
unsigned hash;
(void) ((hash = toupper(s[0]), s[1]) &&
(hash = hash*3+toupper(s[1]), s[2]) &&
(hash = hash*2+toupper(s[2]), s[3]) &&
(hash = hash*2+toupper(s[3]), s[4]) &&
(hash = hash*2+toupper(s[4]), s[5]) &&
(hash = hash*2+toupper(s[5]), s[6]) &&
(hash = hash*2+toupper(s[6]),
hash = hash*2+toupper(s[7]))
);
return hash;
}
из Doom3
или вот
http://www.cse.yorku.ca/~oz/hash.html
нашел в гугле на запрос "хэш функция для строк"
_________________ MOV topka, C++ |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Все просто... Представляем что все модели непрерывно лежат в файле со всей информацией. Делаем на этот файл MapViewOfFile, тогда разумно что-бы ID'ы моделей были оффсетами в этом файле. И уникальность и быстродействие :P
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Преждевременная оптимизация. Лучше оставить возможность в движке сделать это позже. Зачем париться сейчас?
_________________ MOV topka, C++ |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Юрец, спецом для тебя буду писать <сарказм моде он> и <сарказм моде офф> в следующий раз.
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Jurec
348 EGP
   Рейтинг канала: 4(76) Репутация: 102 Сообщения: 1441 Заблокирован Откуда: Seattle Зарегистрирован: 25.02.2006
 |
|
Я тут стриминг пишу, поэтому для меня это был не сарказм.
Посмотрел - у меня сделано через
hash_map<string, IResource*> mResourcesMap;
STL сам их хеширует. Если не надо STL - бери EASTL
_________________ MOV topka, C++ |
|
|
|
|
|
Канал Игры Мечты: «"Пул наборов вершин" or something» |
|