天天看點

【Rust日報】2020-08-13 關于群集(Bevy)引擎ECS架構中system的文法糖是怎麼實作的

Learn Wgpu 系列簡化了之前Instancing的教程

作者表示之前的Instancing部分寫的太過繁雜,作者喜歡展示各種不同的技術導緻之前該章節與之前的章節相比顯得脫節,這次更新簡化了該教程。

教程位址:https://sotrh.github.io/learn-wgpu/beginner/tutorial7-instancing/#instancing

關于群集(Bevy)引擎ECS架構中system的文法糖是怎麼實作的

群集(Bevy)引擎中的system就是普通的Rust函數,這樣的設計及其符合人體工程學,就像作者本人在群集(Bevy)引擎的介紹中說的那樣,目前找不到比群集引擎更符合人體工程學的ECS架構設計了。

推特上有人簡單分析了一下群集引擎中這部分代碼的文法糖是怎麼實作的,考慮到不少小夥伴并不能夠随時通路推特,在這裡我把大概意思搬運過來。

system作為普通的Rust函數,它的參數也就代表了需要通路的那些元件的查詢。群集提供的主要示例非常引人注目,系統就是函數,元件就是結構體,你不需要實作額外的trait,就能夠讓ECS架構正常運作。

use bevy::prelude::*;

struct Velocity(f32);
struct Position(f32);
// setup這個函數就是一個系統
// 這個系統把由Postion和Velocity元件建構的實體spawn到了commands緩沖區内
fn setup(mut commands:Commands) {
    commands
      .spawn((Position(0.0),Velocity(1.0),))
      .spawn((Position(1.0),Velocity(2.0),));
}
// 該系統的參數就是我們要查詢的元件構成的實體
fn movement(position:Mut<Position>,velocity:&Velocity) {
    position.0 += velocity.0;
}
// 這是應用的入口,希望你把上面寫好的系統注冊到要運作的App中
fn main() {
    App::build()
      .add_startup_system(setup.system())
      .add_system(movement.system())
      .run();
}
           

複制

就像上面的示例一樣,隻要按照一定的規則寫出函數,在App的構模組化式中調用

.system()

方法就可以把函數變成系統。

一個普通的Rust函數在調用

.system()

這個方法之後,将被轉換為一個

Box<dyn System>

,對于群集支援的兩種系統,采用

IntoForEachSystem

IntoQuerySystem

這兩個trait進行轉換。

// 具體代碼可以去群集的文檔裡看,這裡隻舉例了IntoQuerySystem這個trait

pub trait IntoQuerySystem<Commands,R,Q> {
    fn system(self) -> Box<dyn System>;
}
           

複制

有了trait之後隻需要把trait實作給我們可能會調用的函數,一個一個函數的去實作肯定是不可能的,翻看群集的這部分源碼能夠看到大量的使用了宏:

具體的代碼可以去看群集的源碼,總結來說,群集實作的這種及其符合人體工程學的ECS架構,就是基于宏加上trait來實作的。宏的部分十分值得仔細研究,推特原文作者也是正在研究其中的東西,截至日報更新時還沒有新的成果,後續可以直接去關注該條推特。

推文連結:https://twitter.com/yaahc_/status/1293567953875505152?s=20

Rust寫資料可視化的一個小教程

該文用到了

plotly

庫,是一個可以動手實驗的小教程。

教程原文:https://shahinrostami.com/posts/programming/rust-notebooks/box-plots-at-the-olympics/

OrbTk

0.3.1-alpha3釋出了

之前關注過Redox的應該知道OrbTk是他們團隊給該作業系統設計的Gui庫,現在這個庫在crates.io釋出了最新的版本,相較于之前性能更好了,也有了新的主題切換引擎可以選擇。還更新了三種UI元件(ProgressBar,NumericBox,TabWidget)。

Read More:https://github.com/redox-os/orbtk/releases/tag/0.3.1-alpha3

“Rust沒有穩定的ABI”

作者見過GNOME的使用者(通常是在C庫上工作了很長時間的人)表達以下問題:

  1. 編譯的Rust代碼沒有穩定的ABI(應用程式二進制接口)。
  2. 是以,我們不能使用傳統的Linux發行版共享庫。
  3. 同時,Rust還将其整個标準庫與它所編譯的每個二進制檔案捆綁在一起,這使得Rust建構的庫非常龐大。

作者是那種認為大部分基礎設施都應該用Rust重寫的人,是以這些問題,也是作者本人非常關注的事。

是以作者寫了一篇關于這個問題文章。

Read More:https://people.gnome.org/~federico/blog/rust-stable-abi.html

docs.rs 已經更新了文檔覆寫功能

docs.rs更新了文檔覆寫功能

關于建構者模式的一個簡短介紹

一個關于建構者模式的簡短介紹。

以及提供了三個實際項目中的用例。

Read More:https://matklad.github.io/2020/08/12/who-builds-the-builder.html

This Week in Rust

每周官方都會更新的This Week in Rust又更新了。

這已經是第351期了。

基本上最近有關Rust的動向裡面都收集了,個人一直比較關注的是Tooling類的動向吧,rust-analyzer越來越好用了。

其他動向日報基本都涉及過了,這裡不再提及,主要說兩個,一個是每月都會更新一次的Rust GameDev,以及最近才更新的區塊鍊相關動向。

感興趣的可以直接下面的連結到文章。

Rust GameDev:https://rust-gamedev.github.io/posts/newsletter-012/

Blockchain:https://rustinblockchain.org/newsletters/2020-08-05-are-we-smart-contract-yet/

Read More:https://this-week-in-rust.org/blog/2020/08/11/this-week-in-rust-351/

From 日報小組 Downtime Jancd

社群學習交流平台訂閱:

  • Rust.cc 論壇: 支援 rss
  • 微信公衆号:Rust 語言學習交流