# android_native_renderer **Repository Path**: vonchenchen/android_native_renderer ## Basic Information - **Project Name**: android_native_renderer - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-31 - **Last Updated**: 2021-06-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1.测试方法 1)点击"RENDERER DEMO" 2) 依次点击 "创建RENDERER"(用于创建renderer) "TRIGGER"(定时读出yuv并回调给renderer) 3) 点击 "BTN_BACKTEST" 开始触发不停前后台切换 这样会创建4个renderer 不停绘制,同时切前后台 切到一定次数egl创建context会报错 目前在切后台同时 adb shell dumpsys meminfo |grep GL 后 EGL mtrack 会不断增加 可以点击"LOOPTEST"测试 相当于调用"创建RENDERER" "TRIGGER" "删除RENDERER",这个操作目前看资源消耗正常,可以跑较长时间 2.程序简单说明 native_renderer_jni.cc 主要是与java的接口,传入一个SurfaceView后保存为一个JavaGlobalRef,存入FrameRender 同时在底层创建一个Java层的SurfaceEventWrapper, 设置给传入的SurfaceView, 用于监听推前后台事件 这些事件也通过jni给到FrameRender FrameRenderer.cc 用于控制渲染流程,其中 持有EglImpl用于管理当前绘制的窗口 持有GLI420Renderer用于调用OpenGL操作 持有ThreadPipe用于OpenGL线程 程序主调:包括开启、绘制、停止 FrameRenderer::StartRender() 开启,开启用于OpenGL线程的线程队列ThreadPipe FrameRenderer::StopRender() 停止,清除Egl环境,OpenGL相关,join等待线程结束 FrameRenderer::DrawFrame() 绘制,传入图片数据,通知ThreadPipe调用OpenGL绘制传入的数据 控件事件: SurfaceEventWrapper会将控件的事件通过jni调到FrameRender surfaceCreate -java->c-> FrameRenderer::CreatWindow() 拿出缓存的SurfaceView 检验Surface合法性 合法则创建native的surface 上一步合法 ThreadPipe(同步操作)线程中初始化EGL环境 初始化OpenGL program surfaceChange -java->c-> FrameRenderer::ResizeWindow() 重置画布大小 surfaceDestroy -java->c-> FrameRenderer::DestoryWindow() ThreadPipe(同步操作)线程中清理OpenGL相关 清理Egl相关 3.其他注意事项 1)根据之前经验,OpenGL绘制操作必须与Surface的surfaceDestory互斥,否则部分型号手机在一些情况下会报bufferqueue相关错误, 为了解决这个问题,目前surfaceCreate, surfaceDestroy中线程操作使用阻塞操作,必须等线程执行完这些操作后才允许surfaceCreate和surfaceDestroy返回