Android - Fragment 中的 GlSurfaceView 同时运行两次

标签 android android-layout android-fragments kotlin opengl-es

我有一个 android 应用程序,它使用 GlSurfaceView 在 fragment 内渲染 3D 全屏场景。我在探查器中注意到,GlSurfaceView 实际上正在运行两次(在两个线程中),占用资源并降低 FPS。我已经通过将相同的 OpenGL 场景(使用相同的 Renderer 实现)渲染到动态壁纸并对其进行分析来确认这个问题,它只运行一次。

我是不是做错了什么?


代码如下:

MySurfaceView

class MySurfaceView(ctx: Context): GLSurfaceView(ctx)
{
    init
    {
        setEGLContextClientVersion(3)
        preserveEGLContextOnPause = true
        setRenderer( /* instantiating the renderer class */ )
    }
}

OpenGL fragment

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
    }
}

主 Activity

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()
    }

}

最佳答案

看来您正在尝试添加 fragment 而不是替换容器。

这是我的代码:

supportFragmentManager.beginTransaction()
            .replace(R.id.main_container, GLFragment())
            .addToBackStack(null)
            .commit()

fragment (使用你的代码不编译this.activity)

class GLFragment : Fragment() {

    private lateinit var glView: GLSurfaceView

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        this.glView = MySurfaceView(requireActivity())
        return this.glView
    }
}

GL View :

class MySurfaceView constructor(context: Context) : GLSurfaceView(context) {
    init {
        setEGLContextClientVersion(2) // I have used 2 because running on emulator
        preserveEGLContextOnPause = true
        setRenderer(ClearRenderer())
    }
}

internal class ClearRenderer : GLSurfaceView.Renderer {
    override fun onSurfaceCreated(gl: GL10?, config: EGLConfig?) {
    }

    override fun onSurfaceChanged(gl: GL10, w: Int, h: Int) {
        gl.glViewport(0, 0, w, h)
    }

    override fun onDrawFrame(gl: GL10) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)
    }
}

这是探查器屏幕截图:

enter image description here

所以概括地说,将 add 替换为 replace,将 this.activity 替换为 requireActivity() requireActivity() 也不会返回 null,这是有保证的。

希望对您有所帮助!!!

关于Android - Fragment 中的 GlSurfaceView 同时运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56331310/

相关文章:

Android 中的 Java 7/8?

android - 如何实现100毫秒休眠的重试机制

android - Android 中 TabHost 中每个 fragment 的自定义返回堆栈

java - 无法解析每个 Activity 的符号 'R'

android - 使用 fragment Activity 创建的 ADT 空白 Activity

android图像旋转,导入错误

android - Android同步失败-找不到com.google.android.gms:play-services-auth:15.1.0

android - 在 Android 运行时隐藏线性布局

android - float 操作按钮下的 Admob

android - 手机大小的应用程序的所有 fragment ?