2012-09-04 44 views
0

我是新手到renderScript並試圖處理圖像大小爲1920x1280px,這似乎是每一次在logcat的處理1920×1280與Android圖像 - 的renderScript

09-04 19:26:04.670: D/dalvikvm(30308): GC_FOR_ALLOC freed 73K, 3% free 6615K/6787K, paused 26ms 
09-04 19:26:04.680: I/dalvikvm-heap(30308): Grow heap (frag case) to 14.404MB for 8294416-byte allocation 
09-04 19:26:04.690: D/dalvikvm(30308): GC_CONCURRENT freed 2K, 2% free 14713K/14919K, paused 1ms+1ms 
09-04 19:26:04.820: D/dalvikvm(30308): GC_FOR_ALLOC freed 0K, 2% free 14713K/14919K, paused 12ms 
09-04 19:26:04.820: I/dalvikvm-heap(30308): Grow heap (frag case) to 17.917MB for 3686416-byte allocation 
09-04 19:26:04.840: D/dalvikvm(30308): GC_FOR_ALLOC freed 0K, 2% free 18313K/18567K, paused 13ms 
09-04 19:26:04.860: D/dalvikvm(30308): GC_CONCURRENT freed 0K, 2% free 18313K/18567K, paused 1ms+2ms 
09-04 19:26:05.010: A/libc(30308): Fatal signal 11 (SIGSEGV) at 0x5c41f809 (code=1) 
09-04 19:26:05.010: A/libc(30308): Fatal signal 11 (SIGSEGV) at 0x5c41e001 (code=1) 

,其中爲相同的代碼工作,如果崩潰與以下錯誤我調整圖像100x56px :-(。

請仔細閱讀下面的代碼,並建議我需要做任何更改,代碼是基於例如我在別處找到在互聯網上,並從樣品。

注意:下面的代碼是不重複的盟友的生產質量。 RenderScript101RS.java的VDRender.rs的RenderScript101.rs

#pragma version(1) 
#pragma rs java_package_name(com.iangclifton.tutorials.renderscript); 

#include "rs_graphics.rsh" 

const static float3 gMonoMult = {0.299f, 0.587f, 0.114f}; 

void root(const uchar4 *v_in, uchar4 *v_out) { 

    //rsDebug("Called ROOT - ONE", rsUptimeMillis()); 

    float4 f4 = rsUnpackColor8888(*v_in); 

    float3 mono = dot(f4.rgb, gMonoMult); 
    *v_out = rsPackColorTo8888(mono); 
} 

內容的

內容

#pragma version(1) #pragma rs java_package_name(com.iangclifton.tutorials.renderscript); #include "rs_graphics.rsh" float4 gBgColor; // Background color as xyzw 4-part float rs_allocation gBgImage; // Background image rs_allocation gVDBgImage; // Background image rs_sampler gLinearClamp; // Sampler used by the program fragment rs_program_fragment gSingleTextureFragmentProgram; // fragment shader rs_program_store gProgramStoreBlendNone; // blend none, depth none program store rs_program_vertex gProgramVertex; // Default vertex shader rs_script gVDScript; static const float3 gBgVertices[4] = { { -1.0, -1.0, -1.0 }, { 1.0, -1.0, -1.0 }, { 1.0, 1.0, -1.0 }, {-1.0, 1.0, -1.0 } }; void drawInteger(int value, int x, int y) { char text[50] = "0"; int index = 0; if(value != 0) { index = 49; text[index] = 0; while(value > 0) { index--; int digitValue = value % 10; text[index] = '0' + digitValue; value /= 10; } if(value < 0) { text[index--] = '-'; } } rsgDrawText(&text[index], x, y); } int64_t gTimeMS = 0; int64_t updateFPS = 0; int gFPS = 0; static void drawBackground() { if (gBgImage.p != 0) { //rsgClearColor(gBgColor.x, gBgColor.y, gBgColor.z, gBgColor.w); rs_matrix4x4 projection, model; rsMatrixLoadOrtho(&projection, -1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f); rsgProgramVertexLoadProjectionMatrix(&projection); rsMatrixLoadIdentity(&model); rsgProgramVertexLoadModelMatrix(&model); // ---- if(1) { rsForEach(gVDScript, gBgImage, gBgImage, NULL); rsgBindTexture(gSingleTextureFragmentProgram, 0, gBgImage); } else { rsgBindTexture(gSingleTextureFragmentProgram, 0, gBgImage); } //---- rsgDrawQuad( gBgVertices[0].x, gBgVertices[0].y, gBgVertices[0].z, gBgVertices[1].x, gBgVertices[1].y, gBgVertices[0].z, gBgVertices[2].x, gBgVertices[2].y, gBgVertices[0].z, gBgVertices[3].x, gBgVertices[3].y, gBgVertices[0].z ); int x = 250; int y = 150; int fps = 0; int64_t t = rsUptimeMillis(); int diff = t - gTimeMS; fps = 1000/diff; gTimeMS = t; if((t - updateFPS) > 500) { gFPS = fps; updateFPS = t; } rsgDrawText("FPS:", x, y); drawInteger(gFPS, 250+40, 150); } } void init() { gBgColor = (float4) { 0.0f, 1.0f, 0.0f, 1.0f }; rsDebug("Called init", rsUptimeMillis()); } int root() { rsgBindProgramVertex(gProgramVertex); rsgBindProgramFragment(gSingleTextureFragmentProgram); rsgBindProgramStore(gProgramStoreBlendNone); drawBackground(); return 1; } 

內容

package com.iangclifton.tutorials.renderscript; 

import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.renderscript.Allocation; 
import android.renderscript.Float4; 
import android.renderscript.Matrix4f; 
import android.renderscript.ProgramFragment; 
import android.renderscript.ProgramFragmentFixedFunction; 
import android.renderscript.ProgramStore; 
import android.renderscript.ProgramVertex; 
import android.renderscript.ProgramVertexFixedFunction; 
import android.renderscript.RenderScriptGL; 
import android.renderscript.Sampler; 

/** 
* Custom RenderScript helper that simplifies interaction with the RenderScript. 
* 
* @author Ian G. Clifton 
*/ 
public class RenderScript101RS { 

    private Sampler mLinearClamp; 
    private ProgramStore mProgramStoreBlendNone; 
    private ProgramVertex mProgramVertex; 
    private RenderScriptGL mRS; 
    private ScriptC_RenderScript101 mScript; 
    private ScriptC_VDRender mVDScript; 
    private ProgramFragment mSingleTextureFragmentProgram; 

    /** 
    * Constructs a new helper with RenderScriptGL and Resources references. 
    * 
    * @param rs RenderScriptGL reference 
    * @param res Resources reference 
    * @param resId int ID of the RenderScript (e.g., R.raw.xyz) 
    */ 
    public RenderScript101RS(RenderScriptGL rs, Resources res, int resId, int resId2) { 
     mRS = rs; 

     mScript = new ScriptC_RenderScript101(rs, res, resId); 
     mVDScript = new ScriptC_VDRender(rs, res, resId2); 

     mScript.set_gVDScript(mVDScript); 

     initProgramStore(); 
     initSampler(); 
     initProgramFragment(); 
     initProgramVertex(); 
     mRS.bindRootScript(mScript); 

    } 

    /** 
    * Sets a custom background Bitmap on the RenderScript view 
    * 
    * @param bitmap Bitmap to use as the background 
    */ 
    public void setBackgroundBitmap(Bitmap bitmap) { 
     if (bitmap == null) { 
      return; 
     } 
     final Allocation bitmapAllocation = Allocation.createFromBitmap(mRS, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE); 
     mScript.set_gBgImage(bitmapAllocation); 

     //final Allocation bitmapVDAllocation = Allocation.createFromBitmap(mRS, bitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_GRAPHICS_TEXTURE); 
     //mScript.set_gVDBgImage(bitmapVDAllocation); 
    } 

    /** 
    * Sets a custom background color on the RenderScript view 
    * 
    * @param color Float4 color 
    */ 
    public void setBackgroundColor(Float4 color) { 
     mScript.set_gBgColor(color); 
    } 

    /** 
    * Prepares the ProgramFragment (fragment shader) 
    */ 
    private void initProgramFragment() { 
     final ProgramFragmentFixedFunction.Builder pfBuilder = new ProgramFragmentFixedFunction.Builder(mRS); 
     pfBuilder.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE, ProgramFragmentFixedFunction.Builder.Format.RGBA, 0); 
     mSingleTextureFragmentProgram = pfBuilder.create(); 
     mScript.set_gSingleTextureFragmentProgram(mSingleTextureFragmentProgram); 
    } 

    /** 
    * Prepares the ProgramStore (controls use of framebuffer such as blending) 
    */ 
    private void initProgramStore() { 
     mProgramStoreBlendNone = ProgramStore.BLEND_NONE_DEPTH_NONE(mRS); 
     mScript.set_gProgramStoreBlendNone(mProgramStoreBlendNone); 
    } 

    /** 
    * Prepares the ProgramVertex (vertex shader) 
    */ 
    private void initProgramVertex() { 
     ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS); 
     mProgramVertex = pvb.create(); 
     ProgramVertexFixedFunction.Constants pva = new ProgramVertexFixedFunction.Constants(mRS); 
     ((ProgramVertexFixedFunction) mProgramVertex).bindConstants(pva); 
     Matrix4f proj = new Matrix4f(); 
     proj.loadProjectionNormalized(1, 1); 
     pva.setProjection(proj); 
     mScript.set_gProgramVertex(mProgramVertex); 
    } 

    /** 
    * Prepares the Sampler (controls how pixels are pulled from a texture) 
    */ 
    private void initSampler() { 
     mLinearClamp = Sampler.CLAMP_LINEAR(mRS); 
     mScript.set_gLinearClamp(mLinearClamp); 
    } 
} 

內容的RenderScript101View

package com.iangclifton.tutorials.renderscript; 

import android.content.Context; 
import android.graphics.BitmapFactory; 
import android.renderscript.RSSurfaceView; 
import android.renderscript.RenderScriptGL; 
import android.view.MotionEvent; 

/** 
* Custom RSSurfaceView that sets up the RenderScript and captures touch events. 
* 
* @author Ian G. Clifton 
*/ 
public class RenderScript101View extends RSSurfaceView { 
    private Context mContext; 
    private RenderScript101RS mRenderScript; 
    private RenderScriptGL mRS; 

    /** 
    * {@inheritDoc}} 
    */ 
    public RenderScript101View(Context context) { 
     super(context); 
     mContext = context; 
     ensureRenderScript(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 

     if (mRenderScript == null) { 
      return true; 
     } 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      mRenderScript.setBackgroundBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.icon00072half)); 
     } 

     return true; 
    } 

    /** 
    * Ensures the RenderScriptGL reference has been established and our custom 
    * RS helper has been created. 
    */ 
    private void ensureRenderScript() { 
     if (mRS == null) { 
      final RenderScriptGL.SurfaceConfig sc = new RenderScriptGL.SurfaceConfig(); 
      mRS = createRenderScriptGL(sc); 
     } 
     if (mRenderScript == null) { 
      mRenderScript = new RenderScript101RS(mRS, mContext.getResources(), R.raw.renderscript101, R.raw.vdrender); 
     } 
    } 
} 

回答

3

。在你的logcat的例外或警告,但我知道這個問題。

首先,我甚至沒有看你的RenderScript,因爲你說它適用於小位圖。

在android中,每個虛擬機或進程都有自己的內存部分,而這對於位圖1920x1080來說是不夠的。所以,你應該logcat中提示有這樣的事情,你可能忽略:

bitmap size exceeds VM budget 

我不知道你的實現細節(得到位圖形式的服務器,本地文件等)。所以我會引導你到Android Bitmap Training

總體思路是根據需要加載儘可能小的圖像。通過這樣的:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 
BitmapFactory.decodeResource(getResources(), R.id.myimage, options); 
int imageHeight = options.outHeight; 
int imageWidth = options.outWidth; 
String imageType = options.outMimeType; 

的關鍵部分:

options.inJustDecodeBounds = true; 

說嘿!不要解碼並加載位圖。我會爲我的位圖做一些設置。

+0

我grep的logcat日誌,並找不到有關內存不足或'位圖大小超過':-( –

+0

奇怪我沒有真正進入RenderScript,但你的問題是肯定大Bitmaps。總是確保他們至少在4MB左右 - 甚至4MB很大,但它幾乎可以在所有Android手機上運行,​​你可以計算大小爲(寬*高)* 4字節。 – mehmetminanc