Вопрос также задавали здесь .
Я нахожусь на Windows 10, Unity Editor 2018.3.12f1
У меня есть требование очень быстрого (500 Гц) и точногообновления, «независимые» от основного потока Unity.Я нацеливаюсь только на рабочий стол Windows, поэтому Мультимедийные таймеры показались мне подходящими (единственными?).Однако я являюсь свидетелем некоторых странных сбоев.
Я попробовал эту библиотеку, которая также содержит рабочий пример, и я также создал это очень простое моно поведение, чтобы проверить его, но с такими же результатами:
using System.Threading;
using System.Runtime.InteropServices;
using System;
public class MultimediaTimer : MonoBehaviour
{
private UInt32 userCtx = 0;
void Start()
{
Run();
//Thread r = new Thread(() => Run()); -- Ignore this
//r.Start();
}
void Run()
{
MultimediaTimerCallback Callback = new MultimediaTimerCallback(TimerCallbackMethod);
uint timerId = TimeSetEvent(100, 5, Callback, ref userCtx, 1);
Thread.Sleep(1000);
TimeKillEvent(timerId);
}
private static void TimerCallbackMethod(uint id, uint msg, ref uint userCtx, uint rsv1, uint rsv2)
{
Debug.Log("Hi");
}
private delegate void MultimediaTimerCallback(UInt32 id, UInt32 msg, ref UInt32 userCtx, UInt32 rsv1, UInt32 rsv2);
[DllImport("winmm.dll", EntryPoint = "timeSetEvent")]
private static extern UInt32 TimeSetEvent(UInt32 msDelay, UInt32 msResolution, MultimediaTimerCallback callback, ref UInt32 userCtx, UInt32 eventType);
[DllImport("winmm.dll", EntryPoint = "timeKillEvent")]
private static extern UInt32 TimeKillEvent(UInt32 uTimerId);
}
Когда в редакторе, когда я нажимаю кнопку воспроизведения, мой пример игры, кажется, работает правильно (т.е. печатает в консоли отладки, и с большой точностью, когда я использовал секундомер для измерения), но когда я останавливаюигра и попробуйте запустить его снова, редактор зависает.
Когда я собираю и играю, снова все кажется нормальным (никаких отладочных сообщений, конечно, нет), но когда я пытаюсь закрыть программу через «X»кнопка опять зависает.
У меня очень простой вопрос.Можно ли надежно вызвать мультимедийный таймер из программы Unity?И если бы не кто-нибудь объяснить это поведение, которое я наблюдаю?Я мог бы инкапсулировать свою логику таймера в отдельном процессе и использовать некоторую форму IPC для достижения моих требований, но для удобства я предпочел бы остаться в стороне от Unity.(Конечно, если вы знаете какие-либо альтернативы, обязательно скажите их)