Интересный вопрос !
Я знаю что есть массивы одномерные ( или линейные ) или двумерные. А вот говорят что есть трёхмерные массивы. Какие это массивы - я чёт не пойму ??? И вообще где их можно применять и на каких языках создавать ( если такие можно создавать ) ???
|
Их можно применять почти на всех языках
Вот пример на блитце: Код:
Dim Matr%(n1,n2,n3) Вообще можно хоть десятимерные делать... |
в VB6 вроде максимум это 64х-мерные массивы... :)
|
впринципе ЛЮБУЮ систему (в том числе и многоуровневую) можно описать двумерным массивом, и я советую это делать поскольку обращение к даже элементу трехмерного массива ведет за собой кучу умножений, что жутко тормозит гаму...
ну а заюзать трехмерный массив можно например в проекте типа игры X-Tension. есть космические базы: одно измерение это набор свойств базы, типа там количество жизней, денег и т.п., второе измерение сами базы, третье измерение это сектора космического пространства в которых эти базы находятся... :) |
впринципе ЛЮБУЮ систему модно одномерным описать, только враппер работы с этим удовьствием будет работать ещё медленне умножений. А скорость умножений, кстати, не окажет уж очень сильного искажения ФПС. В общем как с ГОТО - толку мало, но некторые юзают. ИМХО.
|
Цитата:
конечно если при любом вычислении юзать постоянно функцию поиска то ессно метод мастдай. Многоуровневая статичная система: для каждого элемента оставляем поле для НОМЕРА элемента родителя в массиве. Многоуровневая динамичная система: в случае фрагментации элементы НЕ двигать + делать поле для номера родителя. Многоуровневая динамичная система с неограниченным количеством "детей": 1. сделать количество свободных элементов для максимально возможного количества детей. 2. заюзать дополнительный двумерный массив а в первом писать номер индекса второго массива где искать номера детей. конечно все можно и через одномерный массив юзать, но давайте не будем кривить логикой типа если не черное значит белое... юзать одномерный массив нерентабельно, нагрузочно (всякими системами переадресации и возможно поиском)... трехмерные и выше слишком накладно при вычислениях адреса элемента, хоть на сегодняшний день команда LEA выполняется за один такт и при этом в любом конвейере, но не думаю что компилятор заюзает ее при вычислении адреса трехмерного массива... опять-же зависит от задачи, если не часто обращаешься к элементам, то флаговая промышленность страны не обделит, юзайте массивы, а если хранить координаты и свойства точек трехмерной модели (а вдруг и четырехмерной) и делать всякие трансформации, повороты навороченные смещения текстур и др. то лучше заюзать двумерные... конечно это не добавит 20 или 30 ФПС, но когда борятся за каждый ФПС, то это поможет сэкономить пару... :) |
дайте пример логического расложение n-мерного масива в одномерный
чтобы dim(a1,a2,a3,...,aN) превратить в dim(a1*a2*a3*...*aN) желательно формулой :) ps. N-мерные масивы неиспользуются в играх используются только готовые классы одномерных и двухмерных масивов гарантированая n-мерность никому никогда не надо :) |
Саб, кажется я понял,что ты имеешь в виду.
Только для такой ситемы гораздо удобней и лучше юзать списки (различных типов - зависит от задачи) |
Динамические массивы рулят. (то бишь типы или списки)
|
хмм... тема оспорима ;)
чесно сказать никогда не мог понять как может рулить массив в котором постоянно работают системы сдвига и перераспределения памяти. дайте хоть ссылу чтоб почитать в чем можно выиграть при такой системе скорость. :) |
В подавляющем большинстве случаев, выигрыш обычного массива в скорости (оч мизерный) сводится на нет геморроем работы с ним.
Есть конечно случаи, когда он очень удобен, но в играх, как правило, таких случаев немного. Например клеточное поле с постоянной размерностью, набор заранее известного числа элементов. Но как только тебе нужно удалять\добавлять элементы в этот массив и сдвигать - тут начинается гемморой. И быстрей чем в списке, ты свой сдвиг не сделаешь (проверял на блитц и пурике) |
Массивы, 1- , 2- и трехмерные, лично я использую очень широко. Ибо быстро и просто. Как правило значительная часть данных, которые нужно хранить в игре или вообще не изменяется в реалтайме, или не меняет своей "общеколичественной" составляющей, т.е. вполне может быть реализована массивом.
Так, для примера, в массивах удобнее хранить показатели персонажей, параметры оружия, раскладку клавиатуры, карты (путей, освещения и т.п.) с регулярной сеткой, да мало ли еще что. И это логично: в процессе игры количество функциональных клавиш, "видов орков", или размеры матрицы проходимости не изменятся. То же относится и к многим схемам синглесрфейсных партиклов/декалей: удалить нужный квад из серфейса нельзя, бесконечно добавлять бессмыссленно, а значит мы изначально оперируем заведомо неизменным количеством обьектов и массив решает... пение диферамбов можно продолжать. Кроме того, при подгрузке нового уровня/кластера массивы можно без труда "переобьявить" под новые условия. Кстати, прирост скорости не такой уж и мизерный: несколько ФПС, когда их всего-то едва ли 40 с натягом- это немало. И код становится намного проще и, главное, короче. А значит- удобней и читаемей. ... При этом, я ни в коем случае не призываю отречься от списков: просто следует испольовать все доступные инструменты, и исходить из всего спектра их возможностей. С уважением. :) |
ОГО! Неожидал что только ответов будет на этот вопрос! Вообщем БОЛЬШОЕ всем спасибо. Прям простветили в массивы с головой :)
|
[тема не раскрыта] :)
на мой вопрос так и неответели - как разложить масив dim(a1,a2,a3,...,aN) в одномерный dim(a1*a2*a3*...*aN) ? формулой плиз... или идеей :) |
Вложений: 2
для 2мерного(далее по аналогии):
кстати -тема поднималась - как по отдельности так и целиком |
Часовой пояс GMT +4, время: 03:31. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot