Добавлен , опубликован

Перенос из блога

Содержание:

Первичная версия после переноса из блога

В данный момент в разработке находится базовый механизм выгрузки лишних фрагментов карты, которые находятся далеко от объектов, вызывающих загрузку - игроков, камер, якорей и так далее. Данный алгоритм подразумевает простейший способ определения фрагментов карты, которые подлежат выгрузке: нет вызывающих загрузку объектов в непосредственной близости - выгружаем.
Такая простая реализация несомненно позволит сократить затраты памяти и устранить падение игры из-за того, что память закончилась. В то-же время, этот до боли простой алгоритм чреват неприятными последствиями, среди которых замирание всего, что слишком далеко от игрока и необходимость дергать диск или соединение с сервером так часто, как часто игрок пересекает границу фрагмента карты.
Первое, что можно сделать, это ввести "серую зону" между границей "видимости" загружающих карту объектов и реальной границей выгрузки фрагментов - увеличиваем время жизни фрагментов карты, а значит сокращаем кол-во обращений к диску. В некоторой степени это помогает и с проблемой замирающих объектов в выгруженных фрагментах карты - посещенные игроком фрагменты карты выгружаются не сразу, а значит и у объектов в этих фрагментах остается больше времени что-то сделать.
Недостаток этого метода в том, что механизм выгрузки фрагментов карты становится несколько непредсказуемым, а значит на него нельзя полагаться в вещах, требующих гарантированного наличия загруженного фрагмента карты в определенном месте.
И вот, совершенно внезапно, мне пришла мысль - а почему бы не поместить фрагменты карты, подлежащие выгрузке, в очередь с приоритетами и фильтровать их по какому-то признаку, позволяющему определить, на сколько же важен тот или иной фрагмент карты.
В таком случае можно будет выгружать только фрагменты карты с низкой важностью для системы, а важные фрагменты карты выгружать только при крайней необходимости.
Над тем, по каким критериям назначать приоритет выгрузки для фрагментов карты еще нужно подумать, но навскидку можно назвать пару вариантов:
  • расстояние до игрока и других источников принудительной загрузки (на практике это скорее критерий попадания в очередь выгрузки, чем критерий для сортировки)
  • кол-во изменений в фрагменте карты за определенный промежуток времени (надежный критерий, но требующий дополнительного учета каждого изменения)
  • кол-во загрузок-выгрузок фрагмента карты за определенный промежуток времени (адаптивный критерий, позволяющий стабилизировать некоторые системы, хорош как вспомогательный для какого-то другого критерия)
  • кол-во обращений к фрагменту карты на определенном промежутке времени, считая за одно обращение вызов функции world.getChunkAt(x,y) вне зависимости от того, что дальше будет происходить с полученным фрагментом карты. (достаточно сбалансированный способ на мой взгляд, дающий приличную точность с минимальной дополнительной нагрузкой)
  • фиксированный показатель значимости, который назначается на основании содержимого фрагмента и изменяется при изменении содержимого (отличается от полного учета изменений тем, что обрабатываются только особые случаи вроде добавления и удаления конкретных объектов)

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...