Я хотел бы опубликовать это здесь для тех, кто может искать ответ на аналогичную проблему, связанную с поиском циклов сохранения, чтобы объяснить проблемы роста памяти.Во-первых, большое спасибо всем тем, кто помог мне остановить случайные безумные попытки моих нейронов найти удерживающие циклы там, где их не было (или они не были достаточно большими, чтобы иметь значение).Теперь:
Во-первых, удерживать циклы страшно, конечно, но использовать инструменты для их поиска, а затем управлять, как рекомендует Apple, поскольку Swift 4.2 подходит:
something()
{
[weak self] in
guard let self = self else { return }
self.whatever()
}
Я видел некоторых людейутверждайте, что вы должны определить, имеет ли смысл неподходящий или слабый - это честно снимает догадки и делает это намного проще.Я обнаружил, что неизвестные сбои в любом случае редки, по крайней мере, для нас, но я не буду останавливаться на вашем приложении, и это решает проблемы.Теперь, когда вы очистили дом:
Мы обнаружили, что наши проблемы с ростом памяти связаны не с нашим классом синглтонов активов, а с самим размером текстурных атласов и соответствующим перекрывающимся использованием этих атласов.Я не могу рекомендовать это обсуждение достаточно: Как работает кэширование и повторное использование SKTexture в SpriteKit? .Это концептуально объяснит проблемы, с которыми вы можете столкнуться с атласом лучше, чем я.
Вкратце, однако: SpriteKit управляет распределением ваших атласов текстуры, и, соответственно, вы должны понимать, что если у вас очень большой атлас, которыйпри частой загрузке он может работать не так, как вы ожидаете (у меня все еще недостаточно подробностей, чтобы лучше это описать, но, как я уже сказал, пожалуйста, обратитесь к обсуждению выше, а также к руководству Apple по разработке SKTextureAtlas: https://developer.apple.com/documentation/spritekit/sktextureatlas).
Теперь, в связи с тем обсуждением в Apple, я отметил следующую строку, которая, на мой взгляд, должна быть выделена жирным шрифтом и красным цветом: «SpriteKit неявно загружает атлас при доступе к одной из текстур атласа». Это было важно для решениято, что я думаю, было нашей основной проблемой: у нас было несколько мест, где мы по какой-то причине обращались к текстурам в атласе через один экземпляр - вы должны понимать, что в случае большого атласа SpriteKit будет загружать весь ваш массивный атлас в памятьТак что я больше неСлегка примите к сведению Apple, чтобы управлять размерами вашего атласа.Атласы предназначены для активов, которые всегда используются вместе и собираются вместе.Загрузка разрозненных активов в атлас была нашей ошибкой.Мы реорганизуем то, как мы управляем этим соответствующим образом.