之前看到国外的博客说glTexSubImage2D性能比glTexImage2D略高些,于是在视频叠加水印功能中进行尝试。然而,三星S7 Edge(Android 7.0)中两次调用glTexSubImage2D依次提交视频、水印图像,却只有水印图像被最终显示到屏幕上,让人感到意外。代码如下所示。
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _pic_texture_Id);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoWidth, videoHeight, GL_RGBA, GL_UNSIGNED_BYTE,
videoFrameData);
glUniform1i(_sTextureSlot, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _water_texture_Id);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, watermarkWidth, watermarkHeight, GL_RGBA, GL_UNSIGNED_BYTE,
watermarkData);
glUniform1i(_waterextureSlot, 1);
将第一个glTexSubImage2D改成glTexImage2D调用,则无此问题。不过,更让人意外的是,改变水印和视频的上传顺序,glTexSubImage2D也能正常工作。代码如下所示。
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _water_texture_Id);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, watermarkWidth, watermarkHeight, GL_RGBA, GL_UNSIGNED_BYTE,
watermarkData);
glUniform1i(_waterextureSlot, 1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _pic_texture_Id);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, videoWidth, videoHeight, GL_RGBA, GL_UNSIGNED_BYTE,
videoFrameData);
glUniform1i(_sTextureSlot, 0);
真是见鬼了。
实测发现,对于450帧480x480的视频及200x110的水印,总耗时大体如下所示:
函数 | 耗时(ms) |
---|---|
glTexSubImage2D |
374.954 |
glTexImage2D |
845.703 |