当前位置: 首页 > 知识库问答 >
问题:

使用GLSurfaceview进行媒体编解码和渲染,优化OnDrawFrame

韦安顺
2023-03-14

我正在使用媒体编解码器编码帧来自相机和渲染它使用gl表面视图。

public void onDrawFrame(GL10 unused)
{
        float[] mtx = new float[16];
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);
        surface.updateTexImage();
        surface.getTransformMatrix(mtx); 

        mDirectVideo.draw(surface);
        saveRenderState();

        delegate.mInputSurface.makeCurrent();
        mDirectVideo.draw(surface);
        delegate.swapBuffers();
        restoreRenderState();

这里我们做了两次Draw(surface),这两次将呈现到surface。这会造成系统开销。有没有什么地方我可以只做一次?两次使用着色器是昂贵的操作,有没有办法我们可以共享表面之间的渲染和编码器?

共有1个答案

云和惬
2023-03-14

如果您的draw()函数很贵--您在绘制视频帧的同时还要绘制一个复杂的场景--您可以使用FBO绘制一个纹理,然后只需将该纹理绘制两次。如果您的draw()主要只是视频纹理的缺陷,那么您就无法使其更快。

底线是呈现到两个不同的表面,而目前(Android4.4)无法将相同的缓冲区发送给两个不同的用户。最新设备上的硬件应该不会有问题跟上。

(渲染屏幕和编码视频多少有点限制,除非您正在录制屏幕,因此希望显示大小和视频大小完全相同。通常方便的做法是将屏幕显示放入UI中,而编码视频则与摄像头中的内容相匹配。)

顺便说一句,注意这个问题。

更新:Grafika现在包含了一个使用两种方法绘制+记录的示例(绘制两次,绘制到FBO和blit)。请参阅RecordFboActivity.

 类似资料:
  • 我正在尝试将过滤器(如Instagram的过滤器)应用于现有视频。 我使用GLSURFACHEVIEW显示视频帧,并希望通过对传入帧应用特定过滤器,使用onDrawFrame()渲染每个帧。 但是在onDrawFrame()中,如何获取传入帧? 谢谢

  • 我用C SDL2 GLEW Opengl 4.1编程一个小的体素游戏,有点像Minecraft。 我正在尽可能优化体素渲染。 我把世界滑成一块块,而这块块又滑成一块块。 每个块包含16x16x16个块。 现在,如果编辑块(删除/放置块),我将重建完整块和相邻块,并将其与vao和vbo一起上载到图形卡。 现在,为了最小化顶点数据,我必须从cpu传输到gpu,我使用几何体着色器。 首先,这是个好主意吗

  • 在我的第一个opengl“体素”项目中,我使用几何着色器从gl_points创建立方体,它工作得很好,但我相信它可以做得更好。在alpha颜色中,我传递关于应该渲染哪些面的信息(跳过与其他立方体相邻的面),然后使用“引用”立方体定义创建可见面的顶点。每个点乘以3个矩阵。直觉告诉我,也许整张脸可以乘以它们,而不是每一点,但是我的数学技能很差,所以请建议。 ------- 更新的代码:------

  • 问题内容: 我知道如何在AngularJS中创建 视图 条件,该条件将根据条件显示或隐藏dom元素: 但是如何创建确定是否渲染div 的 渲染 条件? 问题答案: 针对angularjs 1.1.5及更高版本用户的更新(在1.0.7中不受支持): 相关提交:https : //github.com/angular/angular.js/commit/2f96fbd17577685bc013a4f7

  • 优化提升渲染性能,不仅能让页面更快的展现、可交互,同时能提升用户操作滚动的流畅度,对提升用户体验至关重要。 避免不必要的更新对比 Rax 同 React 一样,render 时会有 vdom 对比,如果对比发现 DOM 没有变化时,不会去真正更新页面。而本身 vdom 对比也是不小的消耗,你应该避免这种不必要的更新对比,使用 shouldComponentUpdate 方法明确标识你的组件什么时候

  • 我正在尝试显示从一个android设备到另一个android设备的实时预览。这是我所做的, 发送器 ;:1.摄像机帧(YUV)->2.MediaCodec(编码h264字节[])->3.MediaMuxer->4.MP4