![]() |
|
Модераторы: Rickert |
![]()
|
|
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Проблема такая: хочу загружать каждый новый объект сцены (объекты динамически добавляются в сцену пользователем) в отдельном потоке (пока тяжелый объект загружается пользователь продолжает работу: вращает сцену и т.п., а на месте загружаемого объекта мигает надпись "загрузка"), и вот казалось бы идея реализована, но возникает исключение когда при загрузке объекта я пытаюсь тут же загружать еще один -
Как я понял новый объект загрузки (получается второй побочный поток) пытается записаться в в память выделенную для старого объекта загрузки (первый побочный поток) или просто вся видео память в данный момент заблочена. Какие будут коментарии, может есть легкий способ решения (например какой-то особый флаг загрузки объекта "MeshFlags" нужен)? И вообще какие флаги устройства и мех-объекта лучше использовать для многопоточного приложения? З.Ы. Есть у когонить хелп по DX на русском, посмотрел так еще некоторые фалги и куча дополнительных вопросов появилась: например - класс Mesh сам создает для объекта вершинный буфер, а вот индексный создает, если нет то как сделать чтоб создавал? Это сообщение отредактировал(а) EgoBrain - 28.2.2009, 06:09 |
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 6 Всего: 61 |
EgoBrain, а ты не пробовал просто разделить понятия? Вот что-то в таком духе (полупсевдокод):
Есть понимание? Добавлено через 3 минуты и 23 секунды Важное замечание: для загрузки объектов нужно не каждый раз запускать новый поток, а иметь спец. менеджер ресурсов, который внутри себя инкапсулирует 1 поток и очередь загрузки. |
|||
|
||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Моя проблема заключается в том, что я еще не умею толком с многопоточностью работать и с делегатами (чтиво есть, а вот за конкретное изучение взяться руки не доходят). Пока остановился на таком варианте: перед загрузкой модели проверяется жив ли поток, который такое дело должен выполнять, если жив то весь процесс его ждет - это уже конечно криво, но пока моих знаний хватило только на это, если не жив то грузим...
|
|||
|
||||
| arilou |
|
||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 6 Всего: 61 |
EgoBrain, я набросал для тебя пример.
Сначала идет код для асинхронной загрузки
А это пример использования. Скопируй весь код в Console project и посмотри, что оно тебе будет выводить в консоль.
В примере используются два неоптимальных подхода, но достаточных для демонстрации. 1) lock - это "тяжелая" операция, и не очень подходит для приложений, в которых важно соблюдать константный фреймрейт. большое кол-во локов на кадр заметно снизит FPS 2) в потоке, выполняеющем загрузку, если в очереди ничего нет, используется Thread.Sleep(300). это неоптимально, лучше использовать ManualResetEvent для сигнализации потоку о появлении новых задач на загрузку. Задавай вопросы, помогу разобраться. |
||||
|
|||||
| EgoBrain |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 23.3.2008 Где: Комната Репутация: 1 Всего: 2 |
Сразу вывело 200 моделей загружено. Так как должно получится на практике: нажимаю сколько хочу и появляется множество надписей "загрузка", или надписи появляются только после того, как предыдущая модель уже загружена? За помощь спасибо, и пример такой подробный, но пока что труден для восприятия.
Это сообщение отредактировал(а) EgoBrain - 3.3.2009, 03:20 |
|||
|
||||
| arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 6 Всего: 61 |
А ты попробуй в _DoLoad вставить Thread.Sleep(1000)
Ага, в теории так должно получиться. Потому что внутри AsyncLoader клон меша "Loading please wait" возвращается сразу, а загрузка ставится в очередь. Так задавай вопросы, где именно трудности? |
|||
|
||||
![]()
|
| Правила форума "Программирование игр, графики и искуственного интеллекта" | |
|
|
НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |