Поведение удаления скина libgdx

У меня вопрос о поведении скина libgdx. игра, которую я разрабатываю, имеет глобальный AssetsManager (из набора libgdx), к которому может получить доступ каждый класс. Я загружаю разные TextureAtlas внутри этого управления активами. Я знаю, что assetsManager.dispose() размещает все ресурсы, загруженные внутри диспетчера активов.

Теперь я хотел бы также загрузить скин (для графического интерфейса) в диспетчере ресурсов. Скин будет использовать несколько TextureAtlas...

Вот вопрос: так как я собираюсь использовать skin.addRegion() и поскольку ссылка на онлайн-API о классе скина говорит: «Атлас не будет автоматически удаляться при удалении скина», это хорошая идея, чтобы загрузить все TextureAtlasof скин в глобальном менеджере активов?

Я опасаюсь действия dispose. Потому что, когда я вызываю assetsManager.dispose(), как TextureAtlas, так и Skin будут вызываться в методе dispose... но что, если TextureAtlas размещается до скина? Может ли на самом деле случиться какая-либо проблема по этому поводу?

Поведение кожи не так четко определено, я имею в виду... что делает метод dispose?

Заранее спасибо,

Лука


person Luca Marzi    schedule 27.09.2015    source источник
comment
Я забыл сказать, что, с другой стороны, в справочнике по онлайн-API говорится (о методе dispose() скина): удаляет TextureAtlas и все ресурсы Disposable в скине.   -  person Luca Marzi    schedule 27.09.2015


Ответы (2)


skin.dispose() вызывает dispose для любых конкретных ресурсов, которые Disposable. Но сам TextureAtlas не является одним из "ресурсов" поэтому его надо утилизировать вручную отдельно от скина.

Единственный пример одноразового ресурса скина, о котором я могу думать, — это BitmapFont, который не использует TextureAtlas, который вы используете со скином.

Обратите внимание, что вы никогда не должны вызывать dispose для чего-то, что вы загрузили с помощью AssetManager. Вместо этого вы должны вызвать manager.unload() для этого ресурса, чтобы AssetManager мог правильно управлять зависимостями.

Хорошая вещь в manager.unload() заключается в том, что он отслеживает, сколько других ресурсов зависит от объекта, и удаляет его только тогда, когда он свободен от зависимостей. Поэтому, если вы также загружаете свой скин с помощью AssetManager, вам нужно только беспокоиться о вызове manager.unload("mySkin"), и он правильно определит, следует ли также удалять связанный TextureAtlas.

Но обязательно вызывайте unload() для ресурса только один раз за каждый раз, когда вы вызывали load() для того же ресурса. Внутренний подсчет зависимостей AssetManager основан на том, что все ваши вызовы load() и unload() отражают друг друга один к одному.

person Tenfour04    schedule 28.09.2015

Я не хотел публиковать ответ, но не смог опубликовать комментарий с кодом -_-.

Итак, если ситуация следующая: `

assetManager.load("images/guiTextureAtlas", TextureAtlas.class);
assetsManager.load("skin/uiSkin.json", Skin.class)";

assetsManager.finishLoading();

Skin uiSkin = assetManager.get("skin/uiSkin.json");
uiSkin.addRegion(assetManager.get("images/guiTextureAtlas");

`

Все ли в порядке, если я вызову assetsManager.dispose() для удаления всех ресурсов?

person Luca Marzi    schedule 28.09.2015
comment
Я делаю это, потому что хочу загрузить в диспетчер активов полный скин (json + TextureAtlas)... Но загрузчик скинов принимает только файловый дескриптор для файла .json... - person Luca Marzi; 28.09.2015
comment
Или, может быть, я неправильно понял значение SkinLoader... на самом деле это кажется такой запутанной документацией! - person Luca Marzi; 28.09.2015