Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.88/40: Рейтинг темы: голосов - 40, средняя оценка - 4.88
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84

Как вызвать функцию ровно n раз в секунду?

19.10.2020, 14:55. Показов 8764. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! пишу игру на с++. нужно вызывать функцию update ровно n раз в секунду. довольно быстро написал следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# include <intrin.h>
# include <iostream>
 
# pragma intrinsic(__rdtsc)
 
// получаем текущий момент времени в наносекундах
long int get_nanosec() { 
    return __rdtsc();
}
 
// переменные для хранения и расчета моментов времени
struct Time { 
    long int last = get_nanosec();
    long int now = 0;
    long int elapced = 0;
    long int delta = 0;
    long int count = 0;
};
 
// отладочная информация
struct Debug { 
    long int fps = 0;
    long int upd = 0;
    long int updl = 0;
};
 
// основные константы и переменные
struct Setting { 
 
    const long int second = 1000000000l; // колличество наносекунд в секунде
    const float upd_rate = 100.0f;       // колличество обновлений в секунду
 
    float upd_interval = second / upd_rate;
    bool is_render;
};
 
// основная функция игры. в ней происходит обновление моделей
void update() {
 
}
 
// основная функция игры. в ней отрисовываются все объекты и обновляется окно
void render() {
 
}
 
int main() {
    
    Time time;
    Debug deb;
    Setting set;
 
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
 
    while (true) {
 
        set.is_render = false;
 
        // расчитываем, сколько времени прошло с предыдущей итерации
        time.now = get_nanosec();
        time.elapced = time.now - time.last;
        time.last = time.now;
 
        // обновляем счетчики
        time.count += time.elapced;
        time.delta += (time.elapced / set.upd_interval);
 
        // вызываем функцию update столько раз, сколько должны были с предыдущей итерации
        while (time.delta >= 1) {
 
            update();
 
            deb.upd++;
            time.delta--;
 
            if (set.is_render) {
                deb.updl++;
            }
            else {
                set.is_render = true;
            }
        }
 
        // вызываем функцию render если были изменения (вызывалась функция update)
        if (set.is_render) {
            render();
            deb.fps++;
        }
 
        // раз в секунду выводим отладочную информацию
        if (time.count >= set.second) {
 
            std::cout << "fps: " << deb.fps << "\tupd: " << deb.upd << "\tupdl: " << deb.updl << std::endl;
 
            deb.fps = 0;
            deb.upd = 0;
            deb.updl = 0;
 
            time.count = 0;
 
        }
        
    }
 
}
Но возникает проблема: функция get_nanosec у меня реализована очень условно. как мне получить из тиков процессора количество наносекунд, прошедших с опр. момента?
P.S. если есть идеи по оптимизации, то помогите пожалуйста)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2020, 14:55
Ответы с готовыми решениями:

Как вызвать функцию много раз с изменениями?
здравствуйте, подскажите чайнику, я хочу примерно это: def f(x): f(x)

Как вызвать функцию несколько раз подряд?
Здравствуйте! В ячейке А1 есть функция, к примеру СЛУЧМЕЖДУ (1,4), в нужный момент времени её нужно её вызвать N число раз, а N + 1...

Нужно вызвать функцию 10 раз с разными параметрами (как обратиться к val1 и val2)?
// ОС4.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &quot;stdio.h&quot; #include...

41
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
21.10.2020, 15:22
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от drit Посмотреть сообщение
зная частоту процессора (в теории) я могу получить количество наносекунд * 100 с опр момента. это НАМНОГО быстрее миллисекунды.
Это при условии, что частота постоянна и все ядра работают на одной частоте (поток может переехать). Т.е. это непереносимый код.

Да и всё ещё не понятно, куда тебе такая точность. Мой вариант работает с точностью до десятков микросекунд, вариант oleg-m1973 также, но не накладывает ~60 мкс оверхеда из-за отсутствия одной лишней операции внутри цикла. Точность десятков микросекунд это в 100 раз точнее миллисекунды. Думаю, вполне можно уместить в слово "НАМНОГО".
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.10.2020, 16:33
Цитата Сообщение от drit Посмотреть сообщение
2 факт: если передавать кол-во времени, прошедшего с опр момента в функцию отрисовки анимации, то мы ДЛЯ КАЖДОЙ анимации будем считать примерно следующие: elapced_time / anim_update_time_interval. Это очень долго.
это - не факт.
это - какой то непонятный домысел.

Цитата Сообщение от drit Посмотреть сообщение
Куда проще гарантировать вызов функции Update опр раз в секунду и уже от этого строить анимации
что тут можно сказать? хочется страдать - страдай.

Добавлено через 43 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Windows и Linux это не системы реального времени. Квант времени выделяемый для потока в них равен 1 ms. Соответственно, как ты не извращайся с измерениями времени, ты не сможешь гарантировать периодичность вызова своей функции с точностью более одной миллисекунды.
мне вот интересно: откуда ты взял свою 1 миллисекунду?

Квант – это интервал процессорного времени, отведенный потоку для выполнения. По его окончании Windows проверяет, ожидает ли выполнения другой поток с таким же уровнем приоритета. Если на момент истечения кванта других потоков с тем же уровнем приоритета нет, Windows выделяет текущему потоку еще один квант.
По умолчанию в Windows 2000 Professional и Windows XP потоки выполняются в течение 2 интервалов таймера (clock intervals), а в системах Windows Server – 12. (Как изменить эти значения, мы объясним позже.) B серверных системах величина кванта увеличена для того, чтобы свести к минимуму переключение контекста. Получая больший квант, серверные приложения, которые пробуждаются при получении клиентского запроса, имеют больше шансов выполнить запрос и вернуться в состояние ожидания до истечения выделенного кванта.
Длительность интервала таймера зависит от аппаратной платформы и определяется HAL, а не ядром. Например, этот интервал на большинстве однопроцессорных х8б-систем составляет 10 мс, а на большинстве многопроцессорных х8б-систем – около 15 мс. (Как проверить реальный интервал системного таймера, см. в следующем эксперименте.)

(ц) Марк Руссинович. Внутреннее устройство Windows.
может ты с интервалом системного таймера перепутал?
0
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
21.10.2020, 21:21  [ТС]
Так. Ну, собственно:
1) вы противоречите сами себе. Буквально несколько сообщений выше вы предлагали передавать в функцию отрисовки анимации кол-во времени, прошедшее с предыдущей итерации (у меня это elapced_time). У каждой анимации есть некоторая характеристика скорости смены кадров - anim_update_time_interval. Вы предлагаете считать, сколько кадров анимации должно было проиграться с предыдущей итерации цикла. Но ведь это и будет то, что я написал! Минусы такого подхода:
Деление - операция очень неточная. Просто увеличить счетчик кадров анимации на 1 будет эффективнее, быстрее и точнее.
При БОЛЬШОМ кол-ве объектов с анимациями вы предлагаете считать, сколько кадров должно было проиграться (ведь anim_update_time_interval для каждой анимации свой!) очевидны минусы такого подхода.
2) Из вашей выкладки про квант не следует, что Windows и Linux накладывают какие-то ограничения на скорость выполнения потока. Квант - это просто интервал времени, через который система стучится в поток и спрашивает, не умер ли он.

И да, я хочу получить эффективную функцию, возвращающую текущее время. А то ваши функции работают медленно и не точно (я смог получить не больше 100000 upd в секунду. А просто вызывая __rdtsc около 400000000 upd)
0
21.10.2020, 21:55

Не по теме:

Цитата Сообщение от drit Посмотреть сообщение
медленно и не точно
Посоны, посоны, мне нужно померить длину листа а4, тащите электронный микроскоп, а то вдруг я лишний нанометр посчитаю. Вот примерно так в контексте задачи звучат заявления про недостаток точности.

0
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
21.10.2020, 22:29  [ТС]
Нет, тут именно практическая необходимость. Используя стандартную библиотеку chrono я физически не смогу получить upd > 1000/15 ~= 65. А хотелось-бы это значение немного увеличить. + меня не устраивает вариант, что я приводил выше, когда вызов функции текущего времени занимает времени меньше, чем точность этой самой функции. Я хочу получить универсальный точный инструмент измерения времени. А то я читаю в документациях только про медленные неточные функции, которые еще и не везде использовать удобно.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
21.10.2020, 22:51
Цитата Сообщение от drit Посмотреть сообщение
я смог получить не больше 100000 upd в секунду
Эмм... А что вы там анимируете, если не секрет? Результат столкновения протонов в БАКе в реальном времени? И кто это увидит, или на каком устройстве отображения это можно теоретически визуализировать? Я уж молчу про возможности человеческого глаза. Обычно анимация - это набор кейфреймов, причем интервалы между ними измеряются не в наносекундах, а в секундах или десятках секунд. Все промежуточные трансформации - результат интерполяции. В болшинстве игр подсистемы(будь то физика, анимация и пр.) вообще работают на фиксированном интервале времени, например 1/60 сек. Интервалы короче просто не обрабатываются, т.к. нет необходимости, интервалы длиннее отбрасываются(обрезаются), если железо не тянет.
Так что я реально не понимаю, что у вас за проблема, просветите.
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
21.10.2020, 23:05
Цитата Сообщение от drit Посмотреть сообщение
Нет, тут именно практическая необходимость.
Тебе показали варианты, которые выдают нужное для заданного фпс время кадра с точностью до десятков микросекунд. На фоне 16.67мс для 60фпс это 0.06%. В чём заключается практическая необходимость большей точности?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.10.2020, 23:45
Цитата Сообщение от drit Посмотреть сообщение
вы противоречите сами себе. Буквально несколько сообщений выше вы предлагали передавать в функцию отрисовки анимации кол-во времени, прошедшее с предыдущей итерации (у меня это elapced_time). У каждой анимации есть некоторая характеристика скорости смены кадров - anim_update_time_interval. Вы предлагаете считать, сколько кадров анимации должно было проиграться с предыдущей итерации цикла.
именно это я и предлагаю.
ну и в чем противоречие?

Цитата Сообщение от drit Посмотреть сообщение
Но ведь это и будет то, что я написал!
в смысле "то" ?
какое такое "то" ?

приведи точную цитату, что ты там написал.

Цитата Сообщение от drit Посмотреть сообщение
Минусы такого подхода:
Деление - операция очень неточная. Просто увеличить счетчик кадров анимации на 1 будет эффективнее, быстрее и точнее.
не будет.
ты не можешь просто взять и увеличить счетчик кадров.

потому что в многозадачных системах (windows/linux)
ты никак не сможешь вызывать функцию ровно n раз в секунду.
это - невозможно.

как у тебя язык то вообще повернулся написать слово "точнее" в отношении механизма,
который может на полторы секунды лагнуть только потому,
что я запустил броузер хром на машине.

Цитата Сообщение от drit Посмотреть сообщение
У каждой анимации есть некоторая характеристика скорости смены кадров
именно так.
первое, что требуется от механизма анимации - это возможность задавать скорость смены кадров.

типичная задача аниматора:
есть собачка и кошечка.
нужно, что бы кошечка анимировалась в 2 раза быстрее, чем собачка.

как ты это обеспечишь?
единственный способ - наделить анимацию характеристикой "скорость смены кадров".
и да, каждая анимация каждый раз будет рассчитывать сколько кадров нужно отщёлкать.
по другому такая задача не решается в принципе.

кроме того, у программистов должна быть возможность синхронизировать
несколько объектов по времени.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// плохой код:
Dog dog;
Cat cat;
 
dog.play();  // <--- прошло x миллисекунд с момента вкл. компьютера
 
cat.play();  // <--- прошло x + b миллисекунд с момента вкл. компьютера
// где b - время которое было затрачено на анимацию собачки
 
// таким образом время кошечки
// может незначительно отличаться от времени собачки
 
...
 
mouse.play(); // <--- время мышки 
// уже может очень значительно отличаться от времени собачки

и вот что бы не возникало рассинхронизации по времени,
и нужно просто передавать анимациям некоторое фиксированное dt.

C++
1
2
3
4
5
6
// хороший код:
Dog dog;
Cat cat;
const auto ms = clock::now();
dog.play(ms);  // <--- прошло ms миллисекунд
cat.play(ms);  // <--- прошло ms миллисекунд
при правильном подходе самим течением времени управляет программист.
оно зависит только от самого программиста,
и больше ни от кого.

например:

C++
1
2
cat.update(10ms);
cat.update(1000ms);
на самом деле в реальном мире между этими двумя вызовами прошло менее 1 миллисекунды.
однако кошка об этом не знает.
в её мире прошло столько времени,
сколько сказал программист.


программист может приказать кошке анимироваться в 2 раза быстрее.
или может сказать, что времени прошло уже в 2 раза больше.
как программист захочет - так и будет.

при этом кошка будет адекватно реагировать на любые dt.
она всегда будет перещёлкивать правильное кол-во кадров.
поэтому, ей не страшны системные лаги.

ты же борешься с ветряными мельницами.
ты пытаешься найти лекарство против системных лагов.
но в многозадачных операционках его не существует.
лаги в таких системах - это обычное дело.

анимация, работа которой напрямки зависит от равномерности квантов в многозадачной системе,
будет всегда тупить и лагать точно так же,
как тупят и лагают сами эти неравномерные кванты.

Добавлено через 11 минут
Цитата Сообщение от zayats80888 Посмотреть сообщение
Обычно анимация - это набор кейфреймов
это - просто набор "кадров".

"кадр" - абстракция.
не обязательно отображаемый внешне.
кадр описывает состояние модели в некоторый момент времени.

можно, например, запрограммировать движение каких нибудь частиц.
можно избрать в качестве ед. измерения наносекунды.
а потом просматривать, как изменялась модель с течением времени.

при этом, в реальном мире ты можешь перещёлкивать 1 кадр в течении целой минуты.
для самой модели течение времени не изменится.
её локальная 1 наносекунда по прежнему будет той же самой наносекундой.
можешь вообще всю модель на паузу поставить,
и рассмотреть во всех деталях.

Цитата Сообщение от zayats80888 Посмотреть сообщение
И кто это увидит
учОные? ))
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
22.10.2020, 00:03
Цитата Сообщение от hoggy Посмотреть сообщение
можно, например, запрограммировать движение каких нибудь частиц.
можно избрать в качестве ед. измерения наносекунды.
а потом просматривать, как изменялась модель с течением времени.
Так в том то и дело - что это не анимация. Это не имеет отношения к реальному времени, просто симуляция.
В интерактивных приложениях(играх в частности) эти наносекунды ни кому не нужны. Там есть негласное правило: if it looks right, it is right.
Цитата Сообщение от hoggy Посмотреть сообщение
учОные
Они в "такие" игры не играют
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.10.2020, 00:11
Цитата Сообщение от zayats80888 Посмотреть сообщение
Так в том то и дело - что это не анимация. Это не имеет отношения к реальному времени, просто симуляция
дык к том то и дело, что анимация и есть симуляция.
она может иметь, а может и не иметь отношение к реальному времени.

Цитата Сообщение от zayats80888 Посмотреть сообщение
Там есть негласное правило: if it looks right, it is right.
там есть масса различных правил.

например: когда собачка переключится на 101 кадр, кошечка уже должна быть на 57 кадре...

вплоть до грубых читов:
переключаем сразу на нужный кадр, и пофигу, что мы перескочили сразу через 10-к

Цитата Сообщение от zayats80888 Посмотреть сообщение
Они в "такие" игры не играют
ещё как играют.

у них в одной наносекунде может быть множество кадров.
причем каждый из них нужно по честному отщелкать (нельзя резко перепрыгивать)
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
22.10.2020, 00:25
hoggy, я думаю ты понял о чем я говорю Анимация всегда проигрывается в реальном времени. А отображает ли она реальную скорость событий или нет - не важно.
Цитата Сообщение от hoggy Посмотреть сообщение
у них в одной наносекунде может быть множество кадров.
И нет никакой необходимости обрабатывать все эти кадры, если нужно воспроизвести эти события с реальной скоростью. Монитор больше кадров в секунду, чем может, не покажет.
0
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
22.10.2020, 00:37  [ТС]
У меня проблема: не могу нормально написать игровой цикл. Как это сделать?
Задача: вызывать функцию update n раз в секунду (n - const). Хорошо, если сможете получить 200-300 upd на "пустой" функции. Т.к. далее эти показатели могут сильно просесть из-за логики самой игры. А так-же подскажите пожалуйста, как нормально оптимизировать код (анимации и прочее).
Методы, описанные выше не гарантируют вызова update хотябы примерно n раз в секунду при условии, что и в update и в render есть код.
Хочу, чтобы игра запускалась на самом хреновом железе, так-что оптимизация для меня важна.

Добавлено через 1 минуту
Далее я предлагаю код, который работает, но коряво. Зато отражает, что я примерно хочу получить. Если поможет реализовать что-то болен адекватное - буду блогадарен

Добавлено через 7 минут
И все-же я не понимаю некоторых ваших утверждений. Например анимации по тому принципу, как мне их предлагает реализовать hoggy. Я показал, что его метод не эффективен (мы ДЛЯ КАЖДОЙ АНИМАЦИИ считаем выражение, которое можем посчитать всего один раз)
А так-же утверждение про невозможность точно n раз в секунду вызывать функцию. Это и ежу понятно. Задача в другом - надо к этому стремиться. Это КРИТЕРИЙ хорошего кода (доя меня в данный момент). А так операционная система Windows вполне позволяет делать вычисления куда быстрее микросекунды. Так-что аргумент про распределённые системы аргументом, на мой взгляд, не является.

Добавлено через 1 минуту
Буду рад, если поможете. Основная задача - что-бы код работал одинаково на разных машинах и работал быстро
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
22.10.2020, 01:38
drit, почитайте. Там конечно про "физику", но это более чувствительная и нагруженная система, чем анимация.

Цитата Сообщение от drit Посмотреть сообщение
Я показал, что его метод не эффективен (мы ДЛЯ КАЖДОЙ АНИМАЦИИ считаем выражение, которое можем посчитать всего один раз)
Вы удивитесь, но для скелетной анимации, например, никто не хранит заранее посчитанные матрицы и кватернионы на каждую наносекунду. Эти трансформации интерполируются, а это (о ужас!) куда более затратная операция, чем какое-то там деление.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
22.10.2020, 01:39
Цитата Сообщение от zayats80888 Посмотреть сообщение
И нет никакой необходимости обрабатывать все эти кадры, если нужно воспроизвести эти события с реальной скоростью.
такая необходимость может быть.
это от задачи зависит.

реальность сегодняшнего дня такова,
что анимация - это не просто изменяющаяся на экране картинка.
зачастую это - довольно таки сложная симуляция,
в рамках которой обссчитываются довольно таки сложные взаимодействия.

"я хочу, что бы монетки посыпались посредине экрана.
монетки постепенно уходят в альфу.
как только предпоследняя монетка окажется на расстоянии 200 единиц от нижней части экрана,
должна заиграть музыка, и бой барабанов.
а с левой части экрана должен начать выползать медведь"
(ц) ДизигнЭр

суть концепции:
уважающая себя анимация должна уметь начать действовать только тогда,
когда другая анимация достигнет некоторого состояния, не раньше и не позже.
в качестве критерия состояния может выступать определенное время,
определенный кадр, или определенное событие.


с точки зрения аниматора, сцена - это не просто изменяющаяся в реальном времени картинка на экране.
это - симуляция, которую можно (и нужно) программировать.

программист-аниматор в буквальном смысле расставляет различные объекты на сцене.
устанавливает всякие светильники, и объясняет каждому объекту,
что он должен делать.

и если ты решишь удалить какой нибудь важный кадр,
(да ладно чоу, всё равно никто не заметит)
по которому синхронизируются другие анимации,
то будет жопа.
0
22.10.2020, 02:20

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
и если ты решишь удалить какой нибудь важный кадр,
(да ладно чоу, всё равно никто не заметит)
по которому синхронизируются другие анимации,
то будет жопа.
Ну так синхронизирующий кадр не "удаляют вместе с лишними", а добавляют к "минимально необходимым" :)

0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
22.10.2020, 09:21
Цитата Сообщение от drit Посмотреть сообщение
У меня проблема: не могу нормально написать игровой цикл. Как это сделать?
Можно немного модифицировать ваш исходный алгоритм под произвольный таймер. Вам просто нужно обновлять last_time не снаружи нагружающей функции, а внутри неё.
C++
1
2
3
4
5
6
7
8
9
10
11
while (true)
{
    time = getTime();
 
    if (time - last_time >= interval)
    {
        last_time += interval;
 
        upadate();
    }
}
0
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
22.10.2020, 11:39  [ТС]
zayats80888,
1)
Вы удивитесь, но для скелетной анимации, например, никто не хранит заранее посчитанные матрицы и кватернионы на каждую наносекунду.
мы сейчас рассматриваем непосредственно анимацию, как способ вывести на экран последовательность из изображений/состояний. Т.е все вычисления, связанные с непосредственно отрисовкой изображения на экране мы не рассматриваем.
2)
Эти трансформации интерполируются, а это (о ужас!) куда более затратная операция, чем какое-то там деление.
эта проблема более актуальна, если у вас есть 100000 объектов, которые одновременно проигрывают свои анимации (т.е у каждого объекта своя условно независимая анимация). Тогда посчитать 1 раз операцию деления или 100000 имеет разницу.
3)
drit, почитайте. Там конечно про "физику", но это более чувствительная и нагруженная система, чем анимация.
спасибо за статью. хоть она и 2004 года) там описываются примерно те механизмы, что я описал в самом начале. но так-же там есть некоторые интересные моменты.

Ygg,
Можно немного модифицировать ваш исходный алгоритм под произвольный таймер.
немного не понял.. почему мой код не работает с произвольным таймером?
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
22.10.2020, 11:57
Цитата Сообщение от drit Посмотреть сообщение
немного не понял.. почему мой код не работает с произвольным таймером?
Работает, но как-то сложно считает интервалы. Вы же переживали, что разница между двумя вызовами таймера может оказаться равна 0. Но это же не важно, вам ведь нужно просто подождать пока разница показаний таймера не достигнет требуемого интервала обновления. Любой таймер выдающий хотя бы миллисекунды может обеспечить вам нужную частоту. А время получения показания таймера многократно меньше времени остальных просчётов и вывода анимации. Хотя, возможно, я неправильно понял вашу проблему...
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
23.10.2020, 13:12
Цитата Сообщение от drit Посмотреть сообщение
Методы, описанные выше не гарантируют вызова update хотябы примерно n раз в секунду при условии, что и в update и в render есть код.
Приведи код, примерно также нагружающий систему, как её нагружают реальные update и render. Проверим.
0
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
23.10.2020, 15:56  [ТС]
Цитата Сообщение от Zirak Посмотреть сообщение
Приведи код, примерно также нагружающий систему, как её нагружают реальные update и render. Проверим.
Я неправильно выразился... у вас получается, что update и render вызываются вместе. т.е. у вас всегда upd=fps. тогда смысла разделения этого кода кроме как для структурирования нет. Если гарантировать вызов n раз в секунду только для функции update, а render вызывать в промежутках (примерно как у меня), то можно получить большой прирост в производительности. (сама игра будет идти с одинаковой скоростью на разных компьютерах, но на слабых машинах отрисовка будет происходить реже).
+я показал, для чего мне нужна была высокая точность функции get_now(): если функции игры будут выполнятся быстро, то может возникнуть ситуация, когда стандартные библиотечные методы будут просто постоянно возвращать 0. и никакого update или render происходить не будет. Ygg предложил некоторый вариант решения проблемы, но я не совсем понял, как будет тогда выглядеть полностью написанный цикл..
Есть и обратная сторона монеты. если функция get_now() будет выполнятся долго, то мы получим жесткое ограничение на количество итераций цикла в секунду (если весь цикл будет выполняться 15 миллисекунд, то больше 64upd/fps мы не получим)
счетчик тиков процессора подходил бы идеально, если бы не парочка нюансов.
во-первых этот способ не кроссплатформенный. я читал, что этот счетчик может вовсе отсутствовать.
во-вторых во время выполнения программы, как уже было подмечено, поток может перенестись на другое ядро, где имеется свой счетчик, да еще и все эти счетчики не синхронизированы.
я нашел хабровскую статью, где описывается создание C-шной библиотеки на основе вот этого счетчика TSC. но мне ВСЯ библиотека не нужна, а то, что нужно - нужно на C++. Так вот. Помогите мне пожалуйста написать эту самую функцию get_now(), или пришлите код, удовлетворяющий моим требованиям (выше). Пожалуйста
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.10.2020, 15:56

Как засечь ровно одну секунду?
Хочу написать консольку, которая будет считать, сколько действий в секунду выполнит мой комп. Проблема: не знаю, как засечь эту...

Как реализовать функцию-член, которую можно вызвать только один единственный раз?
Доброго времени суток. Моя проблема в том, что при создании экземпляра дочернего класса, выполняется функция DoSmth() хотя, уже есть...

Определить функцию , удаляющую из списка все элементы, входящие в список ровно один раз
Здравствуйте!!!!Помогите,пожалуйста решить задачу.Трудновато с Лиспом((( 1)Определить функцию , удаляющую из списка все элементы,...

Как сделать обновление времени раз в секунду?
public function widget($args, $instance) { $title = apply_filters(&quot;widget_title&quot;, $instance); echo $args; echo...

Что нужно сделать, чтобы данную функцию можно было вызвать еще раз, не меняя ее код
Функцию add() из фрагмента кода вызвали 10 раз. Что нужно сделать, чтобы эту функцию можно было вызвать еще раз, при этом не меняя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru