При разработке небольшой игры ограничения целевой платформы (объем потребляемой памяти, размер бандла, вычислительная мощность и расход батареи), вероятно, не вызовут никаких проблем. Однако при создании больших игр, потребление памяти, скорее всего, будет одним из самых больших ограничений, особенно на портативных устройствах. Опытная команда будет тщательно рассчитывать расход ресурсов с учетом ограничений платформы. Defold предоставляет ряд инструментов, помогающих управлять памятью и размером бандла. В данном руководстве дается обзор этих инструментов.
Создавая игру в Defold, вы статически декларируете дерево ресурсов. Каждая отдельная часть игры связана с этим деревом, начиная с коллекции начальной загрузки (обычно называемой “main.collection”). Дерево ресурсов следует за каждой ссылкой и включает все ресурсы, связанные с этими ссылками:
При сборке игры в бандл будет включено только то, что находится в дереве ресурсов. Все, на что нет ссылок в дереве, будет исключено. Нет необходимости вручную выбирать, что включить или исключить из бандла.
Когда игра запускается, движок стартует с корня загрузки дерева и извлекает ресурсы в память:
Однако движок в процессе выполнения не будет выполнять автоматическую загрузку следующих типов ресурсов, на которые имеются ссылки:
Используемый по умолчанию способ, которым Defold собирает и загружает ресурсы, может быть изменен для обеспечения более тонкого контроля над тем, как и когда ресурсы попадают в память.
Ресурсы, на которые ссылаются фабрики, обычно загружаются в память при загрузке этого компонента. Ресурсы готовы к порождению в игре, как только фабрика появляется в среде выполнения. Чтобы изменить поведение по умолчанию и отложить загрузку ресурсов фабрики, достаточно отметить флажок Load Dynamically в свойствах этой фабрики.
Если эта опция установлена, движок все равно включит в бандл ресурсы по ссылкам, но автоматически загружать ресурсы фабрики не будет. Вместо этого есть два варианта на выбор:
factory.create()
или collectionfactory.create()
, если необходимо породить объекты. При этом ресурсы будут загружаться синхронно, а затем порождаться новые экземпляры.factory.load()
илиcollectionfactory.load()
для асинхронной загрузки ресурсов. Когда ресурсы будут готовы к порождению, будет получен обратный вызов.См. руководства по фабрикам и фабрикам коллекций чтобы подробнее узнать о том, как это работает.
Defold ведет подсчет ссылок на все ресурсы. Если счетчик ресурсов достигает нуля, это означает, что на него больше ничто не ссылается. После этого ресурс автоматически выгружается из памяти. Например, если удалить все объекты, порожденные фабрикой, а также удалить объект, содержащий фабрику, то ресурсы, на которые ранее ссылалась фабрика, будут выгружены из памяти.
Для фабрик с отмеченной опцией Load Dynamically можно вызвать функцию factory.unload()
или collectionfactory.unload()
. Этот вызов удаляет ссылку фабрики на ресурс. Если на ресурс больше ничто не ссылается (например, удалены все порожденные объекты), этот ресурс будет выгружен из памяти.
Посредством прокси-коллекций из процесса сборки бандла можно исключить все ресурсы, на которые ссылается компонент. Это целесообразно, если требуется свести размер пакета к минимуму. Например, при запуске веб-игры на платформе HTML5 браузер загружает весь бандл до начала выполнения игры.
Если для прокси-коллекцию отметить опцию Exclude, то ресурс, на который ссылается эта прокси-коллекция, будет исключен из бандла. Вместо этого можно хранить исключенные коллекции в выбранном облачном хранилище. Руководство по Live-обновлению описывает особенности работы данной возможности.
Did you spot an error or do you have a suggestion? Please let us know on GitHub!
GITHUB