Кроссплатформенное высокоточное время в питоне - PullRequest
2 голосов
/ 10 марта 2012

Я пишу игру, которая должна работать на нескольких платформах.Мне нужна хорошая точность времени на всех платформах.

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

После прочтения документации, time.time выглядит лучше в Linux и time.clock лучше в Windows.Я думал написать что-то вроде этого:

import os
import time
__all__ = ['hrtime']

platform = os.name
if platform == 'posix':
    hrtime = time.time
elif platform == 'nt':
    hrtime = time.clock
else:
    # 'os2', 'ce', 'java', 'riscos'
    raise ValueError("I have no idea what I'm doing.")

Но как насчет других платформ?MacOS возвращает {posix}?Как насчет cygwin, это Linux или Windows?Что такое "Се"?Должен ли я вообще заботиться об этих платформах?

Другим вариантом может быть использование времени SDL из Pygame.Похоже, что с точностью до миллисекунды на каждой платформе.Так как я использую SDL для рендеринга, я не против этого.Однако сейчас я работаю над сетевым кодом, и использование времени SDL в моем сетевом коде кажется немного странным.

Вопрос: что бы вы предпочли использовать и почему?

Ответы [ 3 ]

1 голос
/ 10 марта 2012

Поскольку вы используете Pygame, вы должны использовать функцию pygame для абстрагирования этого:

просто позвоните pygame.time.get_ticks() - он вернет микросекунды с момента вызова на pygame.init()

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

1 голос
/ 17 ноября 2017

Для лучшего измерения прошедшего времени (начиная с Python 3.3) используйте time.perf_counter.

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

1 голос
/ 10 марта 2012

Я всегда использовал это и никогда не сталкивался с какими-либо проблемами:

import sys
import time

if sys.platform == "win32":
    # on Windows, the best timer is time.clock()
    timerfunc = time.clock
else:
    # on most other platforms, the best timer is time.time()
    timerfunc = time.time

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

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

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