WedX - журнал о программировании и компьютерных науках

Почему мои методы Draw() и Update() не вызываются?

У меня есть приложение XNA, которое никогда не вызывает Draw()update() ни разу не вызывается). Он многопоточный. В частности, он содержит набор объектов, каждый из которых вызывает свою собственную функцию рисования.

Функция рисования выглядит следующим образом:

    spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend);

    foreach (Interaction<InteractionState> interaction in interactions){
        interaction.display(spriteBatch); //this calls the SpriteBatch Draw function
    }

    spriteBatch.End();

Взаимодействия — это объекты, которые обновляются пользовательским устройством ввода, работающим в отдельном потоке.

Когда у меня есть только одно или два из этих взаимодействий, все работает довольно быстро, но когда я начинаю ставить 3 или более, рисование останавливается. Поскольку он работает с двумя взаимодействиями, я убежден, что проблема не в чем-то вроде избыточных вызовов загрузки контента или ошибки в вызове spritebatch.begin/end дважды.

Мое предположение состоит в том, что прямо сейчас увеличение количества входных источников увеличило вычислительную нагрузку на этот поток до такой степени, что у него никогда не будет возможности вызвать Draw. Как я могу заставить игру рисовать и иметь приоритет над другим потоком? Я попытался установить скорость

this.TargetElapsedTime = TimeSpan.FromSeconds(1.0f / 10.0f);

и никакого бездействия:

this.InactiveSleepTime = TimeSpan.Zero;

Оба в Initialize(), и ни один не сделал свое дело.

Редактировать: люди, кажется, сбиты с толку (я, вероятно, не совсем правильно выразился), но я ТОЛЬКО пытаюсь привлечь внимание к основной теме. Я НЕ пытаюсь рисовать в фоновом потоке. Основной метод рисования никогда не вызывается.

Редактировать 2: я также могу сказать, что если я заставлю свой фоновый поток спать на 150 мс за раз, система начнет рисовать. Однако для моих целей это слишком низкая частота кадров.

27.07.2015

  • Я почти уверен, что рисование не может быть выполнено с несколькими потоками. 27.07.2015
  • Что ты имеешь в виду? Вы имеете в виду, что рисование не может быть выполнено в двух отдельных потоках? Я отмечаю, что я НЕ пытаюсь рисовать в нескольких потоках, я рисую только в одном потоке с запущенным фоновым потоком. Есть ли причина, по которой фоновый поток будет мешать рисованию? 27.07.2015
  • Рисование в XNA не является потокобезопасным. Вы не можете рисовать ничего, кроме основной нити. 27.07.2015
  • Я рисую ТОЛЬКО в основной теме. 27.07.2015

Ответы:


1

SpriteBatch.End - это то, что на самом деле вызывает отрисовку. Все остальное просто помещает контент в очередь для рендеринга (IIRC). Я предполагаю, что происходит то, что вы не используете потокобезопасные структуры данных между своими потоками. Я понимаю, что вы вызываете SpriteBatch.End только в одном потоке, и никакие другие потоки не имеют SpriteBatch, но если вы, скажем, обновляете позицию Sprite в другом потоке во время выполнения End, вы можете аннулировать вызов рендеринга. Вы проверили окно вывода в Visual Studio? Он может предоставить некоторую подробную информацию об отладке. Обычно при многопоточности у вас будет что-то вроде AccessViolationException, когда произойдет то, что я описал. Может быть, ваша система просто ест исключение? Я не знаю. Я бы сказал, что нам нужно посмотреть, какой код выполняется в этих других потоках, чтобы лучше определить, что может быть причиной проблемы.

27.07.2015
  • Спасибо за ответ. Проблема в том, что SpriteBatch.End никогда не вызывается, потому что сама функция Draw() моей игры вообще никогда не используется (а SpriteBatch.End находится внутри Draw). Например, оператор печати/точка останова в самом начале метода, и ни один из них не срабатывает. Таким образом, нет ни одного вызова SpriteBatch.End. Мне интересно, почему Draw никогда не может быть вызван. 27.07.2015
  • Затем вам придется опубликовать еще немного кода, чтобы правильно отладить это. В идеале весь метод рисования, о котором вы говорите, а также многопоточный код, чтобы мы могли правильно диагностировать ситуацию. 27.07.2015
  • Я могу дать код отрисовки, но я не могу дать вам весь многопоточный код, если вы не хотите, чтобы я разместил здесь 4000 строк (но, если серьезно, мне не разрешили бы опубликовать весь этот код, даже если бы это было возможно) . Но я скоро опубликую метод рисования. 27.07.2015
  • Как этот адрес и обновление никогда не вызывается ни разу - OP. Рисование и обновление не связаны 30.07.2015
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]