forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Xors3d с++ подгрузка моделей в отдельном потоке (http://forum.boolean.name/showthread.php?t=16618)

Spy4433 08.04.2012 11:23

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 , как решить эту проблему ?
если я правильно понял

Dream 08.04.2012 12:13

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
никак не сделать

SBJoker 08.04.2012 13:54

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
Для этого нужна поддержка на уровне движка. Сейчас ты отдаёшь движку недогруженную модель и всё падает.

Nerd 08.04.2012 14:20

Ответ: 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()
  }
}

Только так.
Черезжопно.
И не нужно нафиг.

HolyDel 08.04.2012 14:48

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
твой код соответствует загрузке меша в основном потоке. будет лишь небольшой оверхэд на создание потока. ДЖокер все сказал - нужна поддержка на уровне движка (хотя может она итак есть)

impersonalis 08.04.2012 20:55

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
В семпле не увидел никакого намёка на синхронизацию потоков. Собственно, про это говорит и Nerd96, но делает это некорректно (в общем случае).
См. (в содержании найдёшь нужные главы)
если хочешь изучить вопрос хорошо:
Рихтер Дж. Windows для профессионалов: создание эффективных Win32 приложений с учетом специфики 64-разрядной версии Windows/Пер. c англ – 4-е изд. – Питер, Русская Редакция. 2001. – 752 с.
если торопишься:
Шилдт Г. Искусство программирования на С++, СПб.: БХВ-Петербург , 2005 г.

Жека 09.04.2012 05:15

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
Что если так сделать:
1. В класс объекта добавляем поле bool bReady
2. Создаём экземпляр объекта, присваиваем ему флаг bReady = false (ну или по дефолту он уже такой)
3. Добавляем в специальный список недогруженных объектов
4. Грузим в него меш
5. Ставим bReady = true

Далее в игровом цикле
6. Пробегаем по спец.списку недогруженных, и делая там hideentity для тех кто ещё не готов (наверное тут всё и сломается из-за недогруженности меша:()
а для тех кто готов делаем showentity и удаляем их из списка

Добавление/удаление в список надо синхронизировать.

pozitiffcat 11.04.2012 21:00

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
В итоге с вашими блокировками, в много поточности отпадает всякий смысл.

impersonalis 12.04.2012 18:50

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
Дело не в блокировках. Просто надо уметь распараллеливать задачи. Пример (идеализированный):
вы с другом хреначите проект. Синхронный (классический подход): он пишет кусок кода, ты тупишь. Потом он отдаёт тебе код и тупит, а ты пишешь свою часть.
Асинхронная модель (многопоточная - вы же два независимых процессора): вы пишите код одновременно (для этого надо грамотно продумать модули), первый кто заканчивает свой кусок блокируется (спит, тупит) и ждёт второго.
При синхронной модели на код уходит Ts=t1+t2 единиц времени.
При асинх. Ta=max(t1,t2).

Грузить модели можно вторым потоком, пока в первом уже идёт игра с частью прогруженного уровня. Правда, я б наверно не стал так делать. Во-первых, нет никакой необходимости в спешке: уж лучше пусть пользователь посидит подольше с загрузкой, чем ощущает лаги от второго потока в момент экшена. Во-вторых, модели надо ещё и выгружать по мере того, как они становятся ненужными: другое дело если б память была бесконечной, и в неё можно было грузить весь МИР до опупения. Скажем так: загрузка модели это всё же событие, имеющее чёткое место в игровом цикле (в отличие от той же фоновой музыки): размазывать его на второй поток - экономить крохи, запутываясь в тонкостях синхронизации.

SBJoker 12.04.2012 19:14

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

И делая что то в отдельном потоке что делать нельзя вы рискуете выстрелить себе в ногу.

impersonalis 12.04.2012 19:29

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
эммм... блокировка - инструмент ОС, хоть и имеющий обёртку для языка, но не движка.
Наконец-то понял, про что ты: движок не имеет возможности работать в режиме: не рендерить эту модель до особого указания. Что позволило бы сразу не включать в рендер модели, загрузка которых ещё не завершена. Установить же блокировки на внутренний массив сущностей мы не можем.

Knightmare 12.04.2012 19:45

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
Если на основном потоке создать ноду и сразу спрятать, а потом в другом потоке руками грузить все (создавать сюрфейсы, добавлять вершины, бла-бла-бла), то будет работать, только надо включать многопоточность для DX, там в доках должно где-то быть как это делается, тогда создание вершинного буфера на втором потоке не завалит ничего. Но так-то да, костыль будет знатный.

impersonalis 12.04.2012 19:50

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
Выражайтесь эстетичней - будет впечатляющий паллиатив

HolyDel 12.04.2012 19:56

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
Цитата:

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

вот загрузить данные с файла и привести их к виду, удобоваримому для ГПУ это можно во втором потоке, а заливать вершинный индексный буфер надо затормозив поток рендера (при выключенном D3DCREATE_MULTITHREADED) (опять же, там могут считаться матрицы трансформации, сортироваться объекты, но рендериться ничего не должно). Либо надо заводить второй контекст и шарить ресурсы (в терминологии GL-я, а это может делать уже только двиг). Я например, в axelynx-е сделал загрузку текстур со второго потока, но загрузку сюрфейсов делать таким образом не стал (посчитал что их загрузка итак довольно быстра).

impersonalis 12.04.2012 21:15

Ответ: Xors3d с++ подгрузка моделей в отдельном потоке
 
Цитата:

смотря что понимать под загрузкой модели.
давайте ещё обсудим "что подразумевать под моделью". Разумеется, я приводил самый простой вариант: загружать модель целиком и после этого отдавать её на рендер. Грубо говоря, загрузить 10 ёлок около игрока, а затем по деревцу подгружать.


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot