2015-05-23 1 views
2

Я использую LinkedHashMap<Integer, Integer> для хранения значений слоев на плитке в 2D-игре. Более низкие числа рисуются над более низкими числами.Эффективная альтернатива Map <Integer, Integer> в Java, в отношении автобоксинга?

В моей функции рисования я перебираю заданное значение и рисую каждый. Это означает, что я unboxing значения (width * height * numLayers) раз. Я планирую порт для Android, поэтому я хочу быть максимально эффективным, и я думаю, что это слишком много?

Причина, по которой я использую карту, состоит в том, что номер слоя (ключ) имеет значение: клавиши выше 4 нарисованы над игроками и т. Д. Поэтому мне часто нужно пропустить кучу ключей.

Возможно, я просто использовал int[10], так как мне не понадобится много слоев, но тогда все неиспользуемые слои будут занимать 32 бита по сравнению с моим текущим HashMap, который может иметь ключи 0, 9 и занимает всего 64 бит.

+1

* Unboxing * очень эффективен - все, что он делает, это получить номер из объекта. Он не создает новый объект или что-то еще. У вас есть доказательства того, что это на самом деле вызывает у вас проблемы? –

+0

Я тоже занимаюсь большим количеством бокса, так как я хранил куски 2000 плиток, загружаемых в любой момент времени. Это скорее проблема памяти, чем проблема с производительностью. – Audiocrow

ответ

2

Эффективная альтернатива карте?

SparseIntArrays более эффективно, чем HashMap<Integer,Integer>. Согласно документации

SparseIntArrays представляет целые числа целых чисел. В отличие от обычного массива целых чисел , в индексах могут быть пробелы. Предполагается, что память больше , чем использование HashMap для сопоставления целых чисел с целыми числами как из-за того, что он избегает ключей и значений автоматического бокса, а их структуры не полагается на дополнительный объект ввода для каждого сопоставления. Для контейнеров, содержащих до сотни предметов, разница в производительности незначительна, менее 50%.

для получения дополнительной справки click here

Для Non-Android языки:

  • Написать свой собственный Hash основе класса карты (не реализующий collections.Map). Относительно простое использование «линейного зонда» в массиве ячеек - другой метод - это связанный список, который (опять же) будет таким же большим, как опция «прямой массив».
  • GNU Trove has primitive maps, который будет делать то, что вы хотите. Но если вы не пытаетесь извлечь каждый байт памяти, я бы предпочел предложение Томаса использовать массив.
+0

Благодарим вас за ответ, который звучит идеально. Это приложение для рабочего стола тоже, я все еще смогу его использовать? – Audiocrow

+0

Этот класс недоступен в android.util, поэтому он доступен только для android – Kartheek

+0

@Audiocrow обновленный ответ. – Kartheek