来自 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 的缓冲区。您可以使用的最接近的方法是拥有一个基于Allocation
的Allocation
,它是使用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 分配副本的主要内容,如果未能解决你的问题,请参考以下文章
是否可以将 Process stdout InputStream 读入 NIO ByteBuffer?