Что эффективней в использовании — объекты или матрица?
Есть игровое поле, состоящее из 1000 клеток. Каждая клетка должна содержать в себе информацию: 1) тип клетки (проходимая/непроходимая), 2) количество проходимых клеток вокруг текущей клетки, 3) расстояние от этой клетки до клетки игрока, 4) тип ресурса на клетке.
Вопрос в том, как эффективнее хранить всю эту информацию. Создать класс клетки и присвоить каждой клетке объект этого класса с соответствующими свойствами. Или. Создать матрицу, в которой в виде списка будет храниться вся информация о каждой клетке. Например ["impass", "4", "58", "iron"].
Какой из вариантов более удачный? Какой будет использовать меньше ресурсов при вычислении пути и прочих манипуляциях с клетками?
То есть КАДЖАЯ игровая клетка у вас содержит расстояние до игрока?
1. а что вы будете делать если игрок изменит свою позицию? пересчитывать расстояния для ВСЕХ игровых клеток?
2. а что вы будете делать если у вас НЕСКОЛЬКО ИГРОКОВ? хранить и пересчитывать расстояния для ВСЕХ игровых клеток до ВСЕХ игроков?
не проще ли рассчитывать расстояние по необходимости?
Роман, вся информация не будет отображаться постоянно. Только когда игрок захочет узнать информацию по карте. Поэтому расчитываться будет только по запросу
yavaskript, ответ на ваш вопрос зависит от множества факторов: размера игрового поля, количества игроков, частоты обращения к тем или иным игровым функциям и д.р. . При этом существуют 2 основных типа оптимизации, первый - минимизируется расход памяти за счет увеличения объемов вычислений, второй минимизируется объем вычислений за счет их предвычисления и кэширования результатов в памяти (то что делаете вы). В общем случае, выбор типа оптимизации зависит от частоты использования функционала, ее содержащего. В случае если функционал используется редко (ваш случай) то желательно оптимизировать по памяти, если часто (очень часто) то по скорости выполнения. Но в конечном счете решать вам)
Роман, спасибо за ответ)) а как бы вы посоветовали хранить такой большой набор объектов (1000 штук)? Как их перебирать? Если хранить в матрице, то тут всё понятно - каждый элемент в матрице соответствует клетке поля (и матрица и поле по сути таблицы, несложно поставить в соответствие). А как быть с объектами?
yavaskript, вот пример недоделанной игры snake, в которой по сути решается этаже проблема. Посмотрите реализации классов Snake, Apple и Board. В данной реализации я вообще отказался от хранения информации о каждой клетке игрового поля, и храню в классах Snake и Apple только информацию об объектах (змейке и яблоках соответственно). Вряд ли Вам подойдет такой подход, но возможно вы увидите некоторые интересные решения, которые сможете применить у себя. В данной реализации идет оптимизация по памяти за счет отказа от хранения информации о клетках игрового поля.