使用AndroidGameView
课程时,正确处理暂停/恢复活动的最佳方法是什么?
每当一个活动被暂停时,所有OpenGL纹理都会被清除,需要它们被视图重新加载。似乎GLSurfaceView
(link)类具有正确处理这些事件的适当机制。 (通过覆盖onResume
。)
这应该如何与AndroidGameView
(link)类一起使用? (Android游戏视图是否不支持此功能?)该类似乎具有相应的挂钩(特别是Resume
)。但是,当Resume
被调用时,GraphicsContext
尚未设置。
在Resume
调用MakeCurrent()
期间抛出异常:
System.InvalidOperationException: Operation requires a GraphicsContext, which hasn't been created yet.
如果我在CreateFrameBuffer
之前拨打MakeCurrent()
,您会收到类似的错误:
Java.Lang.IllegalArgumentException: Make sure the SurfaceView or associated SurfaceHolder has a valid Surface
在使用OnResume
时,何时应该加载/重新加载任何特定于游戏的纹理以响应活动的AndroidGameView
回调?
答案 0 :(得分:1)
不知道该链接被标记为有效答案。当使用Xamarin Mono4Android(Monodroid)API在java中使用“纯”Android进行开发时,该解决方案是有效的。
我找到了这个问题的灵魂。
处理此问题的最佳方法是在创建/销毁OpenGL上下文(及相关表面)时重新恢复纹理。
在Mono4Android中,您应该将这些覆盖方法用于AndroidGameView
override void CreateFrameBuffer()
{
if(checkIfResourceWhereLost)
{
checkIfResourceWhereLost = false;
// Code to RESTORE your textures
}
}
override void DestroyFrameBuffer()
{
checkIfResourceWhereLost = true;
// Code to RELEASE all textures
}
答案 1 :(得分:0)
活动有一些很好的方法来处理这些事情。 OnStart,OnRestart,OnStop等。你应该能够覆盖它们并在那里做你的东西。
答案 2 :(得分:0)
This question/answer解释了暂停/恢复时android上opengl-es的问题