Войти
ПрограммированиеФорумОбщее

Разделение ресурсов при многопоточности

Страницы: 1 2 3 Следующая »
#0
19:11, 10 июля 2019

Есть логическая часть игры, которой не требуется графика, которая полностью самодостаточна и которая обрабатывается в основном потоке. Допустим это класс World с методом tick(). Однако, есть графические ресурсы, например, такие как меши, которые также требуются классу World, например, если там есть физика или чтобы просто посчитать bound box'ы объектов. Но ведь правильно, если графические ресурсы будут жить где-нибудь в классе Scene, который вообще обрабатывается в графическом потоке. Как это разруливается? Нельзя же на ресурсы вешать мютексты.


#1
19:30, 10 июля 2019

BingoBongo

смотри UE

#2
19:38, 10 июля 2019

innuendo
Долго, хочу послушать кого-нить умного или прочесть о готовом решении.

#3
19:42, 10 июля 2019

геометрия объектов хранится отдельно от графики.

#4
19:48, 10 июля 2019

gamedevfor
Это неточное решение. Исходный ресурс - это меш. Он грузится один раз. Геометрию все равно надо как-то из него достать. Можно наоборот - загрузить геометрию, а потом на основе геометрии собрать меш, но это больше похоже на хак.

#5
20:53, 10 июля 2019

BingoBongo

class Mesh {
    public:
        /*  Mesh Data  */
        vector<Vertex> vertices;
        vector<unsigned int> indices;
        vector<Texture> textures;
        /*  Functions  */
        Mesh(vector<Vertex> vertices, vector<unsigned int> indices, vector<Texture> textures);
        void Draw(Shader shader);
    private:
        /*  Render data  */
        unsigned int VAO, VBO, EBO;
        /*  Functions    */
        void setupMesh();
};

Как видишь мухи отдельно, котлеты отдельно.

#6
21:45, 10 июля 2019

gamedevfor
> меш рисует сам себя
Ну так никто не делает. Я согласен, что должны быть точки синхронизации. Матрицы отдать/обновить на видяхе и прочее. Меш вообще зачем в памяти, если он уже на видяхе или в физ-движке.

#7
23:09, 10 июля 2019

lookid
Это упрощенный пример того что геометрия отдельно от графики, конечно рисовалку ты можешь вообще убрать из класса в отдельную графическую библиотеку.

#8
(Правка: 4:03) 2:19, 11 июля 2019

gamedevfor
> Как видишь мухи отдельно, котлеты отдельно.
нет не вижу, надо как-то так:

struct t_mesh_data{vector<t_vertex> VA;vector<U32> IA;t_payload payload;};
struct t_mesh_at_gpgpu{
  ref<t_mesh_data> data;
  vector<Texture> textures;
  U32 VAO,VBO,EBO;
};
struct t_renderer{/*...*/};
struct t_game{
  ref<t_renderer> dev;
  void draw(t_mesh_at_gpgpu&ref,t_shader shader){use(shader);draw(ref);}
  void draw(t_mesh_at_gpgpu&ref){/*...*/}
  void deploy_to_gpgpu(t_mesh_at_gpgpu&out,const t_mesh_data&inp){/*...*/}
};
#9
3:08, 11 июля 2019

BingoBongo
У меня все ресурсы в движке объявлены глобально, где надо, там и использую, где надо, там ставлю мютексы.
Потому что как минимум ресурсы грузятся и удаляются в одном потоке, а выводятся в других (графика, звук).
Я вообще не вижу смысла пихать их в какой-то общий класс, может быть кому-то это и удобно, но у меня так :)
В скором будущем добавлю физику, а это ещё один поток, тем более не вижу смысла пихать всё в какой-то класс, принадлежащий одному потоку!

#10
(Правка: 8:27) 8:17, 11 июля 2019

BingoBongo
> в основном потоке
> в графическом потоке
что, опять? раньше хоть каждые полгода этот тред создавали, теперь — каждый месяц? каждый раз одно и то же. приходит деятель, спрашивает, как ему кажется здорово логику и рендер в двух потоках крутить. приходят другие деятели, которые это даже реализовали и рассказывают, как у них это всё здорово не работает. кто-то неизбежно вспоминает про ECS и говорит, что распараллеливать нужно на уровне систем, а не на уровне тредов. потом обычно обсуждение уходит в сторону на несколько страниц, потому что большинство собравшихся опять не понимают, зачем может понадобиться распараллеливать CPU часть рендера, если рендерится геометрия всё равно на видюхе. параллельно с этим обсуждением примерно в тред врывается job-system палладин и пытается всем объяснить, почему именно они ничего не понимают в многопоточности. как известно, где один job-system палладин, там и второй, где второй, там и целая секта, где палладины собираются в кружочек и начинают массовый онанизм по поводу того, должны ли уметь таски порождать другие таски, дадут ссылку на презентацию убисофта и крайтека, потом проскочет пару анекдотов про while(true) { fork(); }, кто-нибудь ещё раз спросит, зачем нужно распараллеливать рендер, и спустя ещё пару десятков страниц тред, наконец, заглохнет, пока через месяц не создадут новый, точно такой же.

#11
(Правка: 8:52) 8:43, 11 июля 2019

Suslik
Ну у меня по крайней мере первый вариант работает :) наберусь опыта, распараллелю уже на уровне систем )))
Кстати! А есть, где почитать на эту тему на русском?

#12
11:09, 11 июля 2019

Suslik
Лолшто? Ты кроме статичных сцен ничего не рисуешь?

#13
11:20, 11 июля 2019

BingoBongo
> Ты кроме статичных сцен ничего не рисуешь?
а что такое статичная сцена?

#14
11:32, 11 июля 2019

u960
Сцена, для которой не требуется обновлять данные, хранящиеся в видеопамяти.

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее