Forum » Programiranje » [Android][Java] Povečanje hitrosti algoritma
[Android][Java] Povečanje hitrosti algoritma
messi ::
Pozdravljeni,
zanima me kaj bi bilo narobe v tem algoritmu da je tako počasen, rad bi imel nek hiter algoritem, za katerega nebi potreboval par sekund.
Tukaj se nahaja: http://xjaphx.wordpress.com/2011/06/21/...
Source code:
zanima me kaj bi bilo narobe v tem algoritmu da je tako počasen, rad bi imel nek hiter algoritem, za katerega nebi potreboval par sekund.
Tukaj se nahaja: http://xjaphx.wordpress.com/2011/06/21/...
Source code:
public static Bitmap createSepiaToningEffect(Bitmap src, int depth, double red, double green, double blue) { // image size int width = src.getWidth(); int height = src.getHeight(); // create output bitmap Bitmap bmOut = Bitmap.createBitmap(width, height, src.getConfig()); // constant grayscale final double GS_RED = 0.3; final double GS_GREEN = 0.59; final double GS_BLUE = 0.11; // color information int A, R, G, B; int pixel; // scan through all pixels for(int x = 0; x < width; ++x) { for(int y = 0; y < height; ++y) { // get pixel color pixel = src.getPixel(x, y); // get color on each channel A = Color.alpha(pixel); R = Color.red(pixel); G = Color.green(pixel); B = Color.blue(pixel); // apply grayscale sample B = G = R = (int)(GS_RED * R + GS_GREEN * G + GS_BLUE * B); // apply intensity level for sepid-toning on each channel R += (depth * red); if(R > 255) { R = 255; } G += (depth * green); if(G > 255) { G = 255; } B += (depth * blue); if(B > 255) { B = 255; } // set new pixel color to output image bmOut.setPixel(x, y, Color.argb(A, R, G, B)); } } // return final image return bmOut; }
Genetic ::
Kot prvo lahko poskusis z Bitmap.getPixels(...) in Bitmap.setPixels(...), ki dela na arrayu pixlov; predvidevam, da sta get/setPixel dokaj casovno zahtevni operaciji.
messi ::
Potem me se zanima kako end class s pomnilnika izbrisat in kdaj. In kako z pomnilnika pobrisati gumb in ce je v clasu zapakiran in ce class postavim na null se izbrise. In kako najhitreje spucat pomnilnik. Pa katere operacije so procesorsko zahtevne
messi ::
Ves kaj je problem ko pritiskam back gumbo mi verjetno notri os od kje je pa 155mb bolj zaseden pomnilnik in procesor ..tane se precej stvari. Ker dejansko potem nalozim Nov intent.
Zgodovina sprememb…
- spremenilo: messi ()
golobich ::
Nisem vešč programiranja za Android, vendar C# ma en zelo fajn class ki se mu reče ColorMatrix nastaviš vrednosti in ti pretvori sliko.
Za sephia efekt sem nekej nahitro spisal že dolgo nazaj in mam takšno metodo:
Za sephia efekt sem nekej nahitro spisal že dolgo nazaj in mam takšno metodo:
private ColorMatrix CreateSepiaMatrix() { return new ColorMatrix(new float[][] { new float[] {0.393f, 0.349f, 0.272f, 0, 0}, new float[] {0.769f, 0.686f, 0.534f, 0, 0}, new float[] {0.189f, 0.168f, 0.131f, 0, 0}, new float[] { 0, 0, 0, 1, 0}, new float[] { 0, 0, 0, 0, 1} }); /* New Red = R*.393 + G*.769 + B*.189 New Green = R*.349 + G*.686 + B*.168 New Blue = R*.272 + G*.534 + B*.131 */ }
Spura ::
Jst bi za zacetek zagrabil vse pixle naenkrat z getPixels, delal bi na tem pixel arrayu in potem sele na koncu naredil nov bitmap s konstruktorjem, k vzame cel array pixlov namesto da bi sproti set pixel klical.
Color.green itd lahko najbrz zamenjas z lastnimi bitmaskami in bitshifti.
depth*red, depth*green itd lahko izracunas enkrat na zacetku funkcije ne pa za vsak pixel
Mozno, da bi bilo se hitreje ce bi klical copyPixelsToBuffer, copyPixelsFromBuffer, namesto getPixels setPixels.
Na slikah k jih ne rabis vec lahko poklices recycle.
Color.green itd lahko najbrz zamenjas z lastnimi bitmaskami in bitshifti.
depth*red, depth*green itd lahko izracunas enkrat na zacetku funkcije ne pa za vsak pixel
Mozno, da bi bilo se hitreje ce bi klical copyPixelsToBuffer, copyPixelsFromBuffer, namesto getPixels setPixels.
Na slikah k jih ne rabis vec lahko poklices recycle.
Zgodovina sprememb…
- spremenil: Spura ()
Legoless ::
Sam algoritem ni zahteven, vendar je zaradi dveh for zank njegova zahtevnost še vedno O(n^2). ColorMatrix bi znal bit rešitev, verjetno pa obstajajo tudi kakšne knjižnice v C++, ki tole rešijo hitreje. Ali pa ARM extensioni. Odvisno koliko bi rad zadevo optimiziral. Kar se pa tiče pomnilnika, pa pri slikah na Androidu pripomore ročno klicanje GC-ja, čeravno je bilo kar nekaj v communityjih.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Android] SplošnoOddelek: Programiranje | 2019 (1149) | piki12 |
» | Android zamenjava pogledovOddelek: Programiranje | 1094 (915) | c00L3r |
» | kako narediti program ki bere drugi programOddelek: Programiranje | 5806 (4119) | imagodei |
» | C++ programirane v Open GL oz. Direct xOddelek: Programiranje | 3000 (2271) | Vesoljc |
» | OpenGL orr v ansi cOddelek: Programiranje | 1656 (1444) | igor12 |