Можно ли вызвать мультимедийный таймер winapi из программы Unity3D без сбоев? - PullRequest
1 голос
/ 05 июня 2019

Вопрос также задавали здесь .

Я нахожусь на 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.(Конечно, если вы знаете какие-либо альтернативы, обязательно скажите их)

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