在Android OpenGL ES App中加载纹理

Ale*_*zzi 6 java android textures opengl-es

我想知道是否有人可以建议在Android Java和OpenGL ES应用程序中加载纹理的良好模式.

我首先关心的是确定要分配多少纹理名称以及如何在渲染顶点之前有效地执行此操作.

我的第二个问题是加载纹理,我必须根据我的游戏数据推断要加载的纹理.这意味着我将使用字符串,我理解这是我在GL线程中不应该做的事情.

总的来说,我了解加载纹理时发生了什么,我只是希望从中获得最佳生命周期.还有其他我应该考虑的事情吗?

Lau*_*uri 14

1)您应该根据需要分配尽可能多的纹理名称.一个用于您正在使用的每个纹理.

加载纹理是一项非常繁重的操作,会使渲染管道停顿.所以,你永远不应该在游戏循环中加载纹理.您应该在呈现纹理的应用程序状态之前具有加载状态.加载状态负责加载渲染中所需的所有纹理.因此,当您需要渲染几何体时,您将加载所有纹理,您不必再担心它了.

请注意,在不再需要纹理之后,必须使用glDeleteTextures删除它们.

2)如果你的意思是通过推断你需要不同级别或类似的不同纹理,那么你应该处理加载状态的级别数据并决定需要加载哪些纹理.

另一方面,如果你需要绘制文本(比如当前得分),那么在OpenGL中事情变得更加复杂.您将有以下选项:将所需文本预渲染到纹理(简单),实现您自己的位图字体引擎(更难)或使用Bitmap和Canvas对动态生成纹理(慢).

如果你在游戏中显示有限的消息集,那么我很可能会将它们预渲染到纹理,因为实现非常简单.

对于当前分数,足以具有纹理,该纹理具有0到9的数字的字形并且用于呈现任意值.实施将非常简单.

如果您需要更长的本地化文本,那么您需要开始考虑动态生成纹理.基本上,您将创建一个使用Canvas渲染文本的位图.然后,您将其作为纹理上传并将其渲染为任何其他纹理.在您不再需要它之后,您将删除它.此选项很慢,应该在应用程序循环中避免.

3)关于纹理并从GPU中获得最佳效果,你应该至少记住下面的事情(这些事情会变得更先进,只有在你启动并运行应用程序后才能使用它们.如果你需要优化帧率):

  • 最小化纹理更改,因为它是一个缓慢的操作.最理想的是,您应该批量使用相同的纹理渲染所有对象.然后更改纹理并渲染需要它的对象,依此类推.
  • 使用纹理图集来最小化纹理数量(和纹理更改)
  • 如果你有很多纹理,你可能需要使用8888以外的其他位深度来使所有纹理适合内存.使用较低的位深度也可以提高性能.

  • 当你说"加载状态"时,它是否可以与我初始化渲染器同时进行?我目前的想法是让它初始化我的场景图并查询场景图中的所有对象,看看它们最终会请求的纹理(通过让它们从游戏模型中推断出名称).然后,为每个请求纹理的对象提供其所要求的纹理的相应OpenGL整数"名称".这看起来不错吗? (2认同)
  • 我喜欢使用状态机建模高级应用程序逻辑.因此术语加载状态.在完成剩余的初始化的同时完成此操作是完全可以的.这只是您想要如何设计应用程序逻辑的问题.所以看起来确实如此. (2认同)