Pull to refresh
39
0
Федор Логачев @FL3

Пользователь

Send message

Как же приятно, когда за такими вещами следит сам компилятор!


let mut text = vec![0; 256];
let mut caption = vec![0; 256];

load_string(&mut text);
load_string(&mut text);

message_box(&text, &caption);

warning: variable does not need to be mutable
 --> src/main.rs:9:9
  |
9 |     let mut caption = vec![0; 256];
  |         ^^^^^^^^^^^
  |
  = note: #[warn(unused_mut)] on by default

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

Много статичных объектов — большая проблема последнего видео. В игре всё будет разрушаемым.
Нет, я до сих пор считаю Rust лучшим выбором для того что мы делаем :)

Specs это ECS система, нацеленная на производительность и параллельность исполнения. Она используеться как ECS система в движке amethyst, жива и поддерижваема.


TinyECS это ECS система, сделанная мной от безысходности. В начале проекта я сформулировла свои желания к ECS, не нашёл их ни в одной готовой библиотеке и просто как мог реализовал всё, что хотел. Это мой первый rust опыт и сейчас реализация кажется мне крайне неудачной. Интерфейс же, наоборот, получился на удивление удобным.


Specs появился где-то в момент первого youtube-видео из статьи — то есть близко к началу проекта. И был серьёзный соблазн не пилить свой велосипед, а просто перейти на популярную чужую систему.


В этот момент передо мной было четыре варианта:


  • продолжить использовать tinyecs
  • переписать код игры под api specs и получить классную многопоточность
  • переписать и api specs и код игры
  • позаимствовать идеи из specs в tinyecs.

Я принял решение и дальше использовать tinyecs и возможно в будущем взять идеи из specs к себе с сохранением интерфейса.
Во первых, api tinyecs мне нравится сильно больше.
Во вторых, у меня были идеи на будущее tinyecs и они не совпадали с тем, куда двигался specs.
В третьих — оно работало, работает — не трогай :D


Сейчас я уверен, что поступил правильно. У меня есть большие планы на TinyECS v2, но и та самая первая версия прошла проверку временем, пережила добавление целой кучи фичей и продолжает исправно работать.

На мой взгляд для молодого языка у Rust очень даже большое сообщество :)

Self-hosted, работает на моей машине. Можно научить использовать репозитории с той же машины(в моём случае это gogs запущенный на том же сервере).

нет, я беру дефолтный raspbian и играю в minecraft pi^W тестирую OpenGL

Настоящего большого OpenGL нет, есть OpenGL ES 2.0. На моей Pi3 работает довольно таки быстро :)

для преобразование в число бы логичнее не заморачиваться с Display и parse а сделать так:


impl Into<i32> for Zero {
    fn into(self) -> i32 {
        0
    }
}

impl<T : Nat + Into<i32>> Into<i32> for Succ<T> {
    fn into(self) -> i32 {
        Into::into(T::new()) + 1
    }
}

let x : i32 = Into::into(nat);
println!("{}", x);

playpen

Succ — successor,
Nat — от natural number, бездумно взял из хаскелевого примера, о котором думал.
Смотрел, но довольно давно и не слишком внимательно.
Показалось, что фичей одинаково не хватает как для игрового гуя(хочется какую-то внешнюю вёрстку и возможности делать красивые эффекты) так и для тулзового гуя(я в основном сравнивал картинки с imgui и не особо внимательно смотрел на внутренности conrod).
так это кусок документации
Struct generator
.

в следующем абзаце:
Static generator

The static generator generates plain old bindings. You don't need to load the functions.


С ним всё хорошо, генерируются функции которые сами всё грузят как надо, автоматизация! :)

и этот самый Static generator и используется в glium.
Пока что glium'ом и рисуем.
По мне так у него хороший уровень абстракции — и от OpenGL далеко не уезжаем и некую безопасность имеем.
Всё так! действительно чем-то похоже на умные указатели, и действительно существуют только на уровне статического анализа при компиляции.
Еще эта штука с борроу-чекером классно помогает с многопоточностью (перевод) — гарантирует отсутствие data-races, а это тоже здорово :)
в безопасном расте невозможно получить и соответственно разименовать невалидный указатель
http://rurust.github.io/rust_book_ru/src/ownership.html < — вот здесь описан этот механизм защищающий указатели
entity system example — примерно вот так у нас вся игра и написана.
Рассказать планирую :)
почем всего то? посмотрите видео! мы ломаем мосты, стены, подпорки всякие.
Пол нерушим!
доделаем публичную играбельную версию — прямо в эту ветку комментариев её положу и послушаю фидбек :)
так мы пока что и не готовы крошить бетонные плиты. Для тех игровых моментов что я описал полностью хватает нашего уровня детализации — который в видео в начале поста.
unsafe позволил написать функцию с такой сигнатурой:
fn get_by_ids<'a>(data : &mut Vec, ids : &HashSet) -> Vec<&'a mut Foo>

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

а безопасная выглядела бы так:
fn get_by_ids<'a>(data : &'a mut Vec, ids : &HashSet) -> Vec<&'a mut Foo>

с такой сигнатурой, раст запретил бы мне делать data.clear() и всё было бы хорошо. И примерно такую сигнатуру можно получить безо всяких unsafe внутри.
1

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity