|
Xors3D Графический движок с поддержкой DirectX9 |
08.04.2012, 11:23
|
#1
|
ПроЭктировщик
Регистрация: 16.04.2008
Сообщений: 161
Написано 36 полезных сообщений (для 63 пользователей)
|
Xors3d с++ подгрузка моделей в отдельном потоке
Хотелось бы реализовать подгрузку моделей в отдельном потоке
если взять и тупо запихнуть xLoadMesh в поток то будет краш, отсюда вопрос как сделать это по уму ?
Конструкция: ненужный код опустил
#include <process.h>
void thread_update(void* pParams)
{
xLoadMesh("");
}
void main(void)
{
_beginthread(thread_update, 1, NULL );
xRenderWorld()
xUpdateWorld()
}
Краш наступает либо из за _beginthread(thread_update, 1, NULL );
либо
xRenderWorld()
xUpdateWorld()
я так понял поток не успел завершить загрузку модели как рендер и апдейт начинает работать с Entity , как решить эту проблему ?
если я правильно понял
__________________
форум эт вещь... и почему я раньше им не пользовался?
AMD Phenom(tm) II X6 3.20GHz 8GB GTX 550(1Gb)
|
(Offline)
|
|
08.04.2012, 12:13
|
#2
|
быдло
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений (для 1,489 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
никак не сделать
|
(Offline)
|
|
08.04.2012, 13:54
|
#3
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Для этого нужна поддержка на уровне движка. Сейчас ты отдаёшь движку недогруженную модель и всё падает.
__________________
|
(Offline)
|
|
08.04.2012, 14:20
|
#4
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
#include <process.h>
bool thread_update_p=false;
void thread_update(void* pParams)
{
thread_update_p = true;
xLoadMesh("");
thread_update_p = false;
}
void main(void)
{
_beginthread(thread_update, 1, NULL );
if (!thread_update_p) //Предполагается, что это происходит в цикле
{
xRenderWorld()
xUpdateWorld()
}
}
Только так.
Черезжопно.
И не нужно нафиг.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Nerd за это полезное сообщение:
|
|
08.04.2012, 14:48
|
#5
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
твой код соответствует загрузке меша в основном потоке. будет лишь небольшой оверхэд на создание потока. ДЖокер все сказал - нужна поддержка на уровне движка (хотя может она итак есть)
|
(Offline)
|
|
08.04.2012, 20:55
|
#6
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
В семпле не увидел никакого намёка на синхронизацию потоков. Собственно, про это говорит и Nerd96, но делает это некорректно (в общем случае).
См. (в содержании найдёшь нужные главы)
если хочешь изучить вопрос хорошо:
Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows/Пер. c англ – 4-е изд. – Питер, Русская Редакция. 2001. – 752 с.
если торопишься:
Шилдт Г. Искусство программирования на С++, СПб.: БХВ-Петербург , 2005 г.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
09.04.2012, 05:15
|
#7
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Что если так сделать:
1. В класс объекта добавляем поле bool bReady
2. Создаём экземпляр объекта, присваиваем ему флаг bReady = false (ну или по дефолту он уже такой)
3. Добавляем в специальный список недогруженных объектов
4. Грузим в него меш
5. Ставим bReady = true
Далее в игровом цикле
6. Пробегаем по спец.списку недогруженных, и делая там hideentity для тех кто ещё не готов (наверное тут всё и сломается из-за недогруженности меша )
а для тех кто готов делаем showentity и удаляем их из списка
Добавление/удаление в список надо синхронизировать.
|
(Offline)
|
|
11.04.2012, 21:00
|
#8
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
В итоге с вашими блокировками, в много поточности отпадает всякий смысл.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо pozitiffcat за это полезное сообщение:
|
|
12.04.2012, 18:50
|
#9
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Дело не в блокировках. Просто надо уметь распараллеливать задачи. Пример (идеализированный):
вы с другом хреначите проект. Синхронный (классический подход): он пишет кусок кода, ты тупишь. Потом он отдаёт тебе код и тупит, а ты пишешь свою часть.
Асинхронная модель (многопоточная - вы же два независимых процессора): вы пишите код одновременно (для этого надо грамотно продумать модули), первый кто заканчивает свой кусок блокируется (спит, тупит) и ждёт второго.
При синхронной модели на код уходит Ts=t1+t2 единиц времени.
При асинх. Ta=max(t1,t2).
Грузить модели можно вторым потоком, пока в первом уже идёт игра с частью прогруженного уровня. Правда, я б наверно не стал так делать. Во-первых, нет никакой необходимости в спешке: уж лучше пусть пользователь посидит подольше с загрузкой, чем ощущает лаги от второго потока в момент экшена. Во-вторых, модели надо ещё и выгружать по мере того, как они становятся ненужными: другое дело если б память была бесконечной, и в неё можно было грузить весь МИР до опупения. Скажем так: загрузка модели это всё же событие, имеющее чёткое место в игровом цикле (в отличие от той же фоновой музыки): размазывать его на второй поток - экономить крохи, запутываясь в тонкостях синхронизации.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
12.04.2012, 19:14
|
#10
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Вам не надоело обсуждать невозможное?
Русским языком сказали, что движек должен поддерживать загрузку в отдельном потоке. Потому что движек при загрузке модели в отдельном потоке не учитывает что другой поток будет использовать эту недозагруженную модель. Потому что там нет блокировок и изоляции потоков потому что её никто там не придусматривал.
И делая что то в отдельном потоке что делать нельзя вы рискуете выстрелить себе в ногу.
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
|
|
12.04.2012, 19:29
|
#11
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
эммм... блокировка - инструмент ОС, хоть и имеющий обёртку для языка, но не движка.
Наконец-то понял, про что ты: движок не имеет возможности работать в режиме: не рендерить эту модель до особого указания. Что позволило бы сразу не включать в рендер модели, загрузка которых ещё не завершена. Установить же блокировки на внутренний массив сущностей мы не можем.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
|
|
12.04.2012, 19:45
|
#12
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Если на основном потоке создать ноду и сразу спрятать, а потом в другом потоке руками грузить все (создавать сюрфейсы, добавлять вершины, бла-бла-бла), то будет работать, только надо включать многопоточность для DX, там в доках должно где-то быть как это делается, тогда создание вершинного буфера на втором потоке не завалит ничего. Но так-то да, костыль будет знатный.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Knightmare за это полезное сообщение:
|
|
12.04.2012, 19:50
|
#13
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Выражайтесь эстетичней - будет впечатляющий паллиатив
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
12.04.2012, 19:56
|
#14
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
Грузить модели можно вторым потоком, пока в первом уже идёт игра с частью прогруженного уровня.
|
смотря что понимать под загрузкой модели.
вот загрузить данные с файла и привести их к виду, удобоваримому для ГПУ это можно во втором потоке, а заливать вершинный индексный буфер надо затормозив поток рендера (при выключенном D3DCREATE_MULTITHREADED) (опять же, там могут считаться матрицы трансформации, сортироваться объекты, но рендериться ничего не должно). Либо надо заводить второй контекст и шарить ресурсы (в терминологии GL-я, а это может делать уже только двиг). Я например, в axelynx-е сделал загрузку текстур со второго потока, но загрузку сюрфейсов делать таким образом не стал (посчитал что их загрузка итак довольно быстра).
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
12.04.2012, 21:15
|
#15
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
смотря что понимать под загрузкой модели.
|
давайте ещё обсудим "что подразумевать под моделью". Разумеется, я приводил самый простой вариант: загружать модель целиком и после этого отдавать её на рендер. Грубо говоря, загрузить 10 ёлок около игрока, а затем по деревцу подгружать.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:07.
|