Как создать загрузчик потока в DirectX

0

У меня есть игровой движок, который использовал DirectX 9 для рендеринга. Я хотел бы иметь возможность загружать графику спрайтов, пока выполняется основное обновление и цикл рендеринга. В настоящее время в двигателе есть одно основное обновление и цикл рендеринга, поэтому любая сделанная в нем загрузка приостанавливает основной цикл во время загрузки графики.

Для этого я смотрел потоки POSIX. Я создал функцию потока и включил блокировку мьютекса, но код сработает, когда он запустился.

Вот функция потока:

void GameApp::InternalThreadEntry()
{
    pthread_mutex_lock (&mutex);

    for(int i = 0; i < MAX_NUMBER; i++)
    {
        test_loader_sprites[i].loadImage(window1,"Test_Image.tga");
    }

    has_finishd_loading = true;

    pthread_mutex_unlock (&mutex);
}

Код падает в моей функции рендеринга движков. Я уверен, что это связано с тем, что устройство directx, являющееся членом экземпляра window1, доступно для загрузки по потоку, пока основное приложение обращается к нему для рендеринга.

Не могли бы вы пролить свет на то, где я ошибаюсь. Im новый для использования потоков.

Все лучшее, Мартин

Теги:
multithreading
directx
posix

1 ответ

0

Резьба часто является волком в одежде овец. Он пытается решить так много проблем, но на самом деле может вызвать гораздо больше, чем они решают. К счастью, у вас есть то, что многие считают правильным сценарием для использования дополнительного потока.

Написав аналогичный загрузчик себе на некоторое время назад, ваша проблема действительно состоит в том, что вы обращаетесь к Window1, когда он используется в другом месте. В основном, ваш основной поток ничего не делает с Window1, пока поток будет работать. Если это так, это будет означать, что это проблема.

Решение, которое я нашел, состояло в том, чтобы правильно отделить хранилище данных от средства визуализации. Вы можете загружать данные в хранилище в потоке. Как только это будет сделано, передайте эту информацию в хранилище в основной поток в конце потока (или переместите его непосредственно в основной поток позже). Это позволяет избежать зависимости от вашего объекта Window1 в потоке.

Было бы неплохо продолжить чтение по темам, прежде чем приступать к более масштабному сценарию, над которым вы работаете. Работа с потоками является одной из наиболее сложных и сложных областей разработки программного обеспечения, и по опыту вы не можете их хорошо изучить.

  • 0
    Спасибо за совет. Мне удалось остановить его сбой. Моим пробелем был главный поток, не разделявший мьютекс. Я добавил общий мьютекс между основным потоком и потоком загрузчика. Я блокирую и разблокирую общий мьютекс в соответствующих местах, и это остановило сбой. Рендеринг и обновление все еще продолжаются, пока загружается моя графика. Небольшой успех, это чертовски много больше проверок, которые мне нужно сделать, и правильная обработка потоков, НО это начало.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню