2

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

4

2 回答 2

3

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

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

于 2012-07-15T09:35:52.627 回答
1

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

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

就 FPS 而言, la 的纹理创建glTexImage2d可能会暂时减慢速度,但这通常不是问题,尤其是当您显示(静态)加载屏幕时。

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

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

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

于 2012-07-23T03:02:05.933 回答