|
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
|
||||||
Как вызвать функцию ровно n раз в секунду?19.10.2020, 14:55. Показов 8764. Ответов 41
Метки нет (Все метки)
Здравствуйте! пишу игру на с++. нужно вызывать функцию update ровно n раз в секунду. довольно быстро написал следующий код:
P.S. если есть идеи по оптимизации, то помогите пожалуйста)
0
|
||||||
| 19.10.2020, 14:55 | |
|
Ответы с готовыми решениями:
41
Как вызвать функцию несколько раз подряд? Нужно вызвать функцию 10 раз с разными параметрами (как обратиться к val1 и val2)? |
|
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
|
||
| 21.10.2020, 15:22 | ||
|
Да и всё ещё не понятно, куда тебе такая точность. Мой вариант работает с точностью до десятков микросекунд, вариант oleg-m1973 также, но не накладывает ~60 мкс оверхеда из-за отсутствия одной лишней операции внутри цикла. Точность десятков микросекунд это в 100 раз точнее миллисекунды. Думаю, вполне можно уместить в слово "НАМНОГО".
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||
| 21.10.2020, 16:33 | |||||
|
это - какой то непонятный домысел. Добавлено через 43 минуты
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 | |
|
0
|
|
|
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
|
|
| 21.10.2020, 22:29 [ТС] | |
|
Нет, тут именно практическая необходимость. Используя стандартную библиотеку chrono я физически не смогу получить upd > 1000/15 ~= 65. А хотелось-бы это значение немного увеличить. + меня не устраивает вариант, что я приводил выше, когда вызов функции текущего времени занимает времени меньше, чем точность этой самой функции. Я хочу получить универсальный точный инструмент измерения времени. А то я читаю в документациях только про медленные неточные функции, которые еще и не везде использовать удобно.
0
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 21.10.2020, 22:51 | ||
|
Так что я реально не понимаю, что у вас за проблема, просветите.
0
|
||
|
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
|
||
| 21.10.2020, 23:05 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||||
| 21.10.2020, 23:45 | ||||||||||||||||||||||
|
ну и в чем противоречие? какое такое "то" ? приведи точную цитату, что ты там написал. ты не можешь просто взять и увеличить счетчик кадров. потому что в многозадачных системах (windows/linux) ты никак не сможешь вызывать функцию ровно n раз в секунду. это - невозможно. как у тебя язык то вообще повернулся написать слово "точнее" в отношении механизма, который может на полторы секунды лагнуть только потому, что я запустил броузер хром на машине. первое, что требуется от механизма анимации - это возможность задавать скорость смены кадров. типичная задача аниматора: есть собачка и кошечка. нужно, что бы кошечка анимировалась в 2 раза быстрее, чем собачка. как ты это обеспечишь? единственный способ - наделить анимацию характеристикой "скорость смены кадров". и да, каждая анимация каждый раз будет рассчитывать сколько кадров нужно отщёлкать. по другому такая задача не решается в принципе. кроме того, у программистов должна быть возможность синхронизировать несколько объектов по времени.
и вот что бы не возникало рассинхронизации по времени, и нужно просто передавать анимациям некоторое фиксированное dt.
оно зависит только от самого программиста, и больше ни от кого. например:
однако кошка об этом не знает. в её мире прошло столько времени, сколько сказал программист. программист может приказать кошке анимироваться в 2 раза быстрее. или может сказать, что времени прошло уже в 2 раза больше. как программист захочет - так и будет. при этом кошка будет адекватно реагировать на любые dt. она всегда будет перещёлкивать правильное кол-во кадров. поэтому, ей не страшны системные лаги. ты же борешься с ветряными мельницами. ты пытаешься найти лекарство против системных лагов. но в многозадачных операционках его не существует. лаги в таких системах - это обычное дело. анимация, работа которой напрямки зависит от равномерности квантов в многозадачной системе, будет всегда тупить и лагать точно так же, как тупят и лагают сами эти неравномерные кванты. Добавлено через 11 минут "кадр" - абстракция. не обязательно отображаемый внешне. кадр описывает состояние модели в некоторый момент времени. можно, например, запрограммировать движение каких нибудь частиц. можно избрать в качестве ед. измерения наносекунды. а потом просматривать, как изменялась модель с течением времени. при этом, в реальном мире ты можешь перещёлкивать 1 кадр в течении целой минуты. для самой модели течение времени не изменится. её локальная 1 наносекунда по прежнему будет той же самой наносекундой. можешь вообще всю модель на паузу поставить, и рассмотреть во всех деталях.
0
|
||||||||||||||||||||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||
| 22.10.2020, 00:03 | |||
|
В интерактивных приложениях(играх в частности) эти наносекунды ни кому не нужны. Там есть негласное правило: if it looks right, it is right.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 22.10.2020, 00:11 | ||||
|
она может иметь, а может и не иметь отношение к реальному времени. например: когда собачка переключится на 101 кадр, кошечка уже должна быть на 57 кадре... вплоть до грубых читов: переключаем сразу на нужный кадр, и пофигу, что мы перескочили сразу через 10-к у них в одной наносекунде может быть множество кадров. причем каждый из них нужно по честному отщелкать (нельзя резко перепрыгивать)
0
|
||||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 22.10.2020, 00:25 | ||
|
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
|
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 22.10.2020, 01:38 | ||
|
drit, почитайте. Там конечно про "физику", но это более чувствительная и нагруженная система, чем анимация.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 22.10.2020, 01:39 | ||
|
это от задачи зависит. реальность сегодняшнего дня такова, что анимация - это не просто изменяющаяся на экране картинка. зачастую это - довольно таки сложная симуляция, в рамках которой обссчитываются довольно таки сложные взаимодействия. "я хочу, что бы монетки посыпались посредине экрана. монетки постепенно уходят в альфу. как только предпоследняя монетка окажется на расстоянии 200 единиц от нижней части экрана, должна заиграть музыка, и бой барабанов. а с левой части экрана должен начать выползать медведь" (ц) ДизигнЭр суть концепции: уважающая себя анимация должна уметь начать действовать только тогда, когда другая анимация достигнет некоторого состояния, не раньше и не позже. в качестве критерия состояния может выступать определенное время, определенный кадр, или определенное событие. с точки зрения аниматора, сцена - это не просто изменяющаяся в реальном времени картинка на экране. это - симуляция, которую можно (и нужно) программировать. программист-аниматор в буквальном смысле расставляет различные объекты на сцене. устанавливает всякие светильники, и объясняет каждому объекту, что он должен делать. и если ты решишь удалить какой нибудь важный кадр, (да ладно чоу, всё равно никто не заметит) по которому синхронизируются другие анимации, то будет жопа.
0
|
||
| 22.10.2020, 02:20 | |
|
0
|
|
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
|
|||||||
| 22.10.2020, 09:21 | |||||||
0
|
|||||||
|
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
|
|||||
| 22.10.2020, 11:39 [ТС] | |||||
|
zayats80888,
1)
2)
3)
Ygg,
0
|
|||||
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
|
||
| 22.10.2020, 11:57 | ||
|
0
|
||
|
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
|
||
| 23.10.2020, 13:12 | ||
|
0
|
||
|
4 / 3 / 1
Регистрация: 09.12.2019
Сообщений: 84
|
||
| 23.10.2020, 15:56 [ТС] | ||
|
+я показал, для чего мне нужна была высокая точность функции get_now(): если функции игры будут выполнятся быстро, то может возникнуть ситуация, когда стандартные библиотечные методы будут просто постоянно возвращать 0. и никакого update или render происходить не будет. Ygg предложил некоторый вариант решения проблемы, но я не совсем понял, как будет тогда выглядеть полностью написанный цикл.. Есть и обратная сторона монеты. если функция get_now() будет выполнятся долго, то мы получим жесткое ограничение на количество итераций цикла в секунду (если весь цикл будет выполняться 15 миллисекунд, то больше 64upd/fps мы не получим) счетчик тиков процессора подходил бы идеально, если бы не парочка нюансов. во-первых этот способ не кроссплатформенный. я читал, что этот счетчик может вовсе отсутствовать. во-вторых во время выполнения программы, как уже было подмечено, поток может перенестись на другое ядро, где имеется свой счетчик, да еще и все эти счетчики не синхронизированы. я нашел хабровскую статью, где описывается создание C-шной библиотеки на основе вот этого счетчика TSC. но мне ВСЯ библиотека не нужна, а то, что нужно - нужно на C++. Так вот. Помогите мне пожалуйста написать эту самую функцию get_now(), или пришлите код, удовлетворяющий моим требованиям (выше). Пожалуйста
0
|
||
| 23.10.2020, 15:56 | |
|
Определить функцию , удаляющую из списка все элементы, входящие в список ровно один раз
Что нужно сделать, чтобы данную функцию можно было вызвать еще раз, не меняя ее код Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оказывается, 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,. . .
|