Jump to content






Photo - - - - -

Самый быстрый таймер LSL



Иногда появляются задачи, которые требуют максимально быстрого таймера. Первое, что приходит в голову сделать что нибудь типа:

llSetTimerEvent(0.01);

или вообще 0.000001 :) но это уже не существенно. Однако есть таймер и еще более быстрый, наверно самый быстрый вообще. Его использование не явно. Можно сказать что это полу-хак. Работает он на так называемых таргетах, как показала практика этот псевдо-таймер самый быстрый. К примеру:

integer test;
default
{
   state_entry()
   {
     //устанавливаем недостижимую цель
     test=llTarget(<0,0,0>,0.1);
   }
   not_at_target()
   {
     //а вот тут наш код типа_таймер
     //это событие вызывается всякий раз пока не в заданных координатах
     //то есть постоянно и очень часто
   }
}

Еще полезно когда надо использовать несколько таймеров в скрипте, к примеру один максимально быстрый, другой обычный.
Остановить его очень просто:

llTargetRemove(test);




Враки и суеверья.. работает с одинаковой скоростью что llSetTimerEvent(0.00001), что not_at_target().

Мало того. Долго-долго извращались, пробовали различные евенты... быстрее, чем 0.04 работает только while(1), гг

float old=0;

default
{
    state_entry(){
        llSetTimerEvent(0.0001);
    }

    timer(){
        float new=llGetTime();
        llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXT,(string)(new-old),<1,1,1>,1]);
        old=new;
    }
}


float old=0;
integer test;

default
{
    state_entry(){
        test=llTarget(<0,0,0>,0.1);
    }

    not_at_target(){
        float new=llGetTime();
        llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_TEXT,(string)(new-old),<1,1,1>,1]);
        old=new;
    }
}


Зато, если писать not_at_target() - ваш код будет выглядеть странно. Можно сойти за шамана.

Если внимательно присмотреться, то предложенный "хак" работает даже немножко медленнее.

Если хочется экстрима и наглядности:

rotation a;

default
{
    state_entry()
    {
        a=llEuler2Rot(<0,0,0.001>);
        llSetTimerEvent(0.0001);
    }
    timer(){
        
        llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_ROTATION,llGetRot()*a]);     
        
    }
}


rotation a;
integer test;

default
{
    state_entry()
    {
        a=llEuler2Rot(<0,0,0.001>);
        test=llTarget(<0,0,0>,0.1);
    }
    not_at_target(){
        
        llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_ROTATION,llGetRot()*a]);     
        
    }
}


rotation a;
default
{
    state_entry()
    {
        a=llEuler2Rot(<0,0,0.001>);
        while(1)llSetLinkPrimitiveParamsFast(LINK_THIS,[PRIM_ROTATION,llGetRot()*a]);
    }
}
  • Report

Trackbacks for this entry [ Trackback URL ]

There are no Trackbacks for this entry