Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Xors3D

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 08.04.2012, 11:23   #1
Spy4433
ПроЭктировщик
 
Аватар для Spy4433
 
Регистрация: 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
Dream
быдло
 
Регистрация: 05.08.2007
Сообщений: 1,435
Написано 614 полезных сообщений
(для 1,489 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

никак не сделать
(Offline)
 
Ответить с цитированием
Старый 08.04.2012, 13:54   #3
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

Для этого нужна поддержка на уровне движка. Сейчас ты отдаёшь движку недогруженную модель и всё падает.
__________________
(Offline)
 
Ответить с цитированием
Старый 08.04.2012, 14:20   #4
Nerd
Чудо-кот
 
Аватар для Nerd
 
Регистрация: 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 за это полезное сообщение:
impersonalis (08.04.2012), St_AnGer (08.04.2012)
Старый 08.04.2012, 14:48   #5
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

твой код соответствует загрузке меша в основном потоке. будет лишь небольшой оверхэд на создание потока. ДЖокер все сказал - нужна поддержка на уровне движка (хотя может она итак есть)
(Offline)
 
Ответить с цитированием
Старый 08.04.2012, 20:55   #6
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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 за это полезное сообщение:
HolyDel (08.04.2012), Spy4433 (08.04.2012), St_AnGer (08.04.2012)
Старый 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
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

В итоге с вашими блокировками, в много поточности отпадает всякий смысл.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо pozitiffcat за это полезное сообщение:
HolyDel (11.04.2012), St_AnGer (11.04.2012)
Старый 12.04.2012, 18:50   #9
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

Вам не надоело обсуждать невозможное?
Русским языком сказали, что движек должен поддерживать загрузку в отдельном потоке. Потому что движек при загрузке модели в отдельном потоке не учитывает что другой поток будет использовать эту недозагруженную модель. Потому что там нет блокировок и изоляции потоков потому что её никто там не придусматривал.

И делая что то в отдельном потоке что делать нельзя вы рискуете выстрелить себе в ногу.
__________________
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо SBJoker за это полезное сообщение:
impersonalis (12.04.2012), St_AnGer (12.04.2012)
Старый 12.04.2012, 19:29   #11
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

эммм... блокировка - инструмент ОС, хоть и имеющий обёртку для языка, но не движка.
Наконец-то понял, про что ты: движок не имеет возможности работать в режиме: не рендерить эту модель до особого указания. Что позволило бы сразу не включать в рендер модели, загрузка которых ещё не завершена. Установить же блокировки на внутренний массив сущностей мы не можем.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Эти 3 пользователя(ей) сказали Спасибо impersonalis за это полезное сообщение:
pozitiffcat (15.04.2012), SBJoker (12.04.2012), St_AnGer (12.04.2012)
Старый 12.04.2012, 19:45   #12
Knightmare
Дэвелопер
 
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений
(для 2,920 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

Если на основном потоке создать ноду и сразу спрятать, а потом в другом потоке руками грузить все (создавать сюрфейсы, добавлять вершины, бла-бла-бла), то будет работать, только надо включать многопоточность для DX, там в доках должно где-то быть как это делается, тогда создание вершинного буфера на втором потоке не завалит ничего. Но так-то да, костыль будет знатный.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Knightmare за это полезное сообщение:
impersonalis (12.04.2012), pozitiffcat (15.04.2012)
Старый 12.04.2012, 19:50   #13
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

Выражайтесь эстетичней - будет впечатляющий паллиатив
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Старый 12.04.2012, 19:56   #14
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

Грузить модели можно вторым потоком, пока в первом уже идёт игра с частью прогруженного уровня.
смотря что понимать под загрузкой модели.

вот загрузить данные с файла и привести их к виду, удобоваримому для ГПУ это можно во втором потоке, а заливать вершинный индексный буфер надо затормозив поток рендера (при выключенном D3DCREATE_MULTITHREADED) (опять же, там могут считаться матрицы трансформации, сортироваться объекты, но рендериться ничего не должно). Либо надо заводить второй контекст и шарить ресурсы (в терминологии GL-я, а это может делать уже только двиг). Я например, в axelynx-е сделал загрузку текстур со второго потока, но загрузку сюрфейсов делать таким образом не стал (посчитал что их загрузка итак довольно быстра).
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
SBJoker (12.04.2012), St_AnGer (12.04.2012)
Старый 12.04.2012, 21:15   #15
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений
(для 20,935 пользователей)
Ответ: Xors3d с++ подгрузка моделей в отдельном потоке

смотря что понимать под загрузкой модели.
давайте ещё обсудим "что подразумевать под моделью". Разумеется, я приводил самый простой вариант: загружать модель целиком и после этого отдавать её на рендер. Грубо говоря, загрузить 10 ёлок около игрока, а затем по деревцу подгружать.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 16:52.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com