You are reading a single comment by @DrAzzy and its replies. Click here to read the full conversation.
  • I'm already minifying.

    The point of the Math.max() is to ensure that if bch > 0, the result is >0 - basically, so that if a channel is supposed to be on, but very dim, and the bitshift would make it 0 (off), we instead set it to minimum brightness (1).

    changing to incrementing a variable only shaved off about 1ms. I was playing around with commenting out lines though.

    flip() is now down to 18ms or so, but with mode=1 (twinkle), dotwinkle() takes like 45ms.... There are three lines that will save 11ms if I comment them out (ofc, they're critical lines!). These times are with just 5 LEDs, too...

    
    leds.flip = function () {
    	var j=0;
    	var i=0;
    	var z=leds.num*3;
    	while (i<z) {
          var rch=gtab[leds.tclb[i++]];
    		var gch=gtab[leds.tclb[i++]];
    		var bch=gtab[leds.tclb[i++]];
    		
    		var ma = Math.max(rch,gch,bch);
    		var mult=1;
            var gdim=31;
    		
    			if (ma <390) {
    				gdim=3;
    				mult=10.33;
    			} else if (ma <700) {
    				gdim=7;
    				mult=4.4;
    			} else if (ma <1700) {
    				gdim=15;
    				mult=2.06;
    			} 
    		
    		this.fbuf[j++]=(this.ison?(gdim|224):224­);
    		this.fbuf[j++]=(bch?Math.max((bch*mult)>­>4,1):0);
    		this.fbuf[j++]=(gch?Math.max((gch*mult)>­>4,1):0);
    		this.fbuf[j++]=(rch?Math.max((rch*mult)>­>4,1):0);
    
    	}
    
    	this.spi.write(0,0,0,0,this.fbuf,0xFF,0x­FF,0xFF,0xFF);
    };
    
    
    leds.dotwinkle = function () {
    	var t=this.t;
    	var tm= this.tm;
    	var ta=this.ta;
    	var ti=this.ti;
    	var b=this.buff;
    	var z=this.tbuf;
    	var o=this.overlay;
    	if (this.animode) {
    		if (this.aniframe > this.anilast) {
    			this.animode=0;
    			this.anilast=0;
    			this.aniframe=0;
    			this.overlay=new Uint8Array(this.num*3);
    		} else {
    			this.overlay=this.animation[this.anifram­e++];
    		}
    	}
    	for (var i=0;i<this.num*3;i++){
    		if (b[i] != z[i]){ //fade
              		b[i]=b[i]+(z[i]>b[i]?1:-1); //11ms
    		}
    		var mode=tm[i];
    		var mo=mode&0x0F;
    		var pr=mode>>4;
    		if (mo==1) { //0x01 - high nybble is chance to change, from 0 (1/16) to 15 (16/16 chance to change)
    			var n=Math.random(); //3ms
              //var n=0.8;
    			var th=(pr+1)/32;
          			t[i]=E.clip(t[i]+(n<(0.5+th)?(n>(0.5-th)­?0:-1):1),ti[i],ta[i]); //11ms
    		} else if (mo==2) { //fade/pulse. 
              		if (this.afr%((1+pr)&7)==0){
                			t[i]=t[i]+(pr&8?1:-1);
    				if (t[i] == ti[i] || t[i] == ta[i]) {
    					tm[i]=mode^128;
    				}
            		}
    		}
    		leds.tclb[i]=b[i]+(b[i]?t[i]:0)+o[i]; //11ms
    	}
    	this.afr=this.afr==255?0:this.afr+1;
    };
    
    

    On the Pico, times are 16ms and 38ms - so the pico is only a little faster than the ESP8266.

    It looks like the costly operation may be accessing array members?

About

Avatar for DrAzzy @DrAzzy started