我想知道是否有人可以建议在Android Java和Android中加载纹理的良好模式。 OpenGL ES应用程序。
我首先关注的是确定要分配的纹理名称的数量,以及在渲染顶点之前如何有效地执行此操作。
我的第二个问题是加载纹理,我必须根据我的游戏数据推断出要加载的纹理。这意味着我将使用字符串,我理解这是我在GL线程中不应该做的事情。
总的来说,我了解加载纹理时发生了什么,我只是希望从中获得最佳生命周期。还有其他我应该考虑的事情吗?
答案 0 :(得分:14)
1)您应该根据需要分配任意数量的纹理名称。一个用于您正在使用的每个纹理。
加载纹理是一项非常繁重的操作,会拖延渲染管道。所以,你永远不应该在游戏循环中加载纹理。您应该在呈现纹理的应用程序状态之前具有加载状态。加载状态负责加载渲染中所需的所有纹理。因此,当您需要渲染几何体时,您将加载所有纹理,您不必再担心它了。
请注意,在不再需要纹理之后,必须使用glDeleteTextures删除它们。
2)如果你的意思是通过推断你需要不同层次或类似的不同纹理,那么你应该处理加载状态下的水平数据并决定需要加载哪些纹理。
另一方面,如果你需要绘制文本(比如当前得分),那么OpenGL中的事情会变得更加复杂。您将拥有以下选项:将所需文本预渲染到纹理(简单),实现自己的位图字体引擎(更难)或使用Bitmap和Canvas对动态生成纹理(慢)。
如果您在游戏过程中显示的消息集有限,那么我很可能会将它们预渲染为纹理,因为实现非常简单。
对于当前得分,具有纹理的纹理就足够了,该纹理具有从0到9的数字的字形并且用于呈现任意值。实施将非常简单。
如果您需要更长时间的本地化文本,那么您需要开始考虑动态生成纹理。基本上,您将创建一个使用Canvas渲染文本的位图。然后,您将其作为纹理上传并将其渲染为任何其他纹理。在您不再需要它之后,您将删除它。此选项很慢,应该在应用程序循环中避免使用。
3)关于纹理并从GPU中获得最佳效果,你应该至少记住下面的事情(这些事情会变得更先进,你应该在你获得应用程序之后再烦恼它们和运行,如果你需要优化帧速率):
答案 1 :(得分:2)
这应该是对Lauri的答案的评论,但是我不能用1个代表发表评论,并且应该指出这一点:
每次您的EGL上下文丢失时(例如,当您的应用程序被置于后台并再次返回时),您应该重新加载纹理。因此,(重新)加载它们的正确位置在方法
中public void onSurfaceChanged(GL10 gl, int width, int height)
渲染器的。显然,如果你有不同的纹理集要加载(即)你正在玩的游戏级别,那么当你改变等级时你应该删除你不会使用的纹理并加载新的纹理。此外,您必须跟踪在EGL上下文丢失时必须重新加载的内容。