Какое минимальное время CreateDataTimer

Тема в разделе "Программирование / Скриптинг", создана пользователем KGB1st, 12 авг 2015.

  1. KGB1st

    KGB1st

    Сообщения:
    60
    Симпатии:
    0
    PHP:
    CreateDataTimer0.1Regenerationpack );
    Можно использовать мс?
     
  2. DarklSide

    DarklSide

    Сообщения:
    684
    Симпатии:
    173
    Конечно:
    PHP:
    CreateDataTimer(0.100Regenerationpack); 
    P.S.:
    PHP:
    #define TIMER_MIN_ACCURACY  0.1
     
  3. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    минимальное время 0.0
    Если выставить нулевое время, то коллбек выполнится на следующем фрейме.
     
  4. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Как же вы любите показывать, что вы всё знаете, а таких простых вещей не знаете. При этом посылать людей на вики вы тоже любите, но сами не до конца её прочитали или поняли, что там написано.
    https://wiki.alliedmods.net/Timers_(SourceMod_Scripting)
    Специально для вас расскажу, что же это значит. У таймеров высокая точность, но они основаны на текущем тике. Так как фрейм есть 1/tickrate, то при 100 тикрейтах мы получаем, что 0.1 секунда (минимальный рекомендуемый интервал таймера) будет содержать 10 тиков (циклов OnGameFrame). Таймер вызывается каждый 10 тик, а его вызов производится на произвольном числе тиков (например, может быть вызван на 1, на 5, на 8). Таким образом, утверждение, что минимальное время равно 0.0 является полностью неправильным. Нельзя утверждать, что таймер будет вызван на следующем тике, это выражение будет правильным лишь в 10% случаев. На деле таймер будет вызван через N тиков, где N - число в интервале от [0; 9] тиков.
    Код:
    new bool:	g_bRunning;
    new bool:	g_bWaitForNextTick;
    public OnPluginStart() 
    {
    	RegConsoleCmd("sm_test", Command_Test);
    }
    
    public Action:Command_Test(iClient, iArgc)
    {
    	CreateTimer(0.0, Timer_NextTick);
    	PrintToServer("timer created");
    	g_bRunning = true;
    	g_bWaitForNextTick = true;
    	
    	return Plugin_Handled;
    }
    
    public Action:Timer_NextTick(Handle:hTimer)
    {
    	g_bRunning = false;
    	PrintToServer("timer end");
    }
    
    public OnGameFrame()
    {
    	if ( g_bWaitForNextTick ) {
    		PrintToServer("next tick");
    		g_bWaitForNextTick = false;
    	}
    	if ( g_bRunning ) {
    		PrintToServer("tick");
    	}
    }
    Поэтому можно ставить числа меньше, чем 0.1 секунда, но точность при этом будет очень низкой. Например, таймер на 1.234 секунд может быть не вызван, пока не пройдет 1.242 секунд (для тикрейта = 66).
     
  5. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    Тогда о какой высокой точности идёт речь? Противоречие на замечаешь?
     
  6. Reiko1231

    Reiko1231 AlexTheRegent

    Сообщения:
    237
    Симпатии:
    569
    Высокая точность относительно тиков, низкая правильность относительно реального времени. Таймер всегда будет вызван на 10 тике для тикрейта в 100. Но не факт, что будет вызван на 1.234 секунде для таймера в 1.234 секунд, а может быть вызван и на 1.242 секунде. Еще раз цитирую вики:
    И вообще, какое отношение это имеет к вопросу к теме? Вы высказали неверное утверждение, я вас поправил, попутно сказав, что вы любите показывать себя умным, но сами не знаете простых вещей. Теперь вы цепляетесь к слову, еще раз показав, что не понимаете, как работают таймеры.
    И к тому же, такие "противоречия" есть не только тут - в квантовой физике есть принцип неопределённости Гейзенберга - чем точнее измеряется одна характеристика частицы, тем менее точно можно измерить вторую. Так же и тут - точный номер тика, но далеко не точное реальное время.
    И так же от себя - Оффтоп .
     
  7. gibs

    gibs Фитиль народного волненья

    Сообщения:
    538
    Симпатии:
    137
    Это не то чтобы простая вещь. Эта не нужная вещь. Я с тобой нелепой дотошностью не писал тесты, так как высокая точность в игре просто не нужна. Я когда-то у преда вроде увидел коммент возле таймера, в котором время было выставлено 0.0, что мол ждём следующего фрейма.
    И сами таймеры организованы не на системном времени потому, что точностью можно спокойно жертвовать.
    Но спасибо за уточнение. Вряд ли это знание мне понадобится.
     
  8. KGB1st

    KGB1st

    Сообщения:
    60
    Симпатии:
    0
    ого.. информативо. спасибо ;)