| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Программирование игр, графики и искусственного интеллекта > Загрузка объекта в отдельном потоке |
| Автор: EgoBrain 28.2.2009, 05:23 | ||
Проблема такая: хочу загружать каждый новый объект сцены (объекты динамически добавляются в сцену пользователем) в отдельном потоке (пока тяжелый объект загружается пользователь продолжает работу: вращает сцену и т.п., а на месте загружаемого объекта мигает надпись "загрузка"), и вот казалось бы идея реализована, но возникает исключение когда при загрузке объекта я пытаюсь тут же загружать еще один -
Как я понял новый объект загрузки (получается второй побочный поток) пытается записаться в в память выделенную для старого объекта загрузки (первый побочный поток) или просто вся видео память в данный момент заблочена. Какие будут коментарии, может есть легкий способ решения (например какой-то особый флаг загрузки объекта "MeshFlags" нужен)? И вообще какие флаги устройства и мех-объекта лучше использовать для многопоточного приложения? З.Ы. Есть у когонить хелп по DX на русском, посмотрел так еще некоторые фалги и куча дополнительных вопросов появилась: например - класс Mesh сам создает для объекта вершинный буфер, а вот индексный создает, если нет то как сделать чтоб создавал? |
| Автор: arilou 2.3.2009, 02:47 | ||
EgoBrain, а ты не пробовал просто разделить понятия? Вот что-то в таком духе (полупсевдокод):
Есть понимание? Добавлено через 3 минуты и 23 секунды Важное замечание: для загрузки объектов нужно не каждый раз запускать новый поток, а иметь спец. менеджер ресурсов, который внутри себя инкапсулирует 1 поток и очередь загрузки. |
| Автор: EgoBrain 2.3.2009, 03:42 |
| Моя проблема заключается в том, что я еще не умею толком с многопоточностью работать и с делегатами (чтиво есть, а вот за конкретное изучение взяться руки не доходят). Пока остановился на таком варианте: перед загрузкой модели проверяется жив ли поток, который такое дело должен выполнять, если жив то весь процесс его ждет - это уже конечно криво, но пока моих знаний хватило только на это, если не жив то грузим... |
| Автор: arilou 2.3.2009, 15:21 | ||||
| EgoBrain, я набросал для тебя пример. Сначала идет код для асинхронной загрузки
А это пример использования. Скопируй весь код в Console project и посмотри, что оно тебе будет выводить в консоль.
В примере используются два неоптимальных подхода, но достаточных для демонстрации. 1) lock - это "тяжелая" операция, и не очень подходит для приложений, в которых важно соблюдать константный фреймрейт. большое кол-во локов на кадр заметно снизит FPS 2) в потоке, выполняеющем загрузку, если в очереди ничего нет, используется Thread.Sleep(300). это неоптимально, лучше использовать ManualResetEvent для сигнализации потоку о появлении новых задач на загрузку. Задавай вопросы, помогу разобраться. |
| Автор: EgoBrain 3.3.2009, 03:19 |
| Сразу вывело 200 моделей загружено. Так как должно получится на практике: нажимаю сколько хочу и появляется множество надписей "загрузка", или надписи появляются только после того, как предыдущая модель уже загружена? За помощь спасибо, и пример такой подробный, но пока что труден для восприятия. |