Зависимости активов LibGDX снижают прогресс

#kotlin #libgdx

#kotlin #libgdx

Вопрос:

Это скорее общий вопрос о самой платформе (в частности, о AssetManager), а не вопрос о коде.

Я работал над пользовательским загрузчиком для кэширования эффекта контура для моих текстурных атласов, когда заметил, что индикатор выполнения в состоянии загрузки моей игры в какой-то момент падает в процентах. Это был мой загрузчик, который требовал загрузки зависимостей: базового атласа и шейдера (а также другого атласа для текстуры глубины).

Мой загрузчик обычно выглядит следующим образом (в Kotlin):

 class OutlineLoader(
    resolver: FileHandleResolver
) : AsynchronousAssetLoader<OutlineAtlas, OutlineLoader.Parameter>(resolver) {
    override fun loadSync(manager: AssetManager, name: String, 
                          file: FileHandle, params: Parameter): OutlineAtlas {
        val sourceAtlas = assetManager.get<TextureAtlas>(name)
        val depthAtlas = assetManager.get<TextureAtlas>(params.depth)
        val shader = assetManager.get<ShaderProgram>(params.shader)

        return OutlineAtlas(sourceAtlas, depthAtlas, shader)
    }

    override fun getDependencies(name: String, file: FileHandle, 
                                 params: Parameter) =
            Array<AssetDescriptor<*>>().also { array ->
                listOf(
                        AssetDescriptor(name, TextureAtlas::class.java),
                        AssetDescriptor(params.depth, TextureAtlas::class.java),
                        AssetDescriptor(params.shader, ShaderProgram::class.java)
                ).forEach(array::add)
            }


    ...
}
  

Итак, я ставлю некоторые ресурсы в очередь и позже использую их. Выходные данные регистратора AssetManager подтверждают это. Тем не менее, прогресс увеличивается до 25%, затем до 20%; до 60%, затем до 33%. Я вставил инструкцию debug-print, чтобы следить за ходом загрузки после каждого assetManager.update() вызова, и это что-то вроде этого:

 [AssetManager] Queued: sprites/sprites.atlas, foo.bar.OutlineAtlas
[AssetManager] Loading: sprites/sprites.atlas, foo.bar.OutlineAtlas
[DEBUG] Loading: 0%
[AssetManager] Loading dependency: sprites/sprites.atlas, com.badlogic.gdx.graphics.g2d.TextureAtlas
[AssetManager] Loading dependency: sprites/depth.atlas, com.badlogic.gdx.graphics.g2d.TextureAtlas
[AssetManager] Loading dependency: shader/depth.frag, com.badlogic.gdx.graphics.glutils.ShaderProgram
[DEBUG] Loading: 0%
[AssetManager] Loaded: 20.16505ms shader/depth.frag, com.badlogic.gdx.graphics.glutils.ShaderProgram
[DEBUG] Loading: 25%
[AssetManager] Loading dependency: sprites/depth.png, com.badlogic.gdx.graphics.Texture
[DEBUG] Loading: 20%
[AssetManager] Loaded: 20.56412ms sprites/depth.png, com.badlogic.gdx.graphics.Texture
[DEBUG] Loading: 40%
[AssetManager] Loaded: 85.70349ms sprites/depth.atlas, com.badlogic.gdx.graphics.g2d.TextureAtlas
[DEBUG] Loading: 60%
[AssetManager] Loading dependency: sprites/sprites.png, com.badlogic.gdx.graphics.Texture
[AssetManager] Loading dependency: sprites/sprites2.png, com.badlogic.gdx.graphics.Texture
[AssetManager] Loading dependency: sprites/sprites3.png, com.badlogic.gdx.graphics.Texture
[AssetManager] Loading dependency: sprites/sprites4.png, com.badlogic.gdx.graphics.Texture
[DEBUG] Loading: 33%
[AssetManager] Loaded: 72.27248ms sprites/sprites4.png, com.badlogic.gdx.graphics.Texture
[DEBUG] Loading: 44%
[AssetManager] Loaded: 116.72272ms sprites/sprites3.png, com.badlogic.gdx.graphics.Texture
[DEBUG] Loading: 56%
[AssetManager] Loaded: 165.29959ms sprites/sprites2.png, com.badlogic.gdx.graphics.Texture
[DEBUG] Loading: 67%
[AssetManager] Loaded: 237.17233ms sprites/sprites.png, com.badlogic.gdx.graphics.Texture
[DEBUG] Loading: 78%
[AssetManager] Loaded: 341.5768ms sprites/sprites.atlas, com.badlogic.gdx.graphics.g2d.TextureAtlas
[DEBUG] Loading: 89%
[AssetManager] Loaded: 405.7238ms sprites/sprites.atlas, foo.bar.OutlineAtlas
  

Просматривая исходные тексты, я не могу понять, намеренно это или я слепо делаю что-то глупое? (Мне также не удалось найти что-либо по этой теме в wiki).

РЕДАКТИРОВАТЬ: Инструкции Debug-print выглядят следующим образом:

 if (!assetManager.update()) {
    val progress = "${assetManager.progress * 100f}%"
    Gdx.app.debug("[DEBUG]", progress)
} else { ... }
  

Это только AssetManager.getProgress() в Java.

Комментарии:

1. Покажите, как вы вычисляете процент

2. @icarumbas Я отредактировал вопрос. На самом деле я ничего не вычисляю, отсюда и вопрос о самом AssetManager .