【问题标题】:Loading Mesh with AssetManager libGDX使用 AssetManager libGDX 加载网格
【发布时间】:2012-12-28 10:07:42
【问题描述】:

我正在尝试在加载屏幕期间为我的 libGDX 游戏预加载我的 Mesh 对象。我遵循here 编写自己的加载程序的过程。所以我基本上复制了libGDX PixmapLoader 并称之为MeshLoader。唯一的问题是,因为它是异步的,所以在创建Mesh 时,OpenGL 上下文不可用。有谁知道如何用AssetManager 异步加载Mesh?我已成功使用SynchronousAssetLoader 而不是AsynchronousAssetLoader,但这会导致我的加载屏幕出现延迟。有什么想法吗?

【问题讨论】:

    标签: java android loading libgdx


    【解决方案1】:

    参见 AssetLoadingTask API,update() 方法(由 AssetManager 使用)

     /*Updates the loading of the asset. In case the asset is loaded with an   
     * AsynchronousAssetLoader, the loaders AsynchronousAssetLoader#loadAsync(AssetManager, String, AssetLoaderParameters) 
     * method is first called on a worker thread. 
     * Once this method returns, the rest of the asset is loaded on the rendering
     * thread via AsynchronousAssetLoader#loadSync(AssetManager, String, AssetLoaderParameters).
    

    因此,您在加载 Pixmap 时无法完全异步加载网格,因为后者不是 openGL 资产。

    您可以复制TextureLoader,它异步加载像素数据(如像素图),然后在渲染线程上同步创建纹理。

    您能做的最好的事情是异步计算您的顶点/索引并同步进行绑定。

    编辑 对于那些不阅读 cmets 的人...如果您使用 ObjLoader 加载大网格,您可以按照第三条评论中给出的 Kieran 方法。

    【讨论】:

    • 谢谢,好吧,我也想通了。我创建了一个加载器,至少将 .obj 文件读入String,然后我可以从那里同步创建我的网格,并在渲染线程上阻塞。
    • 看看 ObjLoader 源代码。你不能覆盖它,因为它充满了静态方法,但是一个小小的复制粘贴不会造成太大的伤害!您可以轻松地将所有字符串处理移动到异步线程,并且可能需要多几行来创建缓冲区。
    • 感谢您的建议!我使用来自ObjLoader 的代码并在loadAsync() 方法中完成所有工作,并创建了一个自定义对象来保存创建Mesh 对象所需的结果。然后我创建了一个基类,它使用我加载的顶点来创建网格。现在一切都是异步的,并且运行良好!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多