Android Render 技巧
android上EGL环境的构建都放到GLSurfaceView里边并且EGLContext很多情况下可能丢失重建.导致我们native创建的许多资源要重新创建这个不便的地方在于Render或者client需要保存很多状态信息来重建Render资源.落实到我们的代码的话就需要记录下Scene/avatar的状态然后重新设置.
测试发现切换到后台再回来GLSurfaceView的EGLContext会重新创建(某些型号的GPU).这样的话单纯的切换到后台操作也会导致场景的重新绘制,代码层面比较繁琐.
解决方案:
我们可以继承GLSurfaceView的EGLContextFactory然后设置自己的EGLContextFactory,并且在View里边创建一个自己的EGLContext. 在我们的EGLContextFactory里创建EGLContext时候把View自己的EGLContext作为shared的EGLContext.
Native的SetScene或者addRenderImage的操作(一般来自主线程)可以利用View自己创建的EGLContext(通过JNI Call Java "eglMakeCurrent" 代码实现).这样的话GLSurfaceView自己维护的Context就是释放后重新创建也是利用我们的EGLContextFactory创建也就意味着是View自己的EGLContext的shared EGLContext.这样的话native创建的那些资源还保留着.
这样解决了单纯GLSurfaceView的EGLContext各种case下的释放下Native Resource的释放导致的代码的复杂性.
后续就是测试这个solution的稳定性可靠性还有Resource方面的增加.如果没啥问题的话对代码的简洁可维护性是个很好的消息.
测试发现切换到后台再回来GLSurfaceView的EGLContext会重新创建(某些型号的GPU).这样的话单纯的切换到后台操作也会导致场景的重新绘制,代码层面比较繁琐.
解决方案:
我们可以继承GLSurfaceView的EGLContextFactory然后设置自己的EGLContextFactory,并且在View里边创建一个自己的EGLContext. 在我们的EGLContextFactory里创建EGLContext时候把View自己的EGLContext作为shared的EGLContext.
Native的SetScene或者addRenderImage的操作(一般来自主线程)可以利用View自己创建的EGLContext(通过JNI Call Java "eglMakeCurrent" 代码实现).这样的话GLSurfaceView自己维护的Context就是释放后重新创建也是利用我们的EGLContextFactory创建也就意味着是View自己的EGLContext的shared EGLContext.这样的话native创建的那些资源还保留着.
这样解决了单纯GLSurfaceView的EGLContext各种case下的释放下Native Resource的释放导致的代码的复杂性.
后续就是测试这个solution的稳定性可靠性还有Resource方面的增加.如果没啥问题的话对代码的简洁可维护性是个很好的消息.
> 我来回应
热门话题 · · · · · · ( 去话题广场 )
- 三十多以后我的人生才刚刚开始1.0万+篇内容 · 84.8万次浏览
- 生活中的童话时刻59篇内容 · 1.4万次浏览
- 哪些事物曾让你感到“人类很渺小”?41篇内容 · 1.8万次浏览
- 暂停打工后,治好了我的精神内耗!183篇内容 · 15.1万次浏览
- 想做的事,别等“以后”1.0万+篇内容 · 1608.4万次浏览
- 命运的齿轮真的会悄悄转动71篇内容 · 12.8万次浏览
- 让人生变开阔的方法1.0万+篇内容 · 1171.3万次浏览
- 重新养一遍自己,可真好啊4507篇内容 · 807.4万次浏览