💬 Pofat 的話
跨越四分之一世紀的更新
對於電子遊戲玩家而言,絕對不陌生的是最經典的FPS射擊遊戲之一,《Half-Life》(戰慄時空),在11月19日慶祝其發行25週年。為了慶祝這個里程碑,遊戲開發團隊釋出了一個超豐富的更新,並提供了該系列的第一代遊戲免費(僅限於11/21,雖然此期已過,但現在仍有秋特優惠)。這次更新可謂誠意滿滿,不僅包括了一般性的問題修正,還新增了地圖、模型和介面。在我看來,其中最重要的是對這款已經推出25年的經典作品進行了全面的現代化支援,包括真正的寬螢幕支援以及通過正式驗證的 Steam Deck 支援。有關完整的更新介紹,可參閱為止製做的專門網頁。我也強烈推薦觀看一同釋出的紀錄短片。令人驚訝,一款遊戲在發行25年後,即使在整個軟硬體開發和佈署環境都經歷了天翻地覆的變革,仍然能夠推出如此巨幅的更新。讓我們能在現代電子遊戲設備中感受老派經典的魅力,實屬一種浪漫。
究竟是怎麼個浪漫法呢?我截取了其中一段,相信大家一讀即懂:
「不需要另外購買音效卡」
小提醒:看懂的你,年紀已經暴露了 🥲
引擎救遊戲
週末錄 weak self podcast 第 107 集時 和 13 聊到 Capcom 的 RE Engine 是個非常成功的遊戲引擎,從玩家層面而言,其在不同平台的最佳化相當理想,各平台的效能都很不錯,在主機圈中目前硬體能力最低下的 Switch 也繳出了 Monster Hunter Rise 這樣優秀的最佳化結果(網友評價說連讀取都快到不像 Switch); 從開發者面而言,其能快速迭代的開發方式大幅地提升開發效率,保證了穩定的作品發行(看看那一年一款的 Resdient Evil 系列),今年也透過支援 Metal 移植到 Apple Silicon 上,說到這身為軟體工程師應該能體會這是多麼傑出的大型軟體了吧,如果 TGA 有 Best Game Engine 我一定投給 RE Engine。 其接班人也在開發中,代號為 REX Engine。有興趣的人可以看一個月前 Capcom Open Conference 的 session: RE Engine 的過去與未來。是說 RE Engine 仍然採用 Garbage Collection 以及用 C# 為主要開發語言,有鑑於他們與 Apple 這一年來的合作關係與 Godot Engine 最近採用 Swift 作為開發語言的經驗,有沒有可能 REX Engine 也有機會考慮採用 Swift 呢?如果是這樣,Capcom 請收下我的履歷<(_ _)>
同時已募得四億美元、開發 11 年仍無確定上市時間,多次被稱為遊戲史上最大詐騙案的星際公民(Star Engine)最近公佈了它們的遊戲引擎 Star Engine demo 影片,效果很驚人,可以感受到他們想要用這個影片拉回玩家的期待與信心,可惜遊戲不是只有畫面和互動而已啊!搞這麼久都沒有個影,管理層的能力非常令人擔心,這款己經是妥妥的有生之年系列。
說到這就想到最近有國外玩家怕玩不到GTA 6 而開始戒菸,引起一波戒菸熱潮,各位玩家們為了玩遊戲要保持身體健康啊!
🗣️ On Swift Forum
[SE-0413] Typed Throws (Reviewing)
Huge!
不只是 proposal 本身的長度,這個功能的重要性同時也非常巨大。相信大家都知道 Swift 有 try catch,但在設計 api 的錯誤處理時抛出 Error 可能不會是大家優先想要採用的解法,主因就是 catch API 給你的是 any Error
這樣的一個通用型別,對於強調型別安全的 Swift 這個設計顯得予盾,因為你只能在 runtime cast 找出真正的 Error 型別,更無法窮舉處理所有可能的錯誤,縱使你擁有全部錯誤種類的知識。另外一個缺點是 existential container (any Error
)會增加 binary size,heap allocation 以及 performance overhead,因為要多建一個 container ,對於資源有限的環境不利,且錯誤處理在這種環境通常很必要。
這個提案將則是讓你指定抛出的錯誤型別,在 catch 這個方法時你也會取得該錯誤型別而不是 any Error
,除非你的 do
裡面抛出兩種不同類型的錯誤,此時 catch 裡拿到的會是 any Error
。
func callCat() throws(CatError) -> Cat {
if Int.random(in: 0..<24) < 20 {
throw .sleeps
}
// ...
}
當然你也可以 throws(any Error)
,等同於 throws
;或者 throws(Never)
,就是一般的 non-throwing。
最後我們可以不用再使用 rethrow
func map<U>(body: (Element) throws -> U) rethrows -> [U]
可以改成
func map<U, E: Error>(body: (Element) throws(E) -> U) throws(E) -> [U]
這裡最重要的關鍵不是錯誤型別具體化,而是「對程式執行內容的約束反映在函數簽名上」。後者中唯一丟出 Error 的方式只能靠執行 body
,畢竟 Error
這個 protocol 沒有定義 initializer 。如此一來 compiler 便不需要去確認你寫的程式內容(把責任丟給開發者啦)也能確保這裡的錯誤傳遞是正確的。
Chris Lattner 也大力讚賞這個提案。
Swift MMIO
swift-mmio 是個方便直存取記憶體,且仍然保有 type safety 特性的套件,主要用於 Embedded Swift 這種常需要操作暫存器的場合。這個套件讓我體會到 Swift 至今的發展的確帶來不少可能性,能在低階操作的場合中利用現代語言的高階特性,與 C 和 C++ 的橋接已經成熟(C基本上是直接操作),當然原生 API 並無 type safety,得透過語言本身的功能達成這目的,再加上 Swift macro 來簡化呼叫方的操作,這塊未來可期啊。
https://forums.swift.org/t/introducing-swift-mmio/68525
🤪 Pofat 選推
想想遊戲工程師還要更新 25 年前出版的軟體頗慘,真的是靠愛在支撐啊
https://mastodon.gamedev.place/@eks/111465499812220450
不要錯過久違的 weak self 新集數,滿滿的遊戲和勸敗
https://weakself.dev/episodes/107
🗒️ 破費清單
為了公開透明贊助費去向,在這和大家報告使用細項。趁著秋特真的是大買特買:
Laika: Aged Through Blood -美術優秀、配樂傑出,玩法新穎(但是會手忙腳亂)的末世廢土風作品,強力推薦。
Evil West -評價中等,但拿著槍到處亂轟的吸血鬼獵人能錯過嗎?這個主題是我的菜
A Space for the Unbound -Steam 上好評如潮,非常驚人,來自印尼團隊的作品,場景與台灣風格相近。試玩時能摸貓我就決定要買了(?!),好評一致地稱讚其敘事非常精彩,我很期待。老實說買這遊戲時我很感謝 Steam Deck 大大地打開了我的遊戲視野,沒有這主機我就沒機會跨足這類型(或規模)的遊戲。
Bramble: The Mountain King -恐怖生存+北歐+超級好評 = 無法錯過。