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),

Если это не так, попробуйте посмотреть "Параллельные задачи" и другие связанные с потоками окна во время отладки. Это может помочь вам определить проблему.

Другие вопросы по тегам