如何使用Android GameView处理Xamarin中的Activity恢复事件

时间:2011-12-28 04:20:03

标签: android opengl-es xamarin.android

使用AndroidGameView课程时,正确处理暂停/恢复活动的最佳方法是什么?

每当一个活动被暂停时,所有OpenGL纹理都会被清除,需要它们被视图重新加载。似乎GLSurfaceViewlink)类具有正确处理这些事件的适当机制。 (通过覆盖onResume。)

这应该如何与AndroidGameViewlink)类一起使用? (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回调?

3 个答案:

答案 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的问题