在Android OpenGL ES应用程序中加载纹理

亚历山大·特拉齐(Alexander Trauzzi):

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

我首先要考虑的是确定要分配多少个纹理名称,以及在渲染顶点之前如何有效地进行此操作。

我的第二个担心是加载纹理,我必须根据我的游戏数据推断要加载的纹理。这意味着我将玩弄字符串,我知道这是我确实不应该在GL线程中执行的操作。

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

劳里:

1)您应该分配所需数量的纹理名称。每个使用的纹理一个。

加载纹理是一项非常繁重的操作,它会拖延渲染管线。因此,永远不要在游戏循环中加载纹理。您应该在呈现纹理的应用程序状态之前具有加载状态。加载状态负责加载渲染中所需的所有纹理。因此,当您需要渲染几何图形时,将加载所有纹理,而您不必再为此担心。

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

2)如果您推断要为不同的关卡或类似内容需要不同的纹理,则应在加载状态下处理关卡数据并确定需要加载的纹理。

另一方面,如果您需要绘制文本(例如当前分数),则OpenGL中的情况会变得更加复杂。您将具有以下选项:将所需的文本预渲染到纹理(简单),实现自己的位图字体引擎(更困难)或使用“位图和画布”对即时生成纹理(慢速)。

如果您在游戏期间要显示的消息集有限,那么我很可能会将其预渲染为纹理,因为实现起来很简单。

对于当前分数,只要具有一个纹理即可,该纹理具有一个从0到9的数字的字形,并使用该字形呈现任意值。实现将非常简单。

如果需要更长的本地化文本,则需要开始考虑即时生成纹理。基本上,您将创建一个位图,使用“画布”在其中渲染文本。然后,您可以将其作为纹理上传并渲染为其他任何纹理。在您不再需要它之后,您将其删除。此选项很慢,应在应用程序循环内避免。

3)关于纹理并要充分利用GPU,您至少应该牢记以下几点(这些事情会变得更高级,并且只有在启动应用程序并运行之后,您才需要理会它们)如果您需要优化帧速率):

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章