2013-11-26 68 views
4

我對RenderScript完全陌生。我試圖在http://www.youtube.com/watch?v=5jz0kSuR2j4工作中得到Romain Guy顯示的一個簡單示例。RenderScript代碼不能在沒有rsDebug的情況下工作

首先,這是代碼。

MainActivity.java

package com.example.rsgray; 

    import android.app.Activity; 
    import android.graphics.Bitmap; 
    import android.graphics.BitmapFactory; 
    import android.os.Bundle; 
    import android.renderscript.Allocation; 
    import android.renderscript.RenderScript; 
    import android.view.Window; 
    import android.view.WindowManager; 
    import android.widget.ImageView; 
    import android.widget.ImageView.ScaleType; 

    public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    ImageView iv = new ImageView(this); 
    iv.setScaleType(ScaleType.CENTER_CROP); 
    setContentView(iv); 

    drawGrayScale(iv, R.drawable.tulips); 
} 

private void drawGrayScale(ImageView iv, int image) { 
    Bitmap in = BitmapFactory.decodeResource(getResources(), image); 
    Bitmap out = Bitmap.createBitmap(in.getWidth(), in.getHeight(), in.getConfig()); 

    RenderScript rs = RenderScript.create(MainActivity.this); 
    Allocation inAlloc = Allocation.createFromBitmap(rs, in); 
    Allocation outAlloc = Allocation.createTyped(rs, inAlloc.getType()); 

    ScriptC_gray script = new ScriptC_gray(rs, getResources(), R.raw.gray); 
    script.set_in(inAlloc); 
    script.set_out(outAlloc); 
    script.set_script(script); 

    script.invoke_filter(); 

    outAlloc.copyTo(out); 
    iv.setImageBitmap(out); 
} 

}

gray.rs

#pragma version(1) 
    #pragma rs java_package_name(com.example.rsgray) 
    #pragma rs_fp_relaxed 

    rs_allocation in; 
    rs_allocation out; 
    rs_script script; 

    const static float3 gray = { 0.3f, 0.6f, 0.1f }; 

    void root(const uchar4* v_in, uchar4* v_out, const void* usrData, uint32_t x, uint32_t y) { 
     rsDebug("gray.rs", rsUptimeMillis()); 
     float4 inPixel = rsUnpackColor8888(*v_in); 
     float3 result = dot(inPixel.rgb, gray); 
     *v_out = rsPackColorTo8888(result); 
    } 


    void filter() { 
     rsForEach(script, in, out); 
    } 

,最後的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.rsgray" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="16" 
    android:targetSdkVersion="16" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.rsgray.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

</manifest> 

RES /抽拉-nodpi包含鬱金香。 JPG。你不會在Romain Guy的代碼中找到我在gray.rs中添加的rsDebug()語句。

無論如何,代碼編譯,有或沒有rsDebug()。但是,當我嘗試在設備上運行應用程序時,問題就開始了。

我試圖在運行Android 4.4的Nexus 4上運行該應用程序。使用所示的代碼,它工作正常,我得到一個灰度圖像。但是,如果我註釋掉rsDebug()行,該應用程序不起作用。我只是得到一個黑屏。

這裏是logcat輸出。

  1. 隨着rsDebug():

    11-26 16:22:41.563: D/dalvikvm(21523): GC_FOR_ALLOC freed 69K, 2% free 9046K/9148K, paused 16ms, total 16ms 
    11-26 16:22:41.573: I/dalvikvm-heap(21523): Grow heap (frag case) to 11.862MB for 3145744-byte allocation 
    11-26 16:22:41.603: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 12118K/12224K, paused 30ms, total 30ms 
    11-26 16:22:41.683: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 12117K/12224K, paused 11ms, total 11ms 
    11-26 16:22:41.693: I/dalvikvm-heap(21523): Grow heap (frag case) to 14.862MB for 3145744-byte allocation 
    11-26 16:22:41.703: D/dalvikvm(21523): GC_FOR_ALLOC freed 0K, 1% free 15189K/15300K, paused 14ms, total 14ms 
    11-26 16:22:41.753: V/RenderScript(21523): 0x74ed5020 Launching thread(s), CPUs 4 
    11-26 16:22:41.753: W/Adreno-RS(21523): <rsdVendorAllocationDestroyQCOM:194>: rsdVendorAllocationDestroy: No context! 
    11-26 16:22:41.753: E/RenderScript(21523): Successfully loaded runtime: libRSDriver_adreno.so 
    11-26 16:22:41.783: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 15201K/15300K, paused 11ms, total 11ms 
    11-26 16:22:41.803: D/dalvikvm(21523): GC_FOR_ALLOC freed <1K, 1% free 15202K/15300K, paused 11ms, total 12ms 
    11-26 16:22:41.813: W/Adreno-RS(21523): <rsdCompileBitcode:289>: Header check (bitcode_SHA1) failed for /data/data/com.example.rsgray/cache/com.android.renderscript.cache/gray-adreno.meta 
    11-26 16:22:41.813: W/Adreno-RS(21523): <rsdDumpCompileLog:499>: Build log for gray: RS code uses long(i64) data type 
    11-26 16:22:41.813: W/Adreno-RS(21523): RS bitcode does not contain an invokable compute root 
    11-26 16:22:41.813: W/Adreno-RS(21523): <rsdVendorScriptInitQCOM:610>: ERROR: __BuildProgram returned -11 
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906 0x114d6ba 
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906 0x114d6ba 
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906 0x114d6ba 
    11-26 16:22:41.813: D/RenderScript(21523): long gray.rs 18142906 0x114d6ba 
    . 
    . a million more such lines 
    . 
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771 0x114e1eb 
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771 0x114e1eb 
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771 0x114e1eb 
    11-26 16:22:44.686: D/RenderScript(21523): long gray.rs 18145771 0x114e1eb 
    11-26 16:22:44.717: I/Adreno-EGL(21523): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM build: (CL3776187) 
    11-26 16:22:44.717: I/Adreno-EGL(21523): OpenGL ES Shader Compiler Version: 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Build Date: 10/15/13 Tue 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Local Branch: 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Remote Branch: partner/upstream 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Local Patches: 
    11-26 16:22:44.717: I/Adreno-EGL(21523): Reconstruct Branch: 
    11-26 16:22:44.747: D/OpenGLRenderer(21523): Enabling debug mode 0 
    
  2. 沒有rsDebug():

    11-26 16:23:41.327: D/dalvikvm(21902): GC_FOR_ALLOC freed 56K, 1% free 9046K/9136K, paused 18ms, total 18ms 
    11-26 16:23:41.337: I/dalvikvm-heap(21902): Grow heap (frag case) to 11.862MB for 3145744-byte allocation 
    11-26 16:23:41.367: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 12118K/12212K, paused 27ms, total 27ms 
    11-26 16:23:41.427: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 12117K/12212K, paused 11ms, total 11ms 
    11-26 16:23:41.437: I/dalvikvm-heap(21902): Grow heap (frag case) to 14.862MB for 3145744-byte allocation 
    11-26 16:23:41.447: D/dalvikvm(21902): GC_FOR_ALLOC freed 0K, 1% free 15189K/15288K, paused 12ms, total 12ms 
    11-26 16:23:41.477: V/RenderScript(21902): 0x74ed4f18 Launching thread(s), CPUs 4 
    11-26 16:23:41.477: W/Adreno-RS(21902): <rsdVendorAllocationDestroyQCOM:194>: rsdVendorAllocationDestroy: No context! 
    11-26 16:23:41.477: E/RenderScript(21902): Successfully loaded runtime: libRSDriver_adreno.so 
    11-26 16:23:41.507: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 15201K/15288K, paused 12ms, total 13ms 
    11-26 16:23:41.527: D/dalvikvm(21902): GC_FOR_ALLOC freed <1K, 1% free 15202K/15288K, paused 12ms, total 12ms 
    11-26 16:23:41.537: D/bcc(21902): Cache /data/data/com.example.rsgray/cache/com.android.renderscript.cache/gray.o.info is dirty due to the source it dependends on has been changed: 
    11-26 16:23:43.419: I/Adreno-EGL(21902): <qeglDrvAPI_eglInitialize:320>: EGL 1.4 QUALCOMM build: (CL3776187) 
    11-26 16:23:43.419: I/Adreno-EGL(21902): OpenGL ES Shader Compiler Version: 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Build Date: 10/15/13 Tue 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Local Branch: 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Remote Branch: partner/upstream 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Local Patches: 
    11-26 16:23:43.419: I/Adreno-EGL(21902): Reconstruct Branch: 
    11-26 16:23:43.449: D/OpenGLRenderer(21902): Enabling debug mode 0 
    

我無法理解調試語句是如何影響的方式,其中,應用運行。任何幫助,爲什麼我面臨這個問題將不勝感激。

所以這是我的問題的第一部分。

第二部分:當我嘗試在運行Android 4.1.2的Galaxy Note 10.1 N8013上運行完全相同的代碼並且在運行Android 4.1.2的APQ8064的另一塊硬件上運行時,該應用程序無法運行。

這裏的logcat的輸出與我的硬件:

01-02 00:00:51.043: E/Trace(1684): error opening trace file: No such file or directory (2) 
    01-02 00:00:51.043: D/ActivityThread(1684): setTargetHeapUtilization:0.25 
    01-02 00:00:51.043: D/ActivityThread(1684): setTargetHeapIdealFree:8388608 
    01-02 00:00:51.053: D/ActivityThread(1684): setTargetHeapConcurrentStart:2097152 
    01-02 00:00:51.183: V/RenderScript(1684): rsContextCreate dev=0x7276fdd0 
    01-02 00:00:51.183: V/RenderScript(1684): 0x616350e0 Launching thread(s), CPUs 4 
    01-02 00:00:51.203: V/ScriptC(1684): Create script for resource = gray 
    01-02 00:00:51.203: E/bcc(1684): CPU is krait2 
    01-02 00:00:51.274: W/bcc(1684): Unable to open /data/data/com.example.rsgray/cache/com.android.renderscript.cache/gray.o in read mode. (reason: No such file or directory) 
    01-02 00:00:51.404: A/libc(1684): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 1701 (.example.rsgray) 

最後,這裏是一個與三星平板的logcat的輸出:

01-02 10:34:47.470: D/dalvikvm(19022): GC_FOR_ALLOC freed 48K, 11% free 7046K/7875K, paused 13ms, total 13ms 
    01-02 10:34:47.475: I/dalvikvm-heap(19022): Grow heap (frag case) to 10.495MB for 3145744-byte allocation 
    01-02 10:34:47.495: D/dalvikvm(19022): GC_CONCURRENT freed <1K, 9% free 10117K/11015K, paused 11ms+1ms, total 18ms 
    01-02 10:34:47.585: D/dalvikvm(19022): GC_FOR_ALLOC freed <1K, 9% free 10117K/11015K, paused 10ms, total 10ms 
    01-02 10:34:47.590: I/dalvikvm-heap(19022): Grow heap (frag case) to 13.494MB for 3145744-byte allocation 
    01-02 10:34:47.610: D/dalvikvm(19022): GC_CONCURRENT freed <1K, 7% free 13189K/14151K, paused 11ms+3ms, total 23ms 
    01-02 10:34:47.610: D/dalvikvm(19022): WAIT_FOR_CONCURRENT_GC blocked 12ms 
    01-02 10:34:47.610: V/RenderScript(19022): rsContextCreate dev=0x40e3b288 
    01-02 10:34:47.615: V/RenderScript(19022): 0x411e3008 Launching thread(s), CPUs 3 
    01-02 10:34:47.625: V/ScriptC(19022): Create script for resource = gray 
    01-02 10:34:47.625: I/bcc(19022): LIBBCC build time: 2013/01/09 23:19:52 
    01-02 10:34:47.625: I/bcc(19022): LIBBCC build revision: Unknown (not git) 
    01-02 10:34:47.645: D/StopWatch(19022): StopWatch calcFileSHA1 time (us): 17719 
    01-02 10:34:47.650: D/StopWatch(19022): StopWatch calcFileSHA1 time (us): 3031 
    01-02 10:34:47.650: W/bcc(19022): Unable to open file in read mode. (reason: No such file or directory) 
    01-02 10:34:47.750: A/libc(19022): Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 19053 (.example.rsgray) 

這就是它。如果任何人有任何想法如何解釋這一點,請讓我知道。

謝謝!

+0

你可以嘗試沒有rsDebug,但與強制CPU的setprop? 「adb shell setprop debug.rs.default-CPU-driver 1」 –

+0

感謝您的回覆Jason。這使得我的Nexus 4上的應用程序工作。沒有運氣在其他設備上。 但是,我的答案有問題。我開始使用RenderScript的主要原因是希望能夠在GPU上完成一些計算。我知道無法強制RenderScript在GPU上運行。但是不會強制我的應用程序只能在CPU上運行? – Akshay

+0

這不是一個答案,我只是想縮小發生了什麼。這看起來像一個bug,但我無法從這裏的位複製它。如果您可以在https://code.google.com/p/android/issues/list上提交apk錯誤,我會進一步瞭解它。 –

回答

0

我剛剛遇到同樣的問題。當rsDebug處於同一個函數的某個位置時,它似乎被修復了。這對我來說是固定的:

if(x > 0) { 
    if(x < 0) { 
     rsDebug("Workaround for renderscript bug", 0.0f); 
    } 

    /* Code */ 
} 

使用這個,rsDebug從來沒有實際調用,所以它不會輸出任何東西。

注意這不起作用:

if(0) { 
    rsDebug("Workaround for renderscript bug", 0.0f); 
} 

這可能是最優化的。

相關問題