XNA с временем выполнения TaskFactory при выполнении SetData для текстуры в цикле
Хотя этот вопрос касается реализации в XNA, я думаю, что он лучше подходит для более общего форума по C#. Я использую TaskFactory с XNA для инициализации дополнительных ресурсов при представлении пользователю экрана загрузки. Код похож на это:
Task.Factory.StartNew(() => DoSomeInitialStuff())
.ContinueWith((x) => BuildALevel(x.Result))
.ContinueWith((x) => DoSomeFinalizingStuff(x.Result))
.ContinueWith((x) => NotifyThatIAmFinished());
Я записал необходимое время, и мой DoSomeFinalizingStuff
метод займет больше времени, когда мое главное окно находится в фокусе. DoSomeFinalizingStuff
на самом деле пишет в 400x400 Texture2D (который не отображается в процессе, просто создан и изменен) с помощью метода SetData.
AVG Время, затраченное на фокус и видимость: ~5000 мс (время от времени до 10k+) AVG Время, затраченное на то, чтобы не быть в фокусе (и не виден): ~100 мс
Измеренное время является фактическим временем выполнения DoSomeFinalizingStuff
, В AVG разница в 50 раз, я очень любопытен, почему это так.
При запуске отладчика обеим цепочечным задачам требуется около секунды для завершения. При запуске без отладки и без взаимодействия это происходит намного медленнее, обычно экран загрузки находится в течение 10-15 секунд до его завершения.
Я могу "запустить" задачу, чтобы она выполнялась быстрее, когда я переключаю фокус с моего главного окна. Как только я переключаюсь, функция выполняется.
Если я удаляю вызовы SetData(), производительность остается такой же, как при отладке или когда я неактивен.
Почему это происходит и есть ли способ изменить это поведение?
1 ответ
Похоже, у вас есть проблема с синхронизацией.
Одна из возможных причин заключается в том, что ContinueWith
наследуется TaskScheduler
(если вы запускаете его из задачи с планировщиком, инициализированным с TaskScheduler.FromCurrentSynchronizationContext()
это тоже будет) Попробуйте позвонить вам ContinueWith
сюда: ContinueWith(...,TaskScheduler.Default)
,
Если это не так, попробуйте посмотреть "Параллельные задачи" и другие связанные с потоками окна во время отладки. Это может помочь вам определить проблему.