【发布时间】:2019-05-27 19:07:39
【问题描述】:
我有一个 android 应用程序,它使用 GlSurfaceView 在片段内渲染 3D 全屏场景。我在分析器中注意到,GlSurfaceView 实际上正在运行 两次(在两个线程中),占用资源并降低 FPS。我已经通过将相同的 OpenGL 场景(使用相同的 Renderer 实现)渲染到动态壁纸并对其进行分析来确认该问题,它只运行一次。
我在这里做错了吗?
代码如下:
MySurfaceView
class MySurfaceView(ctx: Context): GLSurfaceView(ctx)
{
init
{
setEGLContextClientVersion(3)
preserveEGLContextOnPause = true
setRenderer( /* instantiating the renderer class */ )
}
}
OpenGLFragment
class OpenGLFragment: Fragment()
{
private lateinit var glView: GLSurfaceView
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View?
{
this.glView = MySurfaceView(this.activity)
return this.glView
}
}
MainActivity
class MainActivity : FragmentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val fm = supportFragmentManager
for (i in 0 until fm.getBackStackEntryCount()) {
fm.popBackStack()
}
supportFragmentManager.beginTransaction().add(R.id.main_container, OpenGLFragment())
.addToBackStack(null).commit()
}
}
【问题讨论】:
-
你确定这行:MySurfaceView(this.activity)。 ,也许是新的 MySurfaceView(this.activity) 。
-
@nikola lukic 这是 kotlin,它没有
new。除了重复片段问题之外,代码还在工作。 -
你的布局中有什么?一个可能的原因是,如果您的布局文件已经包含
OpenGLFragment,然后您在onCreate()中添加了第二个 -
是不是因为你将
Fragment添加到了后台(可能是原因)?只需尝试将Fragment替换为FragmentManager。 -
@JeelVankhede 这到底是怎么工作的?目前,每次我切换到另一个应用程序并返回此应用程序时,它都会重新启动。很好,但是我可以让片段以某种方式在后面运行吗?
标签: android android-layout android-fragments kotlin opengl-es