![]() |
Xors3d с++ подгрузка моделей в отдельном потоке
Хотелось бы реализовать подгрузку моделей в отдельном потоке
если взять и тупо запихнуть xLoadMesh в поток то будет краш, отсюда вопрос как сделать это по уму ? Конструкция: ненужный код опустил:) Код:
#include <process.h> либо xRenderWorld() xUpdateWorld() я так понял поток не успел завершить загрузку модели как рендер и апдейт начинает работать с Entity , как решить эту проблему ? если я правильно понял |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
никак не сделать
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Для этого нужна поддержка на уровне движка. Сейчас ты отдаёшь движку недогруженную модель и всё падает.
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Код:
#include <process.h> Черезжопно. И не нужно нафиг. |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
твой код соответствует загрузке меша в основном потоке. будет лишь небольшой оверхэд на создание потока. ДЖокер все сказал - нужна поддержка на уровне движка (хотя может она итак есть)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
В семпле не увидел никакого намёка на синхронизацию потоков. Собственно, про это говорит и Nerd96, но делает это некорректно (в общем случае).
См. (в содержании найдёшь нужные главы) если хочешь изучить вопрос хорошо: Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows/Пер. c англ – 4-е изд. – Питер, Русская Редакция. 2001. – 752 с. если торопишься: Шилдт Г. Искусство программирования на С++, СПб.: БХВ-Петербург , 2005 г. |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Что если так сделать:
1. В класс объекта добавляем поле bool bReady 2. Создаём экземпляр объекта, присваиваем ему флаг bReady = false (ну или по дефолту он уже такой) 3. Добавляем в специальный список недогруженных объектов 4. Грузим в него меш 5. Ставим bReady = true Далее в игровом цикле 6. Пробегаем по спец.списку недогруженных, и делая там hideentity для тех кто ещё не готов (наверное тут всё и сломается из-за недогруженности меша:() а для тех кто готов делаем showentity и удаляем их из списка Добавление/удаление в список надо синхронизировать. |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
В итоге с вашими блокировками, в много поточности отпадает всякий смысл.
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Дело не в блокировках. Просто надо уметь распараллеливать задачи. Пример (идеализированный):
вы с другом хреначите проект. Синхронный (классический подход): он пишет кусок кода, ты тупишь. Потом он отдаёт тебе код и тупит, а ты пишешь свою часть. Асинхронная модель (многопоточная - вы же два независимых процессора): вы пишите код одновременно (для этого надо грамотно продумать модули), первый кто заканчивает свой кусок блокируется (спит, тупит) и ждёт второго. При синхронной модели на код уходит Ts=t1+t2 единиц времени. При асинх. Ta=max(t1,t2). Грузить модели можно вторым потоком, пока в первом уже идёт игра с частью прогруженного уровня. Правда, я б наверно не стал так делать. Во-первых, нет никакой необходимости в спешке: уж лучше пусть пользователь посидит подольше с загрузкой, чем ощущает лаги от второго потока в момент экшена. Во-вторых, модели надо ещё и выгружать по мере того, как они становятся ненужными: другое дело если б память была бесконечной, и в неё можно было грузить весь МИР до опупения. Скажем так: загрузка модели это всё же событие, имеющее чёткое место в игровом цикле (в отличие от той же фоновой музыки): размазывать его на второй поток - экономить крохи, запутываясь в тонкостях синхронизации. |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Вам не надоело обсуждать невозможное?
Русским языком сказали, что движек должен поддерживать загрузку в отдельном потоке. Потому что движек при загрузке модели в отдельном потоке не учитывает что другой поток будет использовать эту недозагруженную модель. Потому что там нет блокировок и изоляции потоков потому что её никто там не придусматривал. И делая что то в отдельном потоке что делать нельзя вы рискуете выстрелить себе в ногу. |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
эммм...
Наконец-то понял, про что ты: движок не имеет возможности работать в режиме: не рендерить эту модель до особого указания. Что позволило бы сразу не включать в рендер модели, загрузка которых ещё не завершена. Установить же блокировки на внутренний массив сущностей мы не можем. |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Если на основном потоке создать ноду и сразу спрятать, а потом в другом потоке руками грузить все (создавать сюрфейсы, добавлять вершины, бла-бла-бла), то будет работать, только надо включать многопоточность для DX, там в доках должно где-то быть как это делается, тогда создание вершинного буфера на втором потоке не завалит ничего. Но так-то да, костыль будет знатный.
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Цитата:
вот загрузить данные с файла и привести их к виду, удобоваримому для ГПУ это можно во втором потоке, а заливать вершинный индексный буфер надо затормозив поток рендера (при выключенном D3DCREATE_MULTITHREADED) (опять же, там могут считаться матрицы трансформации, сортироваться объекты, но рендериться ничего не должно). Либо надо заводить второй контекст и шарить ресурсы (в терминологии GL-я, а это может делать уже только двиг). Я например, в axelynx-е сделал загрузку текстур со второго потока, но загрузку сюрфейсов делать таким образом не стал (посчитал что их загрузка итак довольно быстра). |
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Цитата:
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Холи имеет ввиду что тупо считать файл с диска это одно, а преобразовать его в игровую сущность - другое.
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Просто сквиду нужно добавить еще одну функцию, что-то типа xEntityProcessEnable(bool), обрабатывать внутри движка эту энтитю или нет. Как только поток загрузил модель, то ставить тру
|
Часовой пояс GMT +4, время: 19:10. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot