31

我需要能够在屏幕上旋转视频,所以我创建了一个自定义 TextureView,它在 MediaPlayer 上提供了一个便利层,类似于 VideoView 的当前实现方式。这篇 Android 博客文章对 TextureView 进行了以下说明:

因为 SurfaceView 的内容不在应用程序的窗口中,所以不能有效地转换(移动、缩放、旋转)。这使得在 ListView 或 ScrollView 中使用 SurfaceView 变得困难。SurfaceView 也无法与 UI 工具包的某些功能正确交互,例如褪色边缘或 View.setAlpha()。

为了解决这些问题,Android 4.0 引入了一个名为 TextureView 的新小部件,它依赖于硬件加速的 2D 渲染管道和 SurfaceTexture。TextureView 提供与 SurfaceView 相同的功能,但与 SurfaceView 不同的是,它的行为类似于常规视图。例如,您可以使用 TextureView 来显示 OpenGL 场景或视频流。TextureView 本身可以动画、滚动等。

但是,看起来 TextureView 正在努力播放视频。我正在测试它的目标设备有一个 1.2Ghz Rockchip RK3066 双核 CPU、一个四核 Mali-400 GPU (ARM) 和 1GB RAM。在此设备上使用 VideoViews 的相同代码执行良好,但 TextureViews 在播放时“断断续续”或根本不显示(左上角带有白色方块的黑框),具体取决于特定设备。TextureViews 在使用 Intel 提供的 x86“设备”的模拟器上运行良好。

这是预期的性能,还是我应该在其他地方寻找问题?谢谢

4

2 回答 2

27

是的,它是预期的TextureView。TextureView 导致视频通过普通视图合成进行渲染,这与直接在 GPU 中合成的 SurfaceView 不同(解码管道直接渲染到您放置 的屏幕区域SurfaceView)。虽然TextureView渲染是硬件加速的,但它仍然需要通过更多步骤来获得额外的灵活性,并且肯定会影响性能。此外,在 UI 线程上运行的任何代码都可能会影响TextureView不同的SurfaceView.

附加信息:

于 2013-04-26T00:35:05.487 回答
2

你可以看看这篇文章

SurfaceView 和 TextureView 扮演着相似的角色,但实现方式却大不相同。要决定哪个是最好的,需要了解权衡。因为 TextureView 是 View 层次结构的适当公民,所以它的行为与任何其他 View 一样,并且可以重叠或被其他元素重叠。您可以通过简单的 API 调用执行任意转换并将内容作为位图检索。

对 TextureView 的主要打击是合成步骤的性能。使用 SurfaceView,内容被写入 SurfaceFlinger 合成的单独层,理想情况下带有覆盖。对于 TextureView,View 的合成总是由 GLES 执行,并且对其内容的更新可能会导致其他 View 元素也重新绘制(例如,如果它们位于 TextureView 的顶部)。View 渲染完成后,应用程序 UI 层必须通过 SurfaceFlinger 与其他层合成,因此您实际上将每个可见像素合成了两次。对于全屏视频播放器或任何其他实际上只是叠加在视频之上的 UI 元素的应用程序,SurfaceView 提供了更好的性能

于 2017-05-30T14:06:33.853 回答