打造 6,000 FPS Game Boy 模擬器:CppCon 2026 效能工程議程
CppCon 2026 · 2026-08-20
講者 Tom Tesch(Howest DAE 講師)將於 CppCon 2026(9 月 16 日,美國 Aurora)發表議程《In Pursuit of a 6,000 FPS Game Boy Emulator》,目標是把一台 Game Boy 模擬器推到約 6,000 FPS 執行 Tetris,相當於原生硬體的百倍速度。
原本的問題
一般模擬器為求相容性,會把指令解碼、記憶體存取與各種卡帶類型都做成通用路徑,這種泛用設計在追求極限吞吐量時,容易被指令 dispatch 的分支預測失準與生成程式碼過大拖垮 cache 命中率兩個因素卡住。Tesch 的議程摘要把問題定義為「效能瓶頸何時不再是 C++ 語言的問題,而是 CPU 架構與編譯器的問題」。
採用的方法
他不追求相容多種卡帶,而是針對單一卡帶(Tetris)做特化,同時保留日後測試其他遊戲的彈性;摘要列出的技術面向涵蓋指令 dispatch 設計、記憶體存取模式、生成程式碼大小、cache 行為、分支預測與編譯期計算,並強調全程以量測驅動而非直覺調參。
實際效果
議程摘要目前只公開6,000 FPS 的目標與百倍加速的說法,實際測試數據、圖表與方法細節要等 9 月正式開講、投影片或影片釋出後才能驗證。
原始來源:CppCon 2026 議程頁
Rust 套件 arrayref 遭供應鏈攻擊,惡意版本上架 86 分鐘即下架
blog.rust-lang.org · 2026-08-20
2026 年 8 月 20 日,Rust Security Response Team 公告 arrayref crate 遭到供應鏈攻擊,攻擊者發布了惡意版本 arrayref@0.3.10,同時波及同一作者名下另外兩個套件。
漏洞機制
公告指出維護者的帳號或裝置疑似遭入侵,而非維護者本人涉入攻擊;惡意版本引入了對 proc-macro1 的依賴,而 proc-macro1 的 build script 會在編譯期下載並執行惡意 payload,並非把惡意邏輯直接寫進 crate 程式碼本身。這正是 Rust build.rs 在 cargo build 階段即可執行任意程式碼的既有風險再度被利用。
受影響版本
三個套件的惡意版本上線時間都很短,最短的 arrayref 只在線上待了 86 分鐘就被下架:
| Crate | 版本 | 上線時長 |
|---|---|---|
| arrayref | 0.3.10 | 86 分鐘 |
| internment | 0.8.7 | 90 分鐘 |
| append-only-vec | 0.1.9 | 107 分鐘 |
另外 proc-macro1、proc-macro-en、aovine、arone、aronenao、tinymember 這幾個套件則是所有版本被整組刪除,時間軸顯示惡意版 arrayref@0.3.10 於 07:15:00Z 發布,08:41:40Z 即被撤下。
修補與緩解
Rust 官方沒有發出正式 CVE 編號,而是直接提供本地檢查指令,讓開發者確認快取裡是否曾經抓過惡意版本:
find ~/.cargo/registry/cache -type f \( \
-name 'arrayref-0.3.10.crate' -o \
-name 'internment-0.8.7.crate' -o \
-name 'append-only-vec-0.1.9.crate' -o \
-name 'proc-macro1-*.crate' \) -print若比對到上述檔案,需檢查 Cargo.lock 是否鎖定過惡意版本號,並清除本地快取後重新解析依賴。
Rust 1.98.0 發布:新增 algebraic 浮點運算與免動態派發整數格式化
blog.rust-lang.org · 2026-08-20
Rust 團隊於 2026 年 8 月 20 日發布 1.98.0,這個版本把兩塊過去得靠外部 crate 才能做到的效能優化收進標準庫。
核心改動
f32/f64 新增 algebraic_add、algebraic_sub、algebraic_mul、algebraic_div、algebraic_rem 方法,允許編譯器依數學性質重排運算,效果類似其他語言的 -ffast-math;官方文件明確寫明這些方法結果不確定(non-deterministic),但不會產生未定義行為,把「可能算出不同結果」與「記憶體安全」兩件事分開處理。
所有基礎整數型別也新增 format_into 方法,搭配 NumBuffer<Self> 緩衝區可跳過 write! 的動態派發開銷,官方數據顯示效能與外部 crate itoa 相當。
文件也把 ManuallyDrop<Box<_>> 在 drop 內部值後再移動的行為訂為穩定保證,補上 1.96.0 就已修正、但先前未寫進文件的語意保證。
影響範圍
本次總計穩定 23 個 API,包含字串/切片的 substring range 方法、from_utf16le/from_utf16be 與其 lossy 版本、strip_circumfix、NonZero::from_str_radix 等;長期手動加入 itoa 只為了避開格式化開銷的專案,format_into 可能是最直接能拿掉的一個依賴。