Оптимизированный способ решить следующие - PullRequest
1 голос
/ 03 февраля 2012

Давайте предположим, что у меня есть таблица базы данных координат карты x и y.Я выбираю те, которые хочу отобразить, и создаю изображение карты, используя PIL.

Я создаю изображение, перебираю каждый фрагмент карты, чтобы вставить на него фоновое изображение, все в порядке.на плитке может быть n игроков, монстр, NPC, портал или что-то еще.Если на плитке есть какой-либо объект, мне нужно вставить конкретное изображение.

Проблема: как проверить, есть ли что-то на плитке?Какой должна быть структура БД?

У каждого игрока есть позиция (от FK до MapTile своей позиции).Если я сделаю запрос в БД, чтобы выяснить, где находится игрок / монстр / NPC на плитке, это было бы больно, поэтому я добавляю столбец objects_count к каждой координате.Если это> 0, тогда я ищу случаи.

Тогда это выглядит так:

if objects_count:
    if query_for_players_exists:
        show player
    elif query_for_monster_exists:
        show monster
    elif query_for_npc...
        show npc
    and so on.

Я мог бы использовать M2M для таблицы с родовыми отношениями, но IMHO родовые отношения не такбыстро.Учитывая, что набор запросов состоит из 49 плиток, как я могу легко определить, какой объект присутствует на плитке?

Ответы [ 2 ]

0 голосов
/ 03 февраля 2012

Зачем запускать запросы для каждой плитки или каждой плитки + возможного объекта? Выполните 1 запрос, чтобы вернуть все объекты для всех ваших плиток и перебрать ваш набор результатов по плитке.

Даже если у вас есть 100 объектов на плитку с 49 плитками, что составляет всего 4900 единиц в вашем наборе результатов.

fetch database rows and store resultset in some data structure
foreach tile
  if( have tile in DB resultset)
    place all object from tile
0 голосов
/ 03 февраля 2012

Первое, что пришло мне в голову, было следующее. Если плотность объектов не очень высокая (например, менее 15%, например, это можно рассчитать), у вас может быть таблица с этими полями: x, y, objects. Где objects может быть засеченным массивом или каким-либо другим текстовым представлением списка. Список названий плиток.

Если ваша карта достаточно плотная, вам лучше разбить ее на квадратные непересекающиеся куски и сохранить их как матрицы объектов (размер матрицы постоянен и зависит от размера области просмотра). Конечно, сами объекты также должны быть сериализованы в ячейки матрицы.

Но однозначно верно то, что вы не можете получить много производительности «простого» представления объектов. Вам нужно как-то упаковать их, чтобы уменьшить количество операций на уровне строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...