» »

[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:


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;
}

Vesoljc ::

zmanjsas sliko? :)
Abnormal behavior of abnormal brain makes me normal...

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

driver_x ::

Classov ti ni potrebno brisati iz pomnilnika.

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:
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.

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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Splošno

Oddelek: Programiranje
351954 (1084) piki12
»

Android zamenjava pogledov

Oddelek: Programiranje
6997 (818) c00L3r
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465448 (3761) imagodei
»

C++ programirane v Open GL oz. Direct x

Oddelek: Programiranje
242889 (2160) Vesoljc
»

OpenGL orr v ansi c

Oddelek: Programiranje
121565 (1353) igor12

Več podobnih tem