⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 glsurfaceview.java

📁 android 例子中的确良ApiDemos。很有代表意义
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            /*             * Always check for EGL_CONTEXT_LOST, which means the context             * and all associated data were lost (For instance because             * the device went to sleep). We need to sleep until we             * get a new surface.             */            return mEgl.eglGetError() != EGL11.EGL_CONTEXT_LOST;        }        public void finish() {            if (mEglSurface != null) {                mEgl.eglMakeCurrent(mEglDisplay, EGL10.EGL_NO_SURFACE,                        EGL10.EGL_NO_SURFACE,                        EGL10.EGL_NO_CONTEXT);                mEgl.eglDestroySurface(mEglDisplay, mEglSurface);                mEglSurface = null;            }            if (mEglContext != null) {                mEgl.eglDestroyContext(mEglDisplay, mEglContext);                mEglContext = null;            }            if (mEglDisplay != null) {                mEgl.eglTerminate(mEglDisplay);                mEglDisplay = null;            }        }        EGL10 mEgl;        EGLDisplay mEglDisplay;        EGLSurface mEglSurface;        EGLConfig mEglConfig;        EGLContext mEglContext;    }    /**     * A generic GL Thread. Takes care of initializing EGL and GL. Delegates     * to a Renderer instance to do the actual drawing.     *     */    class GLThread extends Thread {        GLThread(Renderer renderer) {            super();            mDone = false;            mWidth = 0;            mHeight = 0;            mRenderer = renderer;            setName("GLThread");        }        @Override        public void run() {            /*             * When the android framework launches a second instance of             * an activity, the new instance's onCreate() method may be             * called before the first instance returns from onDestroy().             *             * This semaphore ensures that only one instance at a time             * accesses EGL.             */            try {                try {                sEglSemaphore.acquire();                } catch (InterruptedException e) {                    return;                }                guardedRun();            } catch (InterruptedException e) {                // fall thru and exit normally            } finally {                sEglSemaphore.release();            }        }        private void guardedRun() throws InterruptedException {            mEglHelper = new EglHelper();            /*             * Specify a configuration for our opengl session             * and grab the first configuration that matches is             */            int[] configSpec = mRenderer.getConfigSpec();            mEglHelper.start(configSpec);            GL10 gl = null;            boolean tellRendererSurfaceCreated = true;            boolean tellRendererSurfaceChanged = true;            /*             * This is our main activity thread's loop, we go until             * asked to quit.             */            while (!mDone) {                /*                 *  Update the asynchronous state (window size)                 */                int w, h;                boolean changed;                boolean needStart = false;                synchronized (this) {                    Runnable r;                    while ((r = getEvent()) != null) {                        r.run();                    }                    if (mPaused) {                        mEglHelper.finish();                        needStart = true;                    }                    if(needToWait()) {                        while (needToWait()) {                            wait();                        }                    }                    if (mDone) {                        break;                    }                    changed = mSizeChanged;                    w = mWidth;                    h = mHeight;                    mSizeChanged = false;                }                if (needStart) {                    mEglHelper.start(configSpec);                    tellRendererSurfaceCreated = true;                    changed = true;                }                if (changed) {                    gl = (GL10) mEglHelper.createSurface(mHolder);                    tellRendererSurfaceChanged = true;                }                if (tellRendererSurfaceCreated) {                    mRenderer.surfaceCreated(gl);                    tellRendererSurfaceCreated = false;                }                if (tellRendererSurfaceChanged) {                    mRenderer.sizeChanged(gl, w, h);                    tellRendererSurfaceChanged = false;                }                if ((w > 0) && (h > 0)) {                    /* draw a frame here */                    mRenderer.drawFrame(gl);                    /*                     * Once we're done with GL, we need to call swapBuffers()                     * to instruct the system to display the rendered frame                     */                    mEglHelper.swap();                }             }            /*             * clean-up everything...             */            mEglHelper.finish();        }        private boolean needToWait() {            return (mPaused || (! mHasFocus) || (! mHasSurface) || mContextLost)                && (! mDone);        }        public void surfaceCreated() {            synchronized(this) {                mHasSurface = true;                mContextLost = false;                notify();            }        }        public void surfaceDestroyed() {            synchronized(this) {                mHasSurface = false;                notify();            }        }        public void onPause() {            synchronized (this) {                mPaused = true;            }        }        public void onResume() {            synchronized (this) {                mPaused = false;                notify();            }        }        public void onWindowFocusChanged(boolean hasFocus) {            synchronized (this) {                mHasFocus = hasFocus;                if (mHasFocus == true) {                    notify();                }            }        }        public void onWindowResize(int w, int h) {            synchronized (this) {                mWidth = w;                mHeight = h;                mSizeChanged = true;            }        }        public void requestExitAndWait() {            // don't call this from GLThread thread or it is a guaranteed            // deadlock!            synchronized(this) {                mDone = true;                notify();            }            try {                join();            } catch (InterruptedException ex) {                Thread.currentThread().interrupt();            }        }        /**         * Queue an "event" to be run on the GL rendering thread.         * @param r the runnable to be run on the GL rendering thread.         */        public void queueEvent(Runnable r) {            synchronized(this) {                mEventQueue.add(r);            }        }        private Runnable getEvent() {            synchronized(this) {                if (mEventQueue.size() > 0) {                    return mEventQueue.remove(0);                }            }            return null;        }        private boolean mDone;        private boolean mPaused;        private boolean mHasFocus;        private boolean mHasSurface;        private boolean mContextLost;        private int mWidth;        private int mHeight;        private Renderer mRenderer;        private ArrayList<Runnable> mEventQueue = new ArrayList<Runnable>();        private EglHelper mEglHelper;    }    private static final Semaphore sEglSemaphore = new Semaphore(1);    private boolean mSizeChanged = true;    private SurfaceHolder mHolder;    private GLThread mGLThread;    private GLWrapper mGLWrapper;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -