Open jay2002 opened 7 years ago
你好,我也是网上各种没找到Renderscript有用的资料,后来也放弃了它。。你可以把你的问题发给我,我尽力帮忙。
2016-12-09 14:29 GMT+08:00 jay2002 notifications@github.com:
I have read your questions in stack overflow, but I still confuse about the mechanism in renderscript... Can I have a discussion with you?
PS: 我猜你是PKU CS的?真心求探讨。。。网上各种解答我已经找了一遍,根本没找到靠谱的
— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub https://github.com/PKUEcho/AndroidOS/issues/1, or mute the thread https://github.com/notifications/unsubscribe-auth/AGpItve3dU4oo8TP_ypkoQ4Ju7Hb6CrQks5rGPVVgaJpZM4LIn55 .
好的,谢谢! 我测了3款手机,Samsung s4、oppo r7、oppo r9,均是Android5.0+或5.1+的,按stackoverflow上rs开发者的说法,gpu应该是rs已经适配了(除非驱动没更新……)。 现在的情况是这样,我for循环只运行RenderScript的部分,这三台机器中有两台cpu占用率特别高(高达70%),我怀疑在我测试的机型上RenderScript部分的代码根本没运行到gpu上。而另外一台cpu占用率不高的呢,速度又不快,感觉就像cpu单核运行(我尼玛。。。)。 我也怀疑过自己写的代码比较坑,然后我就试了官方提供的RS Blur API,代码如下:
public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) {
//Create renderscript
RenderScript rs = RenderScript.create(context);
//Create allocation from Bitmap
Allocation allocation = Allocation.createFromBitmap(rs, bitmap);
Type t = allocation.getType();
//Create allocation with the same type
Allocation blurredAllocation = Allocation.createTyped(rs, t);
//Create script
ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
//Set blur radius (maximum 25.0)
blurScript.setRadius(radius);
//Set input for script
blurScript.setInput(allocation);
//Call script for output allocation
//for(int i = 0; i < 10; i++)
blurScript.forEach(blurredAllocation);
//Copy script result into bitmap
blurredAllocation.copyTo(bitmap);
//Destroy everything to free memory
allocation.destroy();
blurredAllocation.destroy();
blurScript.destroy();
t.destroy();
return bitmap;
}
然后发现结果也是类似的。所以我的猜测是,RS只在Nexus那几款手机上实现了GPU并行,其他不支持的手机都是CPU并行。但是好像网上的说法又不是这样。。。
我在StackOverflow上发现你提了类似的问题,后来你说你确认在GPU Workloads看到了运行在GPU的痕迹,我想知道你是怎么确认的?
我的QQ是 18147①45,如果你不介意,我们可以加QQ探讨一下
据我所知,userspace层的GPU驱动,包括OpenGL ES和RenderScript是各个厂商自己写的,因此确实可能只在Nexus上会schedule到GPU上。 我当时是试了AOSP自带的代码: https://android.googlesource.com/platform/frameworks/rs/+/master/java/tests/ImageProcessing。发现其中有部分图片处理的RS程序是跑在GPU上的(记得有个叫level vec3 relexed是在GPU上的)。 至于如何检测,我记得我当时是把上面这个代码改了一下,可以放在后台多线程密集运行,然后看看是不是会卡到前台的应用。 以上大概就是我做过的东西了,我只是想制造一些GPU的workloads,所以并没有怎么研究RS这个东西,感觉都没人用。
在 2016年12月10日 下午1:39,jay2002 notifications@github.com写道:
好的,谢谢! 我测了3款手机,Samsung s4、oppo r7、oppo r9,均是Android5.0+或5.1+的, 按stackoverflow上rs开发者的说法,gpu应该是rs已经适配了(除非驱动没更新……)。 现在的情况是这样,我for循环只运行RenderScript的部分,这三台机器中有两台cpu占用率特别高(高达70%), 我怀疑在我测试的机型上RenderScript部分的代码根本没运行到gpu上。而另外一台cpu占用率不高的呢, 速度又不快,感觉就像cpu单核运行(我尼玛。。。)。 我也怀疑过自己写的代码比较坑,然后我就试了官方提供的RS Blur API,代码如下:
public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) { //Create renderscript RenderScript rs = RenderScript.create(context);
//Create allocation from Bitmap Allocation allocation = Allocation.createFromBitmap(rs, bitmap); Type t = allocation.getType(); //Create allocation with the same type Allocation blurredAllocation = Allocation.createTyped(rs, t); //Create script ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); //Set blur radius (maximum 25.0) blurScript.setRadius(radius); //Set input for script blurScript.setInput(allocation); //Call script for output allocation //for(int i = 0; i < 10; i++) blurScript.forEach(blurredAllocation); //Copy script result into bitmap blurredAllocation.copyTo(bitmap); //Destroy everything to free memory allocation.destroy(); blurredAllocation.destroy(); blurScript.destroy(); t.destroy(); return bitmap;
}
然后发现结果也是类似的。所以我的猜测是,RS只在Nexus那几款手机上实现了GPU并行,其他不支持的手机都是CPU并行。 但是好像网上的说法又不是这样。。。
我在StackOverflow上发现你提了类似的问题,后来你说你确认在GPU Workloads看到了运行在GPU的痕迹,我想知道你是怎么确认的?
我的QQ是 18147①45,如果你不介意,我们可以加QQ探讨一下
— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/PKUEcho/AndroidOS/issues/1#issuecomment-266181154, or mute the thread https://github.com/notifications/unsubscribe-auth/AGpItgb0FyjFry2G27wEg32B06TcLB1Aks5rGjsigaJpZM4LIn55 .
好的,谢谢~ 我在android studio下开了gpu monitor,但是感觉这个只监控了绘制相关的opengl操作。。。 我现在也没辙了,找机会拿台nexus机器测试,得到结论就算结了吧。。。 感觉RS真的能普遍地放到手机GPU上算的话,还是比较前景的,这个需求感觉挺大。不过感觉目前g做的还是不够完善,而且接口开放的不够完整。估计6或7以后会慢慢变好吧
I have read your questions in stack overflow, but I still confuse about the mechanism in renderscript... Can I have a discussion with you?
PS: 我猜你是PKU CS的?真心求探讨。。。网上各种解答我已经找了一遍,各种答复理解不能。我目前的情况是一调用RenderScript,cpu占用率就特别高,感觉根本没用到GPU