LINUX.ORG.RU

Измерение времени(до миллисекунд)


0

1

Сейчас у меня анимация сделана так что каждый кадр какая то характеристика увеличивается на какое то число.

void Widget::update(){
    something.x += 10;
}

Проблема в том что ФПС не стабильный(например если растягивать окно ФПС будет несколько сотен.) По этому более правильным решением будет в каждый кадр смотреть сколько времени прошло и в зависимости от этого менять координаты. Вопрос в том каким именно способом мерить время?


1.

DESCRIPTION The clock() function returns an approximation of processor time used by the program.

RETURN VALUE The value returned is the CPU time used so far as a clock_t; to get the number of seconds used, divide by CLOCKS_PER_SEC. If the processor time used is not available or its value cannot be represented, the function returns the value (clock_t) -1.

(это glibc)

2. http://en.wikipedia.org/wiki/Time_Stamp_Counter

emulek
()

По этому более правильным решением будет в каждый кадр смотреть сколько времени прошло

Внезапно!

каким именно способом мерить время?

Таймером. В большинстве вспомогательных либ они реализованы.

buddhist ★★★★★
()
Последнее исправление: buddhist (всего исправлений: 1)
Ответ на: комментарий от buddhist

Таймером. В большинстве вспомогательных либ они реализованы.

КАК БЛ**Ь это можно таймером померить??!

knotri
() автор топика

QueryPerfomanceFrequency+QueryPerfomanceCounter

kike
()
int prev_time = my_get_time();
const double speed = 10; // pixels per millisecond;

while(true) { // Widget::update() {
    int passed_msecs = my_get_time() - prev_time;
    prev_time = my_get_time();
    if(passed_msecs > 0) { // Чтобы не делать пустой работы.
        something.x += speed * passed_msecs / 1000.0;
    }
}

В Qt для счётчика текущего времени подойдёт встроенный QTime. У него ещё есть няшный метод restart().

E ★★★
()
Ответ на: комментарий от E

Та это понятно, я спрашивал каким способом лучше мерить время(ну например время в системе может быть переведено). Я уже нашел ответ. Всем спасибо.

knotri
() автор топика
Ответ на: комментарий от emulek

у тебя есть какое-то другое время?

Есть существенная разница между CPU time и Wall time. clock() позволяет узнать время, затраченное процессом. Если программа занимает не 100% процессорного времени (иногда спит, например), то показания clock() не будут соответствовать тому, что ты ожидаешь.

$ cat q.c
#include <stdio.h>
#include <unistd.h>
#include <time.h>

int
main(void)
{
	while (1) {
		printf("%lu\n", clock());
		sleep(1);
	}
	return 0;
}
$ gcc q.c
$ ./a.out 
0
0
0
0
0
0
0
0
0
0
0
0
0
0

Сакральные знания из man'ов не заменяют опыт. Ты опять сел в лужу.

i-rinat ★★★★★
()
Ответ на: комментарий от emulek

у тебя есть какое-то другое время?

man clock_gettime

Sorcerer ★★★★★
()

Решение такое

update(){
float d = 1;
int mc = ktime.microsec(0);
something.x = d*mc/1000000/0.0166666666667;
ktime.start(0);
}

d это дистанция которую объект должен пройти за 1/60 секунды.

knotri
() автор топика
Ответ на: комментарий от i-rinat

Сакральные знания из man'ов не заменяют опыт.

мне clock(3) вполне хватает, да.

Ты опять сел в лужу.

действительно, для sleep(1) это «не подходит». Хотя лично мне кажется результат 0 — вполне логичным.

Ну и есть жеж у меня вариант и с rdtsс, раз уж для тебя почему-то clock(3) не годно

emulek
()

Если это опять Qt то поздравляю, вот ты и нашёл для чего нужен Qt Animation Framework который интерполирует значения на которое должна измениться картинка со времени последнего обновления. Ты можешь сделать это и сам. Если это Qt, воспользуйся QElapsedTimer'ом. Если нет, то переменной куда будешь записывать таймштамп обновления. При обновление сравниваешь текущее время с таймштампом последнего, вычисляешь время прошедшее со времени последнего обновления и на основании этого вводишь коррекцию в изменения которые должны произойти с картинкой. Всё.

KblCb ★★★★★
()
Ответ на: комментарий от knotri

Ок. Это был тред не читай @ сразу отвечай, да.

KblCb ★★★★★
()
Ответ на: комментарий от i-rinat

А почему не CLOCK_MONOTONIC? Обновление времени может дать неприятный глюк.

Уже не помню почему именно так. Сейчас посмотрел в код движка, там у меня несколько сложнее сделано и платформозависимо - для винды QPF(), для линукса clock_gettime(CLOCK_REALTIME) или gettimeofday(), для остальных платформ только gettimeofday().

andreyu ★★★★★
()
Ответ на: комментарий от i-rinat

Наверное вообще стоило бы использовать CLOCK_MONOTONIC_RAW, поскольку оно не зависит от NTP.

andreyu ★★★★★
()

boost::chrono еще не предлагали?

mike666
()
Ответ на: комментарий от kostik1
The SDL_gfx library evolved out of the SDL_gfxPrimitives code which
provided basic drawing routines such as lines, circles or polygons and
SDL_rotozoom which implemented a interpolating rotozoomer for SDL
surfaces.

The current components of the SDL_gfx library are:

    Graphic Primitives (SDL_gfxPrimitves.h)
    Rotozoomer (SDL_rotozoom.h)
    Framerate control (SDL_framerate.h)
    MMX image filters (SDL_imageFilter.h) 

Я не понимаю, прежде чем спорить п(р)оверить никак нельзя? vonenij (10.02.2014 17:08:47)

vonenij
()

А почему не сделать перерисовку независимой от анимации?

deterok ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.