这是一个关于RenderScript如何使用 Struct 的文章,是学习RenderScript 一个必须要掌握的基础知识点。

大纲

  1. 如何定义Struct
  2. 如何得到指针长度并循环为指针赋值
  3. 整体DEMO代码

 如何定义Struct

 RenderScript 里面定义结构有两种定义方法,参考如下:

1.

typedef struct tempArray
 {
    float2 position ;
    float size ;
} Array_T ;

Array_T *myArray; 复制代码

2.

 //定义一个struct

typedef struct __attribute__((packed, aligned(4))) tempArray {
     int temp ;
} Array_T ;
Array_T *myArray ; 复制代码

 

 RenderScript 定义Struct 成功后,会自动生成一个java文件,如上面的tempArray名称的结构,会生产这个文件:ScriptField_tempArray,代码如下:

/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      
http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 
*/

/*
 * This file is auto-generated. DO NOT MODIFY!
 * The source Renderscript file: /home/terry/workspace/RenderScriptsArray/src/com/xuzhi/renderScriptArray/array.rs
 
*/
package com.xuzhi.renderScriptArray;

import android.renderscript.*;
import android.content.res.Resources;

/**
 * @hide
 
*/
public  class ScriptField_tempArray  extends android.renderscript.Script.FieldBase {
     static  public  class Item {
         public  static  final  int sizeof = 4;

         int temp;

        Item() {
        }

    }

     private Item mItemArray[];
     private FieldPacker mIOBuffer;
     public  static Element createElement(RenderScript rs) {
        Element.Builder eb =  new Element.Builder(rs);
        eb.add(Element.I32(rs), "temp");
         return eb.create();
    }

     public  ScriptField_tempArray(RenderScript rs,  int count) {
        mItemArray =  null;
        mIOBuffer =  null;
        mElement = createElement(rs);
        init(rs, count);
    }

     public  ScriptField_tempArray(RenderScript rs,  int count,  int usages) {
        mItemArray =  null;
        mIOBuffer =  null;
        mElement = createElement(rs);
        init(rs, count, usages);
    }

     private  void copyToArrayLocal(Item i, FieldPacker fp) {
        fp.addI32(i.temp);
    }

     private  void copyToArray(Item i,  int index) {
         if (mIOBuffer ==  null) mIOBuffer =  new FieldPacker(Item.sizeof * getType().getX() /*  count  */);
        mIOBuffer.reset(index * Item.sizeof);
        copyToArrayLocal(i, mIOBuffer);
    }

     public  synchronized  void set(Item i,  int index,  boolean copyNow) {
         if (mItemArray ==  null) mItemArray =  new Item[getType().getX()  /*  count  */];
        mItemArray[index] = i;
         if (copyNow)  {
            copyToArray(i, index);
            FieldPacker fp =  new FieldPacker(Item.sizeof);
            copyToArrayLocal(i, fp);
            mAllocation.setFromFieldPacker(index, fp);
        }

    }

     public  synchronized Item get( int index) {
         if (mItemArray ==  nullreturn  null;
         return mItemArray[index];
    }

     public  synchronized  void set_temp( int index,  int v,  boolean copyNow) {
         if (mIOBuffer ==  null) mIOBuffer =  new FieldPacker(Item.sizeof * getType().getX() /*  count  */);
         if (mItemArray ==  null) mItemArray =  new Item[getType().getX()  /*  count  */];
         if (mItemArray[index] ==  null) mItemArray[index] =  new Item();
        mItemArray[index].temp = v;
         if (copyNow)  {
            mIOBuffer.reset(index * Item.sizeof);
            mIOBuffer.addI32(v);
            FieldPacker fp =  new FieldPacker(4);
            fp.addI32(v);
            mAllocation.setFromFieldPacker(index, 0, fp);
        }

    }

     public  synchronized  int get_temp( int index) {
         if (mItemArray ==  nullreturn 0;
         return mItemArray[index].temp;
    }

     public  synchronized  void copyAll() {
         for ( int ct = 0; ct < mItemArray.length; ct++) copyToArray(mItemArray[ct], ct);
        mAllocation.setFromFieldPacker(0, mIOBuffer);
    }

     public  synchronized  void resize( int newSize) {
         if (mItemArray !=  null)  {
             int oldSize = mItemArray.length;
             int copySize = Math.min(oldSize, newSize);
             if (newSize == oldSize)  return;
            Item ni[] =  new Item[newSize];
            System.arraycopy(mItemArray, 0, ni, 0, copySize);
            mItemArray = ni;
        }

        mAllocation.resize(newSize);
         if (mIOBuffer !=  null) mIOBuffer =  new FieldPacker(Item.sizeof * getType().getX() /*  count  */);
    }
复制代码

 

生成的代码是提供给你做内存分配和操作类似数组的功能。 

 

如何得到指针长度并循环为指针赋值

 RenderScript 有两个函数是专门用来获取指针长度的:

rsGetAllocation: 返回一个己经分配过地址的指针

rsAllocationGetDimX :获取返回指针的长度

 通过将这两个函数做组合使用可以返回指针长度,代码如下:

 

const int size = rsAllocationGetDimX(rsGetAllocation(myArray)) ;  

 

 取得了长度即可以为指针内部变量赋值,代码如下:

for(int i=0 ; i
        array->temp=i ;     //循环赋值
        
    rsDebug("current value is ====>", array->temp) ;     //打印当前值
    //指向下个指针
        array++ ;

    }  复制代码

 

整体DEMO代码

 本DEMO没有任何界面 ,只是演示如何使用struct并打印出指针下标原素的值,如此简单, 涉及的rs文件代码如下:

#pragma version(1)
#pragma rs java_package_name(com.xuzhi.renderScriptArray)

#include "rs_graphics.rsh"

static int initialized = 0 ;

//定义一个struct
typedef struct __attribute__((packed, aligned(4))) tempArray {
     int temp ;
} Array_T ;
Array_T *myArray ;



static void  initArray(){
    Array_T *array=myArray ;
    //得到struct长度
    //1.返回一个己经分配过地址的指针
    //2.获取返回指针的长度
     const int size = rsAllocationGetDimX(rsGetAllocation(myArray)) ;
    for(int i=0 ; i
        array->temp=i ;     //循环赋值
        
    rsDebug("current value is ====>", array->temp) ;     //打印当前值
    //指向下个指针
        array++ ;
    }
}


int root(){
 rsgClearColor(0.0f, 1.0f, 0.0f, 1.0f) ;  
 if(initialized==0){
    initArray() ;  
    initialized=1 ;
    }
    
    return 16 ;

复制代码

 

java 代码如下:

package com.xuzhi.renderScriptArray;

import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.renderscript.Allocation;
import android.renderscript.RSSurfaceView;
import android.renderscript.RenderScriptGL;

public  class RenderScriptsArrayActivity  extends Activity {

    

     /**  Called when the activity is first created.  */
    @Override
     public  void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
        setContentView( new renderScriptView( this)); 
    }
    
    
     public  class renderScriptRS { 

         private ScriptC_array mScript;

         private ScriptField_tempArray array;
        
        RenderScriptGL mRS;
        
         public renderScriptRS(RenderScriptGL rs,Resources resource) {
             //  TODO Auto-generated constructor stub
            mRS=rs;
             // 初始化struct 并为其指定有多少个下标
             array= new  ScriptField_tempArray(mRS, 10,Allocation.USAGE_SCRIPT|Allocation.USAGE_GRAPHICS_VERTEX);
            
             // 实始化CcriptC
             mScript= new  ScriptC_array(mRS, resource, R.raw.array);
             // 绑定struct
             mScript.bind_myArray(array);
             // 绑定脚本
             mRS.bindRootScript(mScript);
        
        }
    }
    
    
    
     public  class renderScriptView  extends RSSurfaceView {
         private RenderScriptGL mRS;
         private renderScriptRS mRender;

         public renderScriptView(Context context) {
             super(context);
             //  TODO Auto-generated constructor stub
        }
        

        @Override
         protected  void onAttachedToWindow() {
             super.onAttachedToWindow();
            android.util.Log.e("rs", "onAttachedToWindow");
             if (mRS ==  null) {
                RenderScriptGL.SurfaceConfig sc =  new RenderScriptGL.SurfaceConfig();
                mRS = createRenderScriptGL(sc);
                mRender =  new renderScriptRS(mRS, getResources()); 
            }
        }
        
        @Override
         protected  void onDetachedFromWindow() {
             super.onDetachedFromWindow(); 
             if (mRS !=  null) {
                mRS =  null;
                destroyRenderScriptGL();
            }
        }
        
    }
复制代码

 

 都加了注释了,最主要的四段代码标注了红色,要注意。

 运行结果:

03-09 15:47:50.492: D/RenderScript(2298): current value is ====> 0  0x0
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 1  0x1
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 2  0x2
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 3  0x3
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 4  0x4
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 5  0x5
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 6  0x6
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 7  0x7
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 8  0x8
03-09 15:47:50.507: D/RenderScript(2298): current value is ====> 9  0x9 

 

   

更多相关文章

  1. Android 中颜色对应的代码集合
  2. 《Android 编程权威指南》(Android Programming The Big Nerd Ran
  3. 美团,大众点评,悬浮窗功能代码
  4. Android 第一行代码
  5. android 100行代码实现 仿苹果滑动选择器WheelView
  6. Android之图文混排 (二)源代码
  7. 一段Android实现应用下载并自动安装apk包的代码

随机推荐

  1. Android屏幕横竖屏切换和生命周期管理的
  2. findlibrary returned null产生的联想,And
  3. [置顶] Android(安卓)自定义View实现竖直
  4. Android项目开发,不能不了解的第三方库!(齐
  5. android实现观察者模式的几种方法
  6. Android的内存机制和常见泄漏情形
  7. Android(安卓)APN的设置问题--进一步讨论
  8. android工程下运行main方法的配置方法
  9. 史上最全的Android开发学习教程集锦【初
  10. Android工程 引用另外一个Android工程