来自 NIO Direct ByteBuffer 的 Android RenderScript 分配副本

Posted

技术标签:

【中文标题】来自 NIO Direct ByteBuffer 的 Android RenderScript 分配副本【英文标题】:Android RenderScript Allocation copy from NIO Direct ByteBuffer 【发布时间】:2014-12-16 06:55:40 【问题描述】:

android 平台 (API-19) 上,我想将直接字节缓冲区复制到渲染脚本分配中。是否可以改进以下代码,例如使用 NDK?

final ByteBuffer buffer = ...src;

final byte[] bytes;
if (buffer.hasArray()) 
    bytes = buffer.array();
 else 
    bytes = new byte[buffer.capacity()];
    buffer.get(bytes);
    buffer.rewind();

allocation.copyFromUnchecked(bytes);

【问题讨论】:

【参考方案1】:

很遗憾,没有。 API 不是在您可以为Allocation 提供后备数据存储的地方构建的,或者甚至检索Allocation 创建的基于 NIO 的缓冲区。您可以使用的最接近的方法是拥有一个基于AllocationAllocation,它是使用USAGE_SHARED 创建的,因此它可以作为差异而不是完整副本同步。

【讨论】:

感谢您的回答。 使用JNI怎么样? API-19 的 Android NDK 提供了渲染脚本的头文件 (android-ndk-r9d/platforms/android-19/arch-arm/usr/include/rs)【参考方案2】:

您似乎可以执行以下操作:

    准备固定大小的 nio ByteBuffer 在 NDK 中填充缓冲区(memcpy 可以非常快) 使用 yourAllocation.copyFromUnchecked(nioBuffer.array()) 方法

希望对你有帮助

【讨论】:

实际上,在 Android 上,ByteBuffer.get(byte[]) 尽可能实现为快速的memcpy

以上是关于来自 NIO Direct ByteBuffer 的 Android RenderScript 分配副本的主要内容,如果未能解决你的问题,请参考以下文章

47 VM.maxDirectMemory() 来自于哪里

47 VM.maxDirectMemory() 来自于哪里

是否可以将 Process stdout InputStream 读入 NIO ByteBuffer?

mina的iobuffer使用

io.netty.ByteBuf writeBytes(java.nio.ByteBuffer src) API说明

DisableExplicitGC和Direct ByteBuffer