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

rg3d - движок на Rust'e (9 стр)

Страницы: 18 9 10 1113 Следующая »
#120
22:02, 29 янв. 2020

lookid
> composition over inheritance?
Да.

К тому же из-за жесткого контроля над временем жизни объектов не получится сделать callback hell. Соответственно лапшу из событий (как в C#) например нагородить не получится, однако это решается через сообщения - все системы (и объекты) общаются через сообщения без прямого доступа друг к другу. Это оказалось довольно удобным для создания гуи.


#121
9:06, 31 янв. 2020

mr.DIMAS
> однако это решается через сообщения - все системы (и объекты) общаются через
> сообщения без прямого доступа друг к другу.
О чем идёт речь? Только начал ковырять rust, и беглый поиск не дал ответов.

#122
9:53, 31 янв. 2020

DoomGod
> О чем идёт речь? Только начал ковырять rust, и беглый поиск не дал ответов.
Обычная очередь сообщений. Что-то типа:

enum Message {
  ValueChanged {
    sender: Index<Widget>,
    new_value: f32,
    old_value: f32
  },
  CheckedChanged {
    sender: Index<Widget>,
    new_value: bool
  }
}

...

// In the widget container
container.queue = VecDeque::new();

...

// Somewhere in widget logic
queue.push_back(Message::ValueChanged { sender: Default::default(), new_value: 123.0, old_value: 0.0 })

...
// In the message loop
while let Some(message) = container.queue.pop_front() {
  for widget in container.widgets.iter_mut() {
    widget.handle_message(&message);
  }
}

// impl Widget
fn handle_message(&mut self, message: &Message) {
  match(message) {
    // Do something
  }
}

В случае многопоточки вместо VecDeque следует использовать mpsc::channel()

#123
(Правка: 9:55) 9:55, 31 янв. 2020

Вот пример - fn handle_event(...) - https://github.com/mrDIMAS/rg3d-ui/blob/master/src/button.rs#L82

#124
14:18, 30 мар. 2020

Постепенно добавляю примеры для движка - https://github.com/mrDIMAS/rg3d/tree/master/examples

#125
23:30, 12 апр. 2020

Потихоньку пилю рендер
Изображение

#126
21:39, 17 мая 2020

Дошла очередь и до редактора, параллельно с ним улучшаю UI либу. Редактор еще на очень ранней стадии, но основные функции уже есть.
Редактор - https://github.com/mrDIMAS/rusty-editor
Изображение

#127
(Правка: 3:46) 0:33, 18 июля 2020

Чего там с движком? Что-то активность в репо в последнее время прям совсем маленькая.

А почему решил писать свою сериализацию для движка?(rg3d-core/src/visitor.rs) Чем-то Serde не устраивала или это наследие от С?

Меня тут один человек постоянно убеждал Rust попробовать, и с 3ей пробы я в нем задержался. Язык понравился, на плюсы обратно не хочу, пока. Не представляю уже как жить на плюсах без некоторых фишек раста. Хотя с borrow-checker'ом воевать пока приходится частенько)
А Cargo после плюсовых систем сборок вообще рай.
#128
16:31, 18 июля 2020

Vlad2001_MFS
> Чего там с движком? Что-то активность в репо в последнее время прям совсем
> маленькая.

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

Vlad2001_MFS
> Язык понравился, на плюсы обратно не хочу, пока. Не представляю уже как жить на
> плюсах без некоторых фишек раста
Круто, молодец.

Vlad2001_MFS
> с borrow-checker'ом воевать пока приходится частенько)
У меня где-то на 3-й месяц стало легко с ним :)

#129
16:34, 18 июля 2020

Vlad2001_MFS
> А почему решил писать свою сериализацию для движка?(rg3d-core/src/visitor.rs)
> Чем-то Serde не устраивала или это наследие от С?
Serde не устроил тем, что в нем нет нормальной поддержки сериализации Rc/Arc. К тому же мне не нужна поддержка кучи форматов сериализации, да и процедурные макросы вроде

#[derive(Serialize, Deserialize)]
struct Foo {...}
ооочень сильно замедляют компиляцию, а так как у меня уже был опыт написания сериализаторов я решил что своего простого сериализатора будет достаточно.
#130
16:39, 18 июля 2020

mr.DIMAS
> У меня где-то на 3-й месяц стало легко с ним :)
Значит месяца полтора-два у меня еще впереди)

> Serde не устроил тем, что в нем нет нормальной поддержки сериализации Rc/Arc
> ооочень сильно замедляют компиляцию
Мда, я подозревал что не может быть все так радужно. Может конечно у меня таких трудностей и не будет, но возьму на заметку. Не очень хотелось бы писать свою сериализацию.

#131
(Правка: 16:55) 16:55, 18 июля 2020

Vlad2001_MFS
> Мда, я подозревал что не может быть все так радужно.
Я об этот косяк serde споткнулся когда стал делать ресурсы. Каждый узел графа должен знать из какого источника он был создан - для этого ресурс просто оборачивается в Arc<Mutex<Model>> и этот Arc сохраняется в узел сцены. Проблема с serde в том, что каждый раз при когда он видит Arc, он заново сериализует его содержимое, то есть он не следит был ли уже подобный объект сериализован. В общем либа отличная, но мне не подошла. И я кстати не одинок в этом, некоторые чуваки и канала rust_gamedev_ru в телеге тоже натыкались на недостатки из-за которых приходилось свое писать.

#132
17:04, 18 июля 2020

mr.DIMAS
Крайне полезная информация, спасибо. Если проблему обойти не удастся нормально, то буду тогда думать над своей сериализацией, да у тебя подсматривать.

Кстати, а почему был выбран сценграф, а не тот же ECS, ведь он по идее гораздо лучше ложится на идеологию раста?

#133
17:24, 18 июля 2020

Vlad2001_MFS
Граф сцены на мой взгляд это базовая часть любого движка (хотя в движке Baldur's Gate 3 графа сцены нет, лол). Честно говоря с ECS я знаком достаточно поверхностно, а когда начинал делать движок так и вовсе только слышал что-то про ECS. Вообще мой движок более "классический" что ли, есть объекты с жестко заданной структурой и при помощи них можно создавать что-то свое, более сложное.

Насчет сложностей с borrow checker'ом - тут я со временем выработал достаточно простой подход: изменения данных делаются сверху вниз, в этом случае с borrow checker'ом проблем не возникает. Если же нужно сделать что-то сложное с привлечением систем которые недоступны в данном контексте, то я использую каналы и сообщения. Простой пример: игрок нажимает кнопку стрельбы, в это случае нужно сделать довольно много действий:
1) Создать пулю (загрузить модельку, разместить на уровне)
2) Проиграть звук
3) Создать эффект выстрела
4) Уменьшить количество патронов у оружия
5) и т.д.
Очевидно что в этом случае ты не сможешь сделать все эти действия из обработчика событий кнопки. В этом случае достаточно создать сообщение CreateBullet { params } и послать его игре. Игра же будет разгребать сообщения каждый кадр и выполнять все требуемые действия, так как у нее имеется доступ ко всем подсистемам и изменения будут происходить сверху вниз.

#134
17:37, 18 июля 2020

mr.DIMAS
> Очевидно что в этом случае ты не сможешь сделать все эти действия из
> обработчика событий кнопки. В этом случае достаточно создать сообщение
> CreateBullet { params } и послать его игре.
Да, мне уже другой человек с форума говорил присмотреться к использованию сообщений для связи систем. Только для меня это сильно новая вещь, на плюсах такого не делал никогда. Надо обдумывать.
У себя хочу попробовать сделать ECS все-таки, ибо с графом сцены мне придется помучаться на Расте вероятно.

А вообще все исходники rg3d я себе выкачал, и хожу в них смотреть как всякое сделано, буду учиться заново, так как шаблоны мышления и архитектуры из C++ тут просто не работают.

Страницы: 18 9 10 1113 Следующая »
ПрограммированиеФорумОбщее