Difference between revisions of "User:ANSI Soderstrom/Threading with LSL"

From Second Life Wiki
Jump to navigation Jump to search
(Created page with '== Leave a comment == * [[User_talk:{{PAGENAME}}|My User Talk about this Page]] == All About : Threating with LSL == Bla bla <lsl> default { state_entry() { llR...')
 
 
(6 intermediate revisions by the same user not shown)
Line 2: Line 2:
* [[User_talk:{{PAGENAME}}|My User Talk about this Page]]
* [[User_talk:{{PAGENAME}}|My User Talk about this Page]]


== All About : Threating with LSL ==
== All About : Threating with LSL (Creating Low-Lag-Items) ==
Bla bla


Some functions in SL creating a lot of lag on the server-side. But the greatest lag is not coming from llSetRot() or something like that, but from loops !!!
Do->while and for->to->next loops are the greatest lagproducers at the beginners level in SL. Furthermore its impossible to trigger a Event while a loop is running.
Some people say, timers are the godlike-laggers, but now we learn how to use timers for the opposite :)
We try to rotate the Prim around a angle of 360 degrees and producing no lag, because we wait at every loop for free server-power and can handle events while the loop is running.
Timer Example
<lsl>
<lsl>
integer LOOP_COUNT;
float  THREATING_SPEED = 0.001; // 0.25 is nearby a NULL-Lag item !
default
default
{
{
     state_entry()
     state_entry()
     {
     {
         llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);
         // use the timer event instead of a loop and make sure we can handle events while the loop is running...
        LOOP_COUNT = 360;
        llSetTimerEvent(THREATING_SPEED);
     }
     }


     timer() {
     timer() {
        // save serverPower
        llSetTimerEvent(0);
        // Do a loop (if possible)
        if(LOOP_COUNT) {
            // Rotate the Prim around his axis
            llSetRot(llGetRot()*llEuler2Rot(<0,0,LOOP_COUNT>*DEG_TO_RAD));
            // increment the loop
            --LOOP_COUNT;
            // look for events and do again the loop
            llSetTimerEvent(THREATING_SPEED);
        }
    }
}
</lsl>


Sensor Example
<lsl>
default
{
    state_entry()
    {
        llSensor("",NULL_KEY,AGENT,96,PI);
    }
    sensor(integer i) {
        // do something...
        // and AFTER that repeat the Sensor ! (DONT use SensorRepeat)
        llSensor("",NULL_KEY,AGENT,96,PI);
    }
}
</lsl>
== Multiple Timers in a single Script ==
<lsl>
// use more than one timer in a script
// by ANSI Soderstrom
// holds the timers
list timers = [];
// the timer itself, call it with his name and the order to stop or not after reaching the timer
time(string name, integer stopafter) {
    integer pos = llListFindList(timers,[name]);
    if(~pos) {
        if(!((integer)llGetTime()%llList2Integer(timers, pos+1))) {
            llMessageLinked(llGetLinkNumber(),1,llList2String(timers,pos),"");
            if(stopafter) {
                timers = llDeleteSubList(timers, pos, pos+1);
            }           
        }
    }
}
// set a timer, give it a name and a time
set_timer(string name, integer time) {
    integer pos = llListFindList(timers,[name]);
    if(~pos) {
        timers = llListReplaceList(timers,[name, time],pos,pos+1);
    } else {
        timers += [name, time]; 
    }
}
// start the timers
start_timers() {
    llResetTime();
    llSetTimerEvent(1);   
}
default
{
    state_entry()
    {   
        set_timer("timer1",10);
        set_timer("timer2",20);
        start_timers();
    }
    timer() {   
        time("timer1",TRUE);
        time("timer2",FALSE);
    }
   
    link_message(integer link_num, integer num, string str, key id) {
        if(num == 1) {
            if(str == "timer1") {
                llOwnerSay("Doing this"); 
            } 
            if(str == "timer2") {
                set_timer("timer1",10);
                llOwnerSay("and this"); 
            }             
        } 
     }
     }
}
}
</lsl>
</lsl>

Latest revision as of 12:25, 30 September 2013

Leave a comment

All About : Threating with LSL (Creating Low-Lag-Items)

Some functions in SL creating a lot of lag on the server-side. But the greatest lag is not coming from llSetRot() or something like that, but from loops !!! Do->while and for->to->next loops are the greatest lagproducers at the beginners level in SL. Furthermore its impossible to trigger a Event while a loop is running.

Some people say, timers are the godlike-laggers, but now we learn how to use timers for the opposite :)

We try to rotate the Prim around a angle of 360 degrees and producing no lag, because we wait at every loop for free server-power and can handle events while the loop is running.

Timer Example <lsl> integer LOOP_COUNT; float THREATING_SPEED = 0.001; // 0.25 is nearby a NULL-Lag item !

default {

   state_entry()
   {
       // use the timer event instead of a loop and make sure we can handle events while the loop is running...
       LOOP_COUNT = 360;
       llSetTimerEvent(THREATING_SPEED);
   }
   timer() {
       // save serverPower
       llSetTimerEvent(0);
       // Do a loop (if possible)
       if(LOOP_COUNT) {
           // Rotate the Prim around his axis
           llSetRot(llGetRot()*llEuler2Rot(<0,0,LOOP_COUNT>*DEG_TO_RAD));
           // increment the loop
           --LOOP_COUNT;
           // look for events and do again the loop
           llSetTimerEvent(THREATING_SPEED);
       }
   }

} </lsl>

Sensor Example <lsl> default {

   state_entry()
   {
       llSensor("",NULL_KEY,AGENT,96,PI);
   }
   sensor(integer i) {
       // do something...
       // and AFTER that repeat the Sensor ! (DONT use SensorRepeat)
       llSensor("",NULL_KEY,AGENT,96,PI);
   }

} </lsl>

Multiple Timers in a single Script

<lsl> // use more than one timer in a script // by ANSI Soderstrom

// holds the timers list timers = [];

// the timer itself, call it with his name and the order to stop or not after reaching the timer time(string name, integer stopafter) {

   integer pos = llListFindList(timers,[name]);
   if(~pos) {
       if(!((integer)llGetTime()%llList2Integer(timers, pos+1))) {
           llMessageLinked(llGetLinkNumber(),1,llList2String(timers,pos),"");
           if(stopafter) {
               timers = llDeleteSubList(timers, pos, pos+1);
           }            
       }
   }

}

// set a timer, give it a name and a time set_timer(string name, integer time) {

   integer pos = llListFindList(timers,[name]);
   if(~pos) {
       timers = llListReplaceList(timers,[name, time],pos,pos+1);
   } else {
       timers += [name, time];   
   }

}

// start the timers start_timers() {

   llResetTime();
   llSetTimerEvent(1);    

}

default {

   state_entry()
   {    
       set_timer("timer1",10);
       set_timer("timer2",20);
       start_timers();
   }

   timer() {    
       time("timer1",TRUE);
       time("timer2",FALSE);
   }
   
   link_message(integer link_num, integer num, string str, key id) {
       if(num == 1) {
           if(str == "timer1") {
               llOwnerSay("Doing this");   
           }   
           if(str == "timer2") {
               set_timer("timer1",10);
               llOwnerSay("and this");   
           }               
       }   
   }

} </lsl>