【问题标题】:OpenGL ES Android Loading ScreenOpenGL ES Android 载入画面
【发布时间】:2012-07-23 11:02:05
【问题描述】:

我正在创建一个基于 OpenGL 的 2D 游戏。我想创建一个加载屏幕来加载我的资产。我想画一些东西来向用户展示正在加载的东西。但我了解到我不能使用像 asynctask 这样的单独线程来加载我的纹理。所以我被困在那里。如何创建加载屏幕来加载我的资产?

【问题讨论】:

  • 这是题外话。但我想知道为什么更多的设备没有整洁的硬件加速加载或闪屏。我敢打赌,如果某些 Android 设备具有严重的 3D 加载屏幕,更多人会购买这些特定设备。为了解决您的问题:加载屏幕不是加载您的资产的内容。它在那里向用户提供反馈。您是否已经让程序的“加载资产”部分工作了?
  • 是的,通常我的游戏正在运行,但是在我想创建一个加载屏幕后,我开始使用 asynctask 来加载我的资产。由于 opengl 的上下文问题,我加载了我的纹理,但纹理需要重新加载。跨度>

标签: android opengl-es


【解决方案1】:

也许您可以使用类似Threading textures load process for android opengl game 接受的答案

即有一个单独的线程将纹理加载到内存中,然后主线程对该纹理执行 glTexImage2d 调用,而另一个线程开始加载另一个纹理,依此类推。主线程还可以在每次 glTexImage2d 调用后更新屏幕上的进度表。进度报告会有点粗糙,但我不知道您需要它们有多精确。

【讨论】:

    【解决方案2】:

    取决于您所说的“负载”是什么意思。加载是一个两步过程:

    1. 将图像加载到(主)内存中。这可以从任何线程完成。
    2. 通过将图像加载到显存中来创建纹理。这必须从 GL 线程中完成。

    glTexImage2d 的纹理创建可能会暂时降低 FPS,但这通常不是问题,尤其是当您显示(静态)加载屏幕时。

    所以原则上你可以在 GL 线程上完成所有加载,如果你的初始屏幕是静态的(即没有任何移动,因此 FPS 无关紧要):

    1. 将启动画面资源加载到内存中
    2. 创建启动画面纹理并绘制启动画面
    3. 将游戏资源加载到内存中
    4. 创建游戏画面纹理并绘制游戏画面

    但是,如果您的初始屏幕是动态的,您将需要在单独的加载线程上执行 3. 操作,完成后,在 GL 线程上创建游戏纹理。这需要从加载线程向 GL 线程发出信号,表明资产的加载已准备好创建纹理。

    【讨论】:

    • “这需要从加载线程向 GL 线程发出信号,表明资产的加载已准备好创建纹理。”是的,我在问如何从单独的线程向 gl 线程发出信号?
    • 这可以通过多种方式完成(任何跨线程通信技术),并遵循与处理相同的范例,例如来自 UI 线程的用户输入,如 developer.android.com/reference/android/opengl/… 所示。您还可以简单地检查 onDrawFrame() 方法中的 isBitmapReady 标志,当您的加载线程完成时将其设置为 true,然后启动您的纹理创建。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-04
    • 2011-04-02
    相关资源
    最近更新 更多