Difference between revisions of "User:ANSI Soderstrom/Threading with LSL"
(2 intermediate revisions by the same user not shown) | |||
Line 37: | Line 37: | ||
// look for events and do again the loop | // look for events and do again the loop | ||
llSetTimerEvent(THREATING_SPEED); | llSetTimerEvent(THREATING_SPEED); | ||
} | } | ||
} | } | ||
Line 58: | Line 56: | ||
// and AFTER that repeat the Sensor ! (DONT use SensorRepeat) | // and AFTER that repeat the Sensor ! (DONT use SensorRepeat) | ||
llSensor("",NULL_KEY,AGENT,96,PI); | 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 13: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>