Как видеоигры эффективно хранят/получают большие объемы данных?

Хотя вы можете определить свою функцию как

import scala.reflect.runtime.universe.TypeTag

def flattenSeqOfMaps[S : TypeTag, D: TypeTag] = udf { 
  values: Seq[Map[S, D]] => values.flatten.toMap
}

, а затем использовать конкретные экземпляры:

val df = Seq(Seq(Map("a" -> 1), Map("b" -> 1))).toDF("val")

val flattenSeqOfMapsStringInt = flattenSeqOfMaps[String, Int]

df.select($"val", flattenSeqOfMapsStringInt($"val") as "val").show
+--------------------+----------------+
|                 val|             val|
+--------------------+----------------+
|[[a -> 1], [b -> 1]]|[a -> 1, b -> 1]|
+--------------------+----------------|

, также можно использовать встроенные функции без каких-либо потребность в явных дженериках:

import org.apache.spark.sql.functions.{expr, flatten, map_from_arrays}

def flattenSeqOfMaps_(col: String) = {
  val keys = flatten(expr(s"transform(`$col`, x -> map_keys(x))"))
  val values = flatten(expr(s"transform(`$col`, x -> map_values(x))"))
  map_from_arrays(keys, values)
}

df.select($"val", flattenSeqOfMaps_("val") as "val").show
+--------------------+----------------+
|                 val|             val|
+--------------------+----------------+
|[[a -> 1], [b -> 1]]|[a -> 1, b -> 1]|
+--------------------+----------------+
14
задан John Bubriski 30 March 2009 в 20:26
поделиться

9 ответов

Со всеми большими теперешними жесткими дисками даже разработчики, кажется, забывают сколько байтов, там находятся в мегабайте. Таким образом отвечать на вопрос в заголовке: игры хранят большие объемы данных путем создания savegames, которые несколько мегабайтов шириной.

Чтобы проиллюстрировать, насколько большой мегабайт, это - 8 миллионов битов. Это достаточно для кодирования 2^8000000 = 10^2666666 состояния. В сравнении, существуют только 10^80 атомы во вселенной. Теперь в (сохранение) игра там несколько подсистем с отличными состояниями; например, в RPG каждый NPC имеет свое собственное состояние. Но сколько из состояния там, действительно? Их положение в городе могло бы быть сохранено как 16 битов (Вы помните их точное положение, если они идут вокруг так или иначе?). Их настроение/расположение/и т.д. как еще 8 битов, и это допускает больше эмоций затем, некоторые люди имеют.

Когда дело доходит до хранения этого вида данных в игре, типичным datastructure является QuadTree. Это - datastructure, который позволяет Вам определять объекты в определенном регионе X-Y в O (зарегистрируйте N). В некоторых случаях разработчики игр находят легче предварительно разделить мир в зонах. Это уменьшает объем вычислений во время выполнения. Хорошим примером была Гибель. Его картам предварительно вычислили видимость; для каждой точки можно было определить быстро, которой зоне она принадлежала, и для каждой зоны было предварительно вычислено количество видимых объектов. Это уменьшило сумму объектов, которым были нужны проверки видимости во время выполнения.

12
ответ дан 1 December 2019 в 06:54
поделиться

Это может просто отображать объекты или NPCs, к X, Y, Z координатная плоскость. Та информация это быть сохраненным дешево.

Во время геймплея все те объекты все еще отображаются на системе координат в любом случае. Они просто должны читать в сохранять информации и запуститься оттуда.

9
ответ дан 1 December 2019 в 06:54
поделиться

В Осадках 3, в частности, карта разделена на вид сетки. Можно только видеть текущий квадрат и тех сразу затем. Тип хранилища данных не действительно важен - может быть база данных SQLite, может быть дерево, сериализированное к диску, или может быть что-то еще полностью.

... Вы Вы имели бы гигантский массив каждого объекта в игре и постоянно обновляли бы меньший список, который содержит видимые объекты для рендеринга?

Обычно да, но "гигантский массив" не должен быть в памяти. И существует больше списков - возражает в текущем и смежном квадрате сетки (можно подвергнуться нападению сзади - не в видимом списке), видимый список, список таймера...

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

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

Все сохраняется, когда Вы уезжаете/возвращаете к местоположению.

Нет. Объекты, которые Вы отбрасываете за пределами своего дома, в конечном счете исчезнут. Тела также, вероятно. Случайные монстры повторно порождены время от времени. Это и удобно для разработчиков компьютерных игр и согласовывается с реальным миром.

4
ответ дан 1 December 2019 в 06:54
поделиться

Я думаю, что Вы переоцениваете сложность того, что хранится/получается. Вы не должны хранить 3D модели для объектов, или их структуры или любую из вещей, которые составляют значительные части размера на диске игры.

В первую очередь, как хаос упомянул, только необходимо хранить информацию о вещах, которые были перемещены. Даже затем, вероятно, только необходимо сохранить, для каждого из тех, нового положения и ориентации (предполагающий, что нет других включенных переменных, как "поврежденный"). Таким образом, это - два вектора для каждого объекта, который будет вокруг общего итога 24 байтов за объект. Это означает, что можно хранить информацию для 40 000 объектов на мегабайт. Это - очень много объектов переместиться.

Восстановление этих данных не более сложно, чем размещение объектов во-первых. Каждому объекту нужно было определить положение/ориентацию по умолчанию, чтобы игра поместила его где-нибудь, таким образом, все, что Вы делаете, заменяет значение по умолчанию хранимой суммой в сохранить файле. Это не сложно, и не требует никакой значительной дополнительной обработки.

8
ответ дан 1 December 2019 в 06:54
поделиться

Если Вы думаете об информации, необходимо сохранить, это действительно не так очень;

Например.

  • Положение
  • Ориентация
  • Материально-технические ресурсы
  • Здоровье
  • Объективное состояние

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

Некоторые игры как Обитель зла только позволяют, сохраняет, когда Вы входите, новая зона, означающая Вас, не должны хранить всю информацию для объектов в обеих зонах. Когда Вы "загружаете" сохранение, их атрибуты прибывают из диска.

Относительно то, как это - данные, является retrieved/modofied, я не совсем уверен, что понимаю. Это - просто данные в консольной памяти. Когда плеер сохраняет, это записано в устройство сохранения, и когда они загружаются, это восстанавливается.

3
ответ дан 1 December 2019 в 06:54
поделиться

Одна главная техника является дифференциалом, сохраняет: только сохранение указывает, что это - что-то другое, чем его значение по умолчанию. Сравните и контрастируйте "сохранение состояния и местоположения каждого объекта в игровом мире" с "сохранением состояния и местоположения каждого объекта в игровом мире, который плеер переместил или изменил".

2
ответ дан 1 December 2019 в 06:54
поделиться

Повторение других ответов, самые большие сбережения прибывает из устранения всех ненужных данных состояния.

Если Вы посмотрите на 8-разрядные игры скроллера стороны, то они начнут отбрасывать состояние, как только вещи являются внеэкранными, и часто ничего не сохраняют, потому что их ресурсы слишком трудны для имения в наличии больше, чем минимальное количество экземпляров.

Выполнение его на макроуровне для игры как Осадки 3 является просто вопросом увеличения объема проблемы. Вы начинаете разделять среду сеткой или другими геометрическими методами и материалом spawn/despawn как игровые движения от одного раздела до следующего. Вы идеально сохраняете размер каждой области небольшим так, чтобы состояние в оперативной памяти не было высоко. Вы выясняете, что абсолютный минимум состояния должен был иметь в наличии NPC и экземпляры объекта, и в данных расположения Вы отмечаете как можно больше, чтобы автоповторно метать икру так, чтобы этому не было нужно никакое сохраненное состояние.

Если Вы хотите быть указанными на определенную структуру данных, формат сериализации в качестве примера мог бы быть линейным потоком, индексированным деревом указателей, где организация дерева соответствует расположению карты.

1
ответ дан 1 December 2019 в 06:54
поделиться

Помимо того, что все другие сказали, я хотел бы добавить, что состояние не делает необходимый, подразумевают просто положение и перемещение, но также и properites для соответствующего состояния. Обычно Игровой Механизм имеет ведьму функции, позволяет Вам сохранять данные определенного класса.

Скажите, что у Вас есть класс Плеера, и Вы хорошо в историю, когда Вы нажимаете, сохраняют возможные данные, которые могут храниться:

  • Где плеер расположен на уровне/карте
  • Что является его атрибутами: здоровье, мана, сила, аналитика, и т.д.
  • Что навыки делает он имеет.
  • Какой уровень - он.

Глобально мы можем также иметь:

  • Сколько ссылок (имена, которые позволяют механизму поднимать объект из списка) к объектам хранится на том определенном уровне, другими словами, когда Вы загружаете, какие объекты должны быть загружены наряду с ним.
  • Мы используем физику, раз так кто использует ее.

И намного больше. Осадки 3 имеют один тип сохранения, другая игра будет иметь другого. Это действительно зависит от жанра и используемого механизма.

1
ответ дан 1 December 2019 в 06:54
поделиться

На связанной ноте игровые механизмы часто используют сжатие Zip, чтобы подавить размер всего этого содержания и также сделать некоторые операции быстрее.

1
ответ дан 1 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: