У меня есть игровой движок, который использовал 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 новый для использования потоков.
Все лучшее, Мартин
Резьба часто является волком в одежде овец. Он пытается решить так много проблем, но на самом деле может вызвать гораздо больше, чем они решают. К счастью, у вас есть то, что многие считают правильным сценарием для использования дополнительного потока.
Написав аналогичный загрузчик себе на некоторое время назад, ваша проблема действительно состоит в том, что вы обращаетесь к Window1, когда он используется в другом месте. В основном, ваш основной поток ничего не делает с Window1, пока поток будет работать. Если это так, это будет означать, что это проблема.
Решение, которое я нашел, состояло в том, чтобы правильно отделить хранилище данных от средства визуализации. Вы можете загружать данные в хранилище в потоке. Как только это будет сделано, передайте эту информацию в хранилище в основной поток в конце потока (или переместите его непосредственно в основной поток позже). Это позволяет избежать зависимости от вашего объекта Window1 в потоке.
Было бы неплохо продолжить чтение по темам, прежде чем приступать к более масштабному сценарию, над которым вы работаете. Работа с потоками является одной из наиболее сложных и сложных областей разработки программного обеспечения, и по опыту вы не можете их хорошо изучить.