Оптимальное бинарное пространственное разбиение высокой плотности для сеток - PullRequest
4 голосов
/ 29 июня 2010

Я пишу игру, в которой персонаж перемещается по случайно сгенерированной карте в режиме реального времени (как это показано). Это приводит меня к интересной проблеме со структурами данных.Карта генерируется в том виде, в котором она появляется, в виде круга вокруг символа (вероятно, 20-60 элементов), поэтому там, где есть данные, она очень плотная и все в сетке.Там, где нет данных, могут быть огромные, не сгенерированные пространства.Персонаж может ходить по огромному кругу, например, создавая кольцо плиток вокруг огромного пустого пространства.

Простая матрица создаст огромное количество ненужных накладных расходов и потратит много места.Типичные BSP, тем не менее, похоже, что они могут привести к значительному падению производительности из-за плотного, подобного сетке характера данных.

Что вы предлагаете?Матрицы - четверки деревьев - какой-то гибрид двух?

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Я думаю о реализации чего-то похожего в моей игре, над которой я работаю. Я собираюсь создать собственный класс, к которому можно получить доступ, например, к двумерному массиву. map[x][y] но основной тип данных будет ближе к хеш-таблице. Что-то вроде data[x.Value.ToString() + "," + y.Value.ToString()]

Моя игра довольно проста, так как мои плитки будут когда-либо только проходимыми, смертельными или не проходимыми.

Я заинтересован в более элегантном решении: D

0 голосов
/ 31 июля 2010

Я занимался этим в течение последнего месяца и придумал, как мне кажется, довольно хорошее решение. Это не так быстро, как чистая матрица, но имеет то преимущество, что оно бесконечно расширяемо (в пределах int.)

По сути, это бинарный раздел пространства, который строится вверх (а не вниз, как квадродерево). Если вы записываете в точку за пределами выделенного в данный момент пространства матрицы, он генерирует больший узел и расширяется. Если большинству дочерних узлов узла назначены матрицы, он объединяет их в себя и удаляет их ссылки. Это означает, что чем больше четких границ вы используете, тем выше производительность, тем больше эта структура действует как матрица.

Я разместил свой код здесь , и в будущем постараюсь написать какую-нибудь демоверсию и перейти на более качественный хостинг.

Не стесняйтесь, дайте мне знать, что вы думаете, или если у вас есть какие-либо вопросы по этому поводу.

...