ByteBuffer 的 Xamarin 实现。弄错了吗?
Posted
技术标签:
【中文标题】ByteBuffer 的 Xamarin 实现。弄错了吗?【英文标题】:Xamarin implementation of ByteBuffer.Get wrong? 【发布时间】:2015-05-15 20:42:26 【问题描述】:这是一个示例函数,它填充一个小的 ByteBuffer,然后将其读入一个大字节数组:
// Allocate the two buffers once for all.
const int byteBufferSize = 20;
var byteBuffer = ByteBuffer.Allocate(byteBufferSize);
/* var byteBufferArray = new byte[byteBufferSize];
var byteBuffer = ByteBuffer.Wrap(byteBufferArray);*/
var bytes = new byte[1024 * 1024];
var bytesPos = 0;
for (;;)
// Put byteBuffer in "write" mode.
byteBuffer.Clear();
// Write a few bytes in byteBuffer.
for (var i = 0; i < byteBufferSize; ++i)
byteBuffer.Put(0);
// Put byteBuffer in "read" mode.
byteBuffer.Flip();
// Read the written bytes from byteBuffer.
// DEEP BELOW, THIS CALL UNEXPECTEDLY CAUSES A NASTY ALLOCATION OF ABOUT bytes.length BYTES!
byteBuffer.Get(bytes, bytesPos, byteBufferSize);
bytesPos += byteBufferSize;
Thread.Sleep(1000);
当我在运行 android 5.0 的 Nexus 5 上运行此代码时,它似乎没问题。但是当我在运行 Android 4.3 的三星 Galaxy S3 上运行它时,每次调用 ByteBuffer.Get 时,似乎都会在 ByteBuffer.Get 内的某个地方分配一个大小为 bytes.length(此处为 1 Mo)的缓冲区,不久之后日志看起来像:
05-15 09:50:28.519: D/dalvikvm(23104): GC_FOR_ALLOC freed 1024K, 48% free 10250K/19624K, paused 49ms, total 49ms
05-15 09:50:29.580: D/dalvikvm(23104): GC_FOR_ALLOC freed 1024K, 48% free 10250K/19624K, paused 48ms, total 48ms
05-15 09:50:30.622: D/dalvikvm(23104): GC_FOR_ALLOC freed 1024K, 48% free 10250K/19624K, paused 39ms, total 39ms
05-15 09:50:31.673: D/dalvikvm(23104): GC_FOR_ALLOC freed 1024K, 48% free 10250K/19624K, paused 45ms, total 45ms
05-15 09:50:32.724: D/dalvikvm(23104): GC_FOR_ALLOC freed 1024K, 48% free 10250K/19624K, paused 42ms, total 42ms
...
是我对 ByteBuffer 对象执行的操作,还是 Xamarin 中的 ByteBuffer.Get 有问题?请注意,我确实在原生 Android Java 应用程序中测试了相同的代码,代码按预期运行,即没有 ByteBuffer.Get 触发的疯狂分配。
【问题讨论】:
【参考方案1】:如果有人在研究此问题时首先看到此页面,我现在已提交增强请求,讨论此问题的根本原因以及一些可能的解决方法:
https://bugzilla.xamarin.com/show_bug.cgi?id=31260
【讨论】:
以上是关于ByteBuffer 的 Xamarin 实现。弄错了吗?的主要内容,如果未能解决你的问题,请参考以下文章