Paug renderscript-mars-2013

1 002 vues

Publié le

0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
1 002
Sur SlideShare
0
Issues des intégrations
0
Intégrations
171
Actions
Partages
0
Téléchargements
4
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Paug renderscript-mars-2013

  1. 1. RenderscriptGDG Paris Android User GroupMars 2013 - par Sylvain Galand
  2. 2. Renderscript
  3. 3. Objectif : Embellir Android !
  4. 4. Outil pour supporter la diversité● "Write once, run anywhere"● Quelque soit le GPU (extensions OpenGL)● Introduction en interne en 2.x
  5. 5. Evolution : Calcul● Execution optimale partout● Important pour le calcul● Publique depuis 3.x
  6. 6. Et Maintenant ? CALCUL SEULEMENT !
  7. 7. Dépréciation "Render" (Android 4.1)Deprecation Notice:Earlier versions of Renderscript included anexperimental graphics engine component.This component is now deprecated as ofAndroid 4.1 [...] If you have apps that rendergraphics with Renderscript, we highlyrecommend you convert your code toanother Android graphics rendering option.
  8. 8. Pourquoi ?● Les développeurs préfèrent OpenGL● OpenGL plus utilisé en interne aussi
  9. 9. Renderscript, cest ...● Un outil pour les calculs● Ne remplace ni SDK, ni NDK.● Problématiques spécifiques ○ calculs ○ performances
  10. 10. Les 3 piliers de Renderscript● Portabilité ○ Android 3.0+ ○ ≈45%● Performances ○ CPU (architectures, coeurs, instructions) ○ GPU● Simplicité dutilisation ○ Génération de "glue code"
  11. 11. MAIS QUEST CE QUE CEST ?● C99 : le langage● API de calcul● Outils SDK pour la génération de code
  12. 12. Au coeur de RS APK Appareil bytecode binaire code.rs RS Renderscript GPU CPU CPU #1 #2
  13. 13. Code généré ScriptC_script.java script.rs /res/raw/script.bctypedef struct Struct ScriptField_Struct.javaStruct_t* my_struct; .bind_my_struct(...); .set_entier(int i); int entier; .get_entier(); void fonction(); .invoke_fonction();
  14. 14. Utilisation de Renderscript
  15. 15. Par exemple, un exemple :● Application dun filtre sur un Bitmap● Calcul matriciel● 1 milliard de $● Améliorons les temps de calcul
  16. 16. filter.rs - Pragmas - 1/4#pragma version(1)#pragma rs java_package_name(com.genymobile.owf)rs_matrix3x3 filter;
  17. 17. filter.rs - init() - 2/4void init() { rsMatrixLoadIdentity(&filter);}
  18. 18. filter.rs - root() - 3/4void root(const uchar4 *in, uchar4 *out){ float3 pixel =convert_float4(in[0]).rgb; pixel = rsMatrixMultiply(&filter,pixel); pixel = clamp(pixel, 0.f, 255.f); out->a = in->a; out->rgb = convert_uchar3(pixel);}
  19. 19. filter.rs - Complet - 4/4#pragma version(1)#pragma rs java_package_name(com.genymobile.owf)rs_matrix3x3 filter;void init() { rsMatrixLoadIdentity(&filter);}void root(const uchar4 *in, uchar4 *out) { float3 pixel = convert_float4(in[0]).rgb; pixel = rsMatrixMultiply(&filter, pixel); pixel = clamp(pixel, 0.f, 255.f); out->a = in->a; out->rgb = convert_uchar3(pixel);}
  20. 20. Filter.java - Création - 1/7// Création du scriptmRS = RenderScript.create(mContext);mScript = new ScriptC_filter(mRS, mContext.getResources(), R.raw.filter);
  21. 21. Filter.java - Allocations - 2/7// Allocation de la mémoire// contenant le bitmapmInAllocation = Allocation.createFromBitmap( mRS, inputBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);
  22. 22. Filter.java - Allocations - 3/7// Allocation de la mémoire pour// récupérer limage généréemOutAllocation = Allocation.createTyped( mRS, mInAllocation.getType());
  23. 23. Filter.java - Paramètre - 4/7// Mise en place des paramètresMatrix3f sepiaMatrix = new Matrix3f(mMatrix);mScript.set_filter(sepiaMatrix);
  24. 24. Filter.java - Appel - 5/7// Appel du script (rsForEach)mScript.forEach_root( mInAllocation, mOutAllocation);
  25. 25. Filter.java - Résultat - 6/7// Copie du résultat dans// le bitmap de sortiemOutAllocation.copyTo(outputBitmap);
  26. 26. Filter.java - Complet - 7/7// Création du scriptmRS = RenderScript.create(mContext);mScript = new ScriptC_filter(mRS, mContext.getResources(), R.raw.filter);// Allocation de la mémoire contenant le bitmapmInAllocation = Allocation.createFromBitmap(mRS, inputBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT);// Allocation de la mémoire pour récupérer limage généréemOutAllocation = Allocation.createTyped(mRS, mInAllocation.getType());// Mise en place des paramètresMatrix3f sepiaMatrix = new Matrix3f(mMatrix);mScript.set_filter(sepiaMatrix);// Appel du script (rsForEach)mScript.forEach_root(mInAllocation, mOutAllocation);// Copie du résultat dans le bitmap de sortiemOutAllocation.copyTo(outputBitmap);
  27. 27. Démo
  28. 28. QRCode!
  29. 29. Résultats Appareil (matériel) Java RS GainNexus S 960 ms 280 ms x 3.4(Exynos 1 GHz Cortex A8)Galaxy Nexus 360 ms 80 ms x 4.5(OMAP 4460 1,2 GHz dual-core)Samsung Galaxy S2 340 ms 48 ms x 7.0(1.2 GHz dual-core ARM Cortex-A9)Samsung Galaxy S3 325 ms 49 ms x 6.6(1.4 GHz quad-core ARM Cortex-A9)Motorola Xoom 210 ms 26 ms x 8.0(Tegra 2: 1GHz dual-core)Nexus 7 180 ms 22 ms x 8.2(Tegra 3: 1.3 GHz quad-core)Intel AZ210 - Intel Orange San Diego 293 ms 59 ms x 4.9(Intel Atom 1.6 Ghz Z2460 with HT - x86)
  30. 30. RS en Bref● Solution pour les calculs● Intégration simplifiée & portabilitée● à vous de jouer !
  31. 31. MERCI !@sylvaingalandhttp://slvn.fr/+Code :http://github.com/sgaland

×