DOM 117: schleife / while / window settimeout

moin ich mache via canvas eine auswertung von dem rgb-wert eines einzelnen Pixels.
Nun möchte das ganze ca. 2000 bis 5000 hintereinanderweg machen

eigentlich würde ich das mit einem while(i<2000){//rufe die Auswertung auf(); i++;}machen.
wenn ich das so schreibe dann kommt die meldung 'skript stopen oder weiter laufen lassen?' ich sage lass laufen, dass script kommt nach gefühlten 2 min zum ende mit dem richtigen ergebnissen.

Frage 1: Warum reagiert das script so langsam? /sind es zuviele daten die aufgerufen werden?
(while ist fehlerfrei)

Frage 2: Wieviele operationen kann ich mit einem while machen bzw welche richtwerte gibt es?(z.b. max 5000zeilen lang?!?)

Frage 2b: oder erreiche ich die grenze meiner Client-seitigen operation(also javas am ende)?

Frage 3: kann ich ein window settimeout schneller als 1 mil sec laufen lassen?
 z.b. window.settimeout(0.1, myfunc)??? ja nä das geht oda??
 jaja denkt was ihr wollt was hab ich für eine wahl!

so sorry für meine whackniss abba du als antworten-gott kannst mir doch bestimmt weiterhelfen???
bitte
 danke

(die verarbeitung der daten soll Client-Seitig passieren deswegen der aufwand)

  1. sind es zuviele daten die aufgerufen werden?

    Offensichtlich. Pixel einzeln auslesen ist in anderen Sprachen eine ziemlich aufwendige Sache bei der für jedes Pixel viel passieren muss. Davor wird in Beschreibungen zu solchen Funktionen teilweise gewarnt. Schau ob es eine schnellere Variante gibt, die z.B. eine ganze Zeile auf einmal ausliest statt immer nur ein einziges Pixel. Zeig ein bisschen Code, vielleicht kann dir jemand dann was konkretes raten.

    Frage 2: Wieviele operationen kann ich mit einem while machen bzw welche richtwerte gibt es?(z.b. max 5000zeilen lang?!?)

    Da gibt es keine Richtwerte. Wenns zu lange geht bricht der Browser ab. Ist auch gut so denn es gibt genügend Seiten die alles mit sinnlosen und fehlerhaften Scripten blockieren. Da musst du also die Meldung weiterhin bestätigen. Oder dir eine ganz andere Lösung überlegen.

    Frage 3: kann ich ein window settimeout schneller als 1 mil sec laufen lassen?

    Nein denn so genau kannst du sowieso nicht auflösen wann dein Prozess wieder CPU Zeit bekommt.

    abba du als antworten-gott kannst mir doch bestimmt weiterhelfen???

    Gott bin ich nicht und Abba auch nicht, aber vielleicht hast du trotzdem einen Ansatz zur weiteren Suche bekommen :-)

    1. Gott bin ich nicht und Abba auch nicht, aber vielleicht hast du trotzdem einen Ansatz zur weiteren Suche bekommen :-)

      ansatz auf jedenfall. danke für die logische erklärung der timeout frage.

      Davor wird in Beschreibungen zu solchen Funktionen teilweise gewarnt.

      meine hoffnung war das mit html5 dis alles klar geht...!?

      hier ein wenig code^^ nur vom prinzip her

      //html

      <canvas id="myCanvas" style="border:1px solid #000000;" height="2414" width="3264">

      </canvas>

      //script

      while(x<2000){Fokus_Pixel_Scean(); x++;}

      function Fokus_Pixel_Scean(x, y){

      Fokus_Pixel = ctx.getImageData(x, 1500, 1, 1).data;
      //(x = X-koordinate, 1500 = Y-koordinate, 1 = höhe des betrachten bereichs, 1 = breite ...)
      //ctx = canvas

      Fokus_Pixel[0]; //Farbe rot
      Fokus_Pixel[1]; //Farbe grün
      Fokus_Pixel[2]; //Farbe blau

      wenn rgb bei den wert z.b. 253 253 253
      dann wird x gespeichert. also die x-koordinate des gesceanten pixels

      //ende

      so meine idee ist jetzt das ganze über einen timeout laufen zulassen statt while. was ja nicht richtig gut wäre.

      Frage 1: gib es einen fachlich richtigen weg für die auslesung von pixeln? !!!client-seitig!!!

      Schau ob es eine schnellere Variante gibt, die z.B. eine ganze Zeile auf einmal ausliest statt >immer nur ein einziges Pixel.

      Frage 2: in welche richtung denkst du da? da hab ich keinen ansatz

      Frage 3: hat jemand von euch mit javascript eine bilderkennung geschrieben???

      nochmals danke
      ich hau mich erstmal hin bis später.

      1. Hallo DOM,

        mit der Auswertung einzelner Pixel habe ich mich noch nicht beschäftigt, allenfalls mit der Erzeugung.

        Zur Lösung des 'skript stopen oder weiter laufen lassen?'-Problems kenne ich zwei Möglichkeiten:

        1. Du startest die Schleifen über setTimeout oder setInterval, aber nicht für jeden Pixel, sondern zerlegst das Problem in Blöcke mit ca. einer Sekunde Laufzeit.

        2. Du beschäftigst dich mit web workers. Da kannst du, wenn vorhanden, sogar mehrere CPUs / Kerne nutzen. Ich habe das mal ausprobiert: Mandelbrotmenge.

        Gruß, Jürgen

      2. Hallo,

        while(x<2000){Fokus_Pixel_Scean(); x++;}

        function Fokus_Pixel_Scean(x, y){

        Fokus_Pixel = ctx.getImageData(x, 1500, 1, 1).data;

        Du rufst in der Schleife immer wieder getImageData auf. Das ist langsam. Wenn du ohnehin eine ganze Zeile oder gar das ganze Bild untersuchst, dann rufe getImageData mit einem größeren Bereich auf, nicht immer 1x1 Pixel. Dann bekommst du zwar einen großen Array mit [r1, g1, b1, a1, r2, g2, b2, a2…] zurück, aber darauf zu operieren ist kein großes Problem.

        Also mehr so

        var allData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;

        so meine idee ist jetzt das ganze über einen timeout laufen zulassen statt while. was ja nicht richtig gut wäre.

        setTimeout hat ein Minimum zwischen 4-10ms. Du kannst in einem Durchlauf natürlich mehrere Pixel bearbeiten, solange das in diesem Zeitraum funktioniert.

        Manche Browser kennen setImmediate.

        Frage 1: gib es einen fachlich richtigen weg für die auslesung von pixeln?

        Auf jeden Fall nicht Pixel für Pixel getImageData aufrufen.

        Schau ob es eine schnellere Variante gibt, die z.B. eine ganze Zeile auf einmal ausliest statt >immer nur ein einziges Pixel.

        Frage 2: in welche richtung denkst du da? da hab ich keinen ansatz

        Genau das habe ich oben beschrieben.

        Frage 3: hat jemand von euch mit javascript eine bilderkennung geschrieben???

        Dafür gibt es viele Beispiele.

        Mathias

  2. Hallo,

    Frage 1: Warum reagiert das script so langsam? /sind es zuviele daten die aufgerufen werden?

    Es liegt an den Operationen, die du in der Schleife machst. Den Code dazu hast du noch nicht vollständig gepostet, daher können wir nur von dem ausgehen, was wir gesehen haben.

    Frage 2: Wieviele operationen kann ich mit einem while machen bzw welche richtwerte gibt es?(z.b. max 5000zeilen lang?!?)

    Du kannst mit einer Schleife Milliarden Operationen machen – wenn der Schleifenkörper leer ist oder triviale Operationen beinhaltet. Es liegt immer an der Performance der Operationen in der Schleife (und der Abbruchbedingung natürlich).

    Frage 2b: oder erreiche ich die grenze meiner Client-seitigen operation(also javas am ende)?

    Nein.

    Frage 3: kann ich ein window settimeout schneller als 1 mil sec laufen lassen?

    Es lässt sich noch nicht einmal 1ms erreichen.

    z.b. window.settimeout(0.1, myfunc)??

    https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout#Minimum.2F_maximum_delay_and_timeout_nesting
    https://developer.mozilla.org/en-US/docs/Web/API/Window.setImmediate
    https://github.com/YuzuJS/setImmediate

    Mathias