我正在开发一个简单的Renderscript应用程序,它可以进行基本的图像处理。它在我的Nexus 5上运行正常,但在我的Shield平板电脑上没有。我有一个与SurfaceView相同大小的分配(RGB8888),用法是Allocation.USAGE_SCRIPT。我有另一个完全相同规格的分配,除了用法是Allocation.USAGE_SCRIPT | Allocation.USAGE_IO_OUTPUT。我的Renderscript已被削减到最低限度(因为显而易见的原因删除了包名称):
#pragma version(1)
#pragma rs java_package_name()
#pragma rs_fp_relaxed
#include "rs_allocation.rsh"
#include "rs_core.rsh"
void root(const uchar4 *inVal, uchar4 *outVal){
outVal -> rgba = inVal -> rgba;
}
如您所见,它只是将数据从一个分配复制到另一个。然后我在输出Allocation上调用iosend(),它绑定到Surface。这会在我的Nexus 5上显示图像,但会导致屏幕损坏(Image)。腐败的本质使我相信,不知何故,我进入记忆中我不应该进入。
真正令人不安的是将输入Allocation复制到Bitmap,将Bitmap复制到输出Allocation,然后在输出Allocation上调用iosend()在两个平台上工作得很好,但完全破坏了任何RS速度优势我登上Tegra K1的GPU。