gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:28:32 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

2) 如果你的意思是推断不同的关卡需要不同的纹理或类似的东西,那么你应该在加载状态下处理关卡数据并决定需要加载哪些纹理。

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

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

对于当前的乐谱,拥有一个包含 0 到 9 数字字形的纹理并使用它来渲染任意值就足够了。实现将非常简单。

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

3) 关于纹理和充分利用 GPU,您至少应该牢记以下几点(这些内容会变得更高级,只有在启动应用程序后才应该考虑它们并运行以及是否需要优化帧速率):

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

关于java - 在 Android OpenGL ES 应用程序中加载纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com