繁体   English   中英

Windows Phone 8.1中的媒体管道是否已损坏?

[英]Is media pipeline broken in Windows Phone 8.1?

由于存在大量内存管理问题,Windows Phone 8.1中的媒体管道似乎已被破坏。

当您创建使用IMediaSource在Windows Phone Runtime 8.1中传输音频的后台音频应用程序时,应用程序的组件最终会在某些情况下抛出OutOfMemoryException甚至StackOverflowException。 查看内存转储时,里面有很多未收集的垃圾。

讨论已经在MSDN论坛上开始,并得出了这个结论。 我已经创建了一个WPDev UserVoice建议 ,以便Windows Phone团队可以注意到这一点,但我仍然希望我(以及来自MSDN论坛的其他人)谁错了并且有解决方案。

我还有一个小的CodePlex项目也受此影响,实际上有关于这个确切问题的问题报告

我希望在社区的帮助下,这个问题可以解决或直接传递给Microsoft开发团队进行调查和消除。 谢谢!

更新1:

StackOverflowException一种解决方法 ,但它对OutOfMemoryException没有帮助。

好的,所以似乎问题实际上是在.NET中字节数组的生命周期。

为了解决内存问题,请使用Windows运行时的Windows.Storage.Streams.IBuffer 不要以任何形式创建许多新的.NET字节数组,既不是简单的new byte[] ,也不是使用System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBuffer类,因为它是IBuffer接口的托管实现。

这些字节数组一旦被分配,由于被OverlappedData结构固定并且溢出后台音频任务的内存阈值而长寿。 IBuffer真正的 Windows运行时版本,如Windows.Storage.Streams.Buffer类)包含一旦IBuffer的引用计数达到0(零)就被释放的本机数组,它们不依赖于GC。

我发现的是这个问题不仅仅是背景音频特有的。 实际上,我已经看到很多关于类似问题的其他问题。 解决方案是尽可能使用Windows运行时后端 ,因为它是非托管的,并且只要它们没有引用就释放资源。

感谢@Soonts指出我正确的方向!

他们对MSS管理内存的方式存在内存问题,但他们在更新过程中默默地修复了它: WP7背景音频 - 内存泄漏与否?

我不确定,但我认为问题是你的代码。 你不应该调用var buffer = new byte[4096]; 每次请求样品。 这样做可能适用于PC,但对于嵌入式平台,我认为强调内存管理器并不是一个好主意。

在我的MediaStreamSource实现中,我使用在构造MSS时分配的单个循环缓冲区,并且在回放期间无限次地重用缓冲区的各部分。 在我的GetSampleAsync中,我构造了一个我的Stream实现类的实例,它不拥有任何内存,而是只保存对该循环缓冲区的一部分的引用。 这样,在回放期间仅分配/解除分配几个小对象,因此音频流数据不加载存储器管理器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM