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 实现。弄错了吗?的主要内容,如果未能解决你的问题,请参考以下文章

ByteBuffer 介绍及 C++ 实现

ByteBuffer 介绍及 C++ 实现

ByteBuffer说明

ByteBuffer 可以实现 DataOutput/DataInput 吗?

Java:从 ByteBuffer 扩展

Java:转换 ByteBuffer 多维数组