[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-source-2-swaps-bsp-for-meshes-and-octrees-zh":3,"article-related-source-2-swaps-bsp-for-meshes-and-octrees-zh":29,"series-tools-32a21aff-5a6c-407c-b9f5-fc9fe6079056":72},{"id":4,"slug":5,"title":6,"content":7,"summary":8,"source":9,"source_url":10,"author":11,"image_url":12,"cover_image":12,"category":13,"language":14,"translated_content":11,"related_article_id":15,"keywords":16,"key_takeaways":22,"views":26,"created_at":27,"published_at":28,"topic_cluster_id":11},"32a21aff-5a6c-407c-b9f5-fc9fe6079056","source-2-swaps-bsp-for-meshes-and-octrees-zh","Source 2 把 BSP 變成 mesh 流程","\u003Cp>我以前看 Source 地圖，最煩的不是畫圖，是 compile。brush 一多，BSP 一卡，整個流程像在跟老引擎磨性子。等我翻到 Source 2 的說明，我才知道那股不對勁從哪來：它根本不是沿用舊腦袋在做事。\u003C\u002Fp>\u003Cp data-speakable=\"summary\">Source 2 把 Source 時代的 BSP brush 思維換成 mesh 和 octree 分割。\u003C\u002Fp>\u003Cp>這篇的觸發點是 Valve 官方開發者維基的 \u003Ca href=\"https:\u002F\u002Fdeveloper.valvesoftware.com\u002Fwiki\u002FSource_2\">Source 2\u003C\u002Fa> 頁面。那頁沒有包裝話術，直接寫了幾何\u003Ca href=\"\u002Fnews\u002Fopencode-go-open-coding-models-affordable-zh\">模型\u003C\u002Fa>的變化：\u003Ca href=\"https:\u002F\u002Fdeveloper.valvesoftware.com\u002Fwiki\u002FBinary_Space_Partitioning\">BSP\u003C\u002Fa> 和 brushes 被 \u003Ca href=\"https:\u002F\u002Fdeveloper.valvesoftware.com\u002Fwiki\u002FSource_2\">meshes\u003C\u002Fa> 取代，空間分割則改成 \u003Ccode>.vwnod_c\u003C\u002Fcode> 這種 octree 格式。這句話很短，但夠我把整個理解框架翻掉。\u003C\u002Fp>\u003Cp>我接下來要拆的不是「新引擎很厲害」這種空話。我只看一件事：幾何怎麼表示、空間怎麼切、這會怎麼影響我做 level、看效能、跟團隊溝通。這些才是開發者真的會撞到的地方。\u003C\u002Fp>\u003Ch2>我不再把 Source 2 當成 Source 1 的升級包\u003C\u002Fh2>\u003Cblockquote>BSP and Brushes ... has been replaced with meshes, and BSP is replaced with octree (.vwnod_c) for geometry partitioning.\u003C\u002Fblockquote>\u003Cp>翻譯一下就是：Source 2 不是把舊 brush 流程換個皮而已，它直接換掉了底層幾何的思考方式。以前你會先想 brush、再想 compile、再想 BSP 的後果；現在這條路徑被打散了，幾何更偏向 mesh，空間切分則交給另一套結構。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785978186212-w6tg.png\" alt=\"Source 2 把 BSP 變成 mesh 流程\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>我以前最常犯的錯，就是看到熟悉的引擎名字，就自動套用舊習慣。結果一進工具、流程就開始卡：為什麼這招不靈？為什麼我以為能省事的做法，最後反而更麻煩？答案通常很無聊：因為底層模型早就變了。\u003C\u002Fp>\u003Cp>實操上，我現在看 Source 2 專案，第一個問題不是「這裡有沒有 brush 對應物」，而是「mesh 是怎麼進來的，partition 是怎麼切的」。這個順序很重要。你先抓住幾何與分割，才不會把老 Source 的肌肉記憶硬套到新架構上。\u003C\u002Fp>\u003Cul>\u003Cli>不要先找 brush 翻版。\u003C\u002Fli>\u003Cli>先看 mesh 的輸入、生成、更新流程。\u003C\u002Fli>\u003Cli>把 partition 當成獨立系統看，不要把它當成 brush 的副產品。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>BSP 不是檔案而已，它一直在管你的腦袋\u003C\u002Fh2>\u003Cp>很多人講 BSP，好像只是 map container。其實不是。它一路影響的是設計方式、編譯方式、除錯方式，甚至你怎麼想一張地圖的結構。Source 和 Quake 系列把這件事綁得很緊：你先用 brushes 搭世界，再把世界丟進 BSP 邏輯裡處理。\u003C\u002Fp>\u003Cp>Valve 在 Source 2 頁面直接把這條老路線換掉，這件事很誠實。它等於在說：舊 brush-first 的限制，現在不想再背了。這對我這種常碰 level pipeline 的人很有感，因為很多「明明很簡單卻很難做」的問題，根本是幾何表示法自己在找麻煩。\u003C\u002Fp>\u003Cp>我以前做老 Source 內容時，常遇到一種很煩的狀況：editor 裡看起來很單純的空間，compile 後卻變成一堆維護成本。不是你設計差，是 brush、vis、compile artifact 這些東西一起把你拖住。Source 2 把 mesh 拉上來，就是在減少這種拖曳感。\u003C\u002Fp>\u003Cp>實操寫法很簡單：如果你在做 Source 2 相關工作，先把「外觀長什麼樣」跟「引擎怎麼切空間」分開想。這兩件事在舊系統裡常常綁一起，在新系統裡最好不要再混在一起。\u003C\u002Fp>\u003Cul>\u003Cli>用 mesh 思維去看形狀，不要先想 brush 拼法。\u003C\u002Fli>\u003Cli>不要把舊 Source 的 compile 經驗當成萬用答案。\u003C\u002Fli>\u003Cli>讀文件時，把 partition 規則當成第一級資訊。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Mesh 讓作者壓力從編輯器轉到資產流程\u003C\u002Fh2>\u003Cp>mesh 的好處不是「比較現代」這種廢話。\u003Ca href=\"\u002Fnews\u002Fsystem-design-resources-that-actually-help-you-prep-zh\">真正\u003C\u002Fa>的差別是，它比較接近很多美術和技術美術本來就熟的工作方式。你不用一直把一個空間想像成 editor primitive 的拼圖，而是更像在處理一個可控的資產。\u003C\u002Fp>\n\u003Cfigure class=\"my-6\">\u003Cimg src=\"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785978185427-gk4n.png\" alt=\"Source 2 把 BSP 變成 mesh 流程\" class=\"rounded-xl w-full\" loading=\"lazy\" \u002F>\u003C\u002Ffigure>\n\u003Cp>也就是說，壓力會從「怎麼把 brush 搭對」轉成「資產流程乾不乾淨」。拓樸、命名、collision、import 規則、後續可不可以安全修改，這些都會變成更核心的問題。這不是比較輕鬆，只是麻煩換了位置。\u003C\u002Fp>\u003Cp>我以前看過團隊花很多時間，想把 brush 流程硬做得像 DCC 工具。很彆扭，真的很彆扭。Source 2 這種 mesh 取向，至少承認了一件事：很多空間幾何本來就比較適合用資產管，而不是用一堆原始 brush 去拗。\u003C\u002Fp>\u003Cp>實操上，如果你在做工具或內容，我會先把下面幾件事問清楚：\u003C\u002Fp>\u003Cul>\u003Cli>上游接受哪些 mesh 格式？\u003C\u002Fli>\u003Cli>匯入時會生成什麼資料？\u003C\u002Fli>\u003Cli>collision 和 visual geometry 要不要分開？\u003C\u002Fli>\u003Cli>匯入後哪些東西還能改，哪些一改就炸？\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>Octree 才是我看效能時會先盯的東西\u003C\u002Fh2>\u003Cp>Source 2 頁面提到 BSP 被 \u003Ccode>.vwnod_c\u003C\u002Fcode> 的 octree 分割取代。這句話對我來說，比「新引擎支援更多功能」重要多了。因為 partitioning 決定的是空間怎麼被組織、哪些東西該先算、哪些東西可以先略過。\u003C\u002Fp>\u003Cp>翻譯一下就是：如果你不懂空間怎麼切，你就很容易把效能問題怪錯地方。你可能去怪燈光、怪道具、怪材質，但真正的問題可能是幾何分區的方式跟你想的不一樣。這種坑我踩過，凌晨兩點還在盯 profiler，最後才發現自己一直看錯層。\u003C\u002Fp>\u003Cp>我不會假裝單靠這一頁就能把 Source 2 的 octree \u003Ca href=\"\u002Fnews\u002Fgolang-basics-for-beginners-2026-zh\">實作\u003C\u002Fa>講完，官方也沒寫那麼細。但它已經夠我知道一件事：不要再用老 BSP tree 的直覺去猜整個空間結構。那樣很容易誤判。\u003C\u002Fp>\u003Cp>實操寫法是：你在看 Source 2 場景效能時，先看空間分割，再看資產疊太多還是光源太多。若 partition 本身就不乾淨，後面再怎麼微調都只是補洞。\u003C\u002Fp>\u003Cul>\u003Cli>把相關幾何盡量放在合理的空間群組。\u003C\u002Fli>\u003Cli>不要把無關且重的東西硬塞同一區。\u003C\u002Fli>\u003Cli>效能怪異時，先查 partition，再查其他項。\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>舊 Source 的老招，到了這裡很容易失靈\u003C\u002Fh2>\u003Cp>我最怕的，就是大家把引擎換成 Source 2，腦袋卻還停在 Source 1。這種情況很常見：檔名、工具名、專案名都變了，但你還在用舊時代的假設做決策。結果就是，很多看似合理的做法，在新系統裡根本不成立。\u003C\u002Fp>\u003Cp>這篇 Source 2 的幾何說明，其實就是在提醒你這件事。BSP 和 brushes 不再是中心，代表你原本那套 level 直覺只能部分沿用。你還是可以帶走一些經驗，例如閱讀空間、控制動線、判斷複雜度，但實作層面不能再偷懶。\u003C\u002Fp>\u003Cp>我自己也吃過這種虧。人一熟悉某個引擎家族，就會以為自己懂了。直到某個架構改動把半套習慣打碎，你才發現自己根本是在拿舊地圖找新出口。Source 2 這頁至少把這件事講明白了，沒跟你演。\u003C\u002Fp>\u003Cp>實操上，我會在開工前先做一輪假設盤點：\u003C\u002Fp>\u003Cul>\u003Cli>我是不是還在用 brush 時代的限制想問題？\u003C\u002Fli>\u003Cli>我是不是在優化 compile，而不是看 runtime partition？\u003C\u002Fli>\u003Cli>我是不是把 imported mesh 當成 editor primitive？\u003C\u002Fli>\u003Cli>我是不是用 Source 1 的肌肉記憶在讀 Source 2？\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>如果是我帶團隊，我會先把這份契約寫死\u003C\u002Fh2>\u003Cp>假設我今天加入一個 Source 2 團隊，我會很快把 level design、technical art、engine 這三邊拉到同一張桌子。因為 mesh、octree、collision、import 規則這幾件事，只要有一個人自己腦補，後面就會開始各做各的。\u003C\u002Fp>\u003Cp>我不想聽「之後再對齊」。這種話通常代表沒人真的定義清楚。對我來說，最實際的做法是先把內容契約寫出來：哪些是 mesh，哪些是生成物，哪些是 runtime 才會決定，哪些一進匯入就不能亂動。\u003C\u002Fp>\u003Cp>這樣做有點煩，但很值得。因為你一旦把規則寫清楚，很多莫名其妙的問題會直接少一半。不是因為世界變簡單了，是因為大家終於知道自己在交什麼東西。\u003C\u002Fp>\u003Cp>實操寫法：做一份短版 pipeline 文件，先不要求漂亮，只求能用。內容至少要能回答：\u003C\u002Fp>\u003Cul>\u003Cli>誰負責建 mesh？\u003C\u002Fli>\u003Cli>誰負責 partition 相關設定？\u003C\u002Fli>\u003Cli>collision 怎麼來？\u003C\u002Fli>\u003Cli>哪些資料是 bake 後固定的？\u003C\u002Fli>\u003C\u002Ful>\u003Ch2>可抄的模板\u003C\u002Fh2>\u003Cpre>\u003Ccode># Source 2 geometry pipeline brief\n\n## 1. 幾何原則\n- Level geometry 以 mesh 為主，不以 brush-first 工作流為主。\n- 空間分割視為獨立系統，不跟視覺幾何混成一團。\n\n## 2. 資產流程\n1. 由 DCC 或 mesh-aware 工具建立空間與結構。\n2. 保持拓樸乾淨，避免不必要的碎片化。\n3. Visual geometry 與 collision 分開管理。\n4. 依專案規範輸出 mesh。\n5. 匯入後確認 partition 與 bake 結果。\n\n## 3. 上線前要先回答的問題\n- 哪些幾何是人工 author 的？\n- 哪些幾何是工具生成的？\n- partition 資料從哪裡來？\n- collision 從哪裡來？\n- 哪些資料在 bake 後就不該再改？\n\n## 4. 團隊檢查清單\n- [ ] 沒有把 brush-era 假設寫進新文件\n- [ ] mesh import 規則有明確定義\n- [ ] partition 期待值有寫清楚\n- [ ] collision 規則有寫清楚\n- [ ] 有針對空間複雜度的 profiling 計畫\n\n## 5. 送給團隊的一句話\nSource 2 需要 mesh authoring 與 octree partitioning 的共同紀律，不能只靠舊 Source 習慣硬撐。\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>上面這段不是 Valve 官方流程，是我根據官方 Source 2 說明整理出來的可執行版本。原始來源給我的是架構線索，我把它翻成團隊可以直接拿去開會的格式。\u003C\u002Fp>\u003Cp>原始資料先看 Valve 官方頁面：\u003Ca href=\"https:\u002F\u002Fdeveloper.valvesoftware.com\u002Fwiki\u002FSource_2\">https:\u002F\u002Fdeveloper.valvesoftware.com\u002Fwiki\u002FSource_2\u003C\u002Fa>。如果你想補背景，我也會一起看 \u003Ca href=\"https:\u002F\u002Fdeveloper.valvesoftware.com\u002Fwiki\u002FBinary_Space_Partitioning\">BSP\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FOctree\">Octree\u003C\u002Fa>、\u003Ca href=\"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FQuake_(video_game)\">Quake\u003C\u002Fa> 這幾個頁面；本文的拆解是我自己的整理，模板是我衍生出來的工作版。","我拆 Source 2 的幾何模型：BSP、brush、mesh、octree 各自扮演什麼角色，還順手整理成可直接抄的團隊模板。","developer.valvesoftware.com","https:\u002F\u002Fdeveloper.valvesoftware.com\u002Fwiki\u002FSource_2",null,"https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785978186212-w6tg.png","tools","zh","c21b1af8-9be1-43e4-892d-8a4f9ab8c16b",[17,18,19,20,21],"Source 2","BSP","mesh","octree","level design",[23,24,25],"Source 2 的重點是幾何表示法換了，不要再用 Source 1 的 brush 腦袋硬套。","mesh 讓內容流程更像資產管理，octree 讓空間分割成為效能與結構的核心。","最實用的做法是把幾何、partition、collision、bake 規則寫成團隊契約。",0,"2026-08-06T01:02:43.692336+00:00","2026-08-06T01:02:43.657+00:00",{"tags":30,"relatedLang":31,"relatedPosts":35},[],{"id":15,"slug":32,"title":33,"language":34},"source-2-swaps-bsp-for-meshes-and-octrees-en","Source 2 swaps BSP for meshes and octrees","en",[36,42,48,54,60,66],{"id":37,"slug":38,"title":39,"cover_image":40,"image_url":40,"created_at":41,"category":13},"3b3c9d3f-47b5-453b-892f-241bf29d986b","harness-long-running-agent-coding-template-zh","Harness 讓長任務編程更像真開發","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1786043023387-ze69.png","2026-08-06T19:03:18.40646+00:00",{"id":43,"slug":44,"title":45,"cover_image":46,"image_url":46,"created_at":47,"category":13},"a08d7243-ccc3-4ac7-8e68-12d17699f934","golang-basics-for-beginners-2026-zh","Golang 入門實作：安裝到測試通過","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785976364887-czvh.png","2026-08-06T00:32:15.901873+00:00",{"id":49,"slug":50,"title":51,"cover_image":52,"image_url":52,"created_at":53,"category":13},"fea0311b-9182-48fa-af78-cb5d916970f2","run-linux-containers-on-wsl-with-wslc-zh","在 WSL 用 wslc 跑 Linux 容器","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785933170061-tafy.png","2026-08-05T12:32:27.473774+00:00",{"id":55,"slug":56,"title":57,"cover_image":58,"image_url":58,"created_at":59,"category":13},"a88cd1d5-a31e-4932-89ed-27989257620c","aliyun-free-cloud-server-first-deployment-zh","阿里云试用额度部署首台服务器","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785846785679-f8bn.png","2026-08-04T12:32:34.829107+00:00",{"id":61,"slug":62,"title":63,"cover_image":64,"image_url":64,"created_at":65,"category":13},"b8da22f6-d35f-41a1-915c-2d80abba0c25","deepseek-v4-flash-agent-cost-breakdown-zh","DeepSeek V4 Flash 讓 Agent 便宜跑","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785785620047-lrkk.png","2026-08-03T19:33:15.823908+00:00",{"id":67,"slug":68,"title":69,"cover_image":70,"image_url":70,"created_at":71,"category":13},"3fa27164-43f7-4636-8c28-eae3775d4c66","gpt-56-sol-gpu-kernel-cost-down-20-percent-zh","GPT-5.6 Sol 把 GPU 核心成本砍 20%","https:\u002F\u002Fxxdpdyhzhpamafnrdkyq.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fcovers\u002Finline-1785780224229-hx8i.png","2026-08-03T18:03:17.220074+00:00",[73,78,83,88,93,98,103,108,113,118],{"id":74,"slug":75,"title":76,"created_at":77},"855cd52f-6fab-46cc-a7c1-42195e8a0de4","surepath-real-time-mcp-policy-controls-zh","SurePath 推出即時 MCP 政策控管","2026-03-26T07:57:40.77233+00:00",{"id":79,"slug":80,"title":81,"created_at":82},"9b19ab54-edef-4dbd-9ce4-a51e4bae4ebb","mcp-in-2026-the-ai-tool-layer-teams-use-zh","2026 年 MCP：團隊真的在用的 AI 工具層","2026-03-26T08:01:46.589694+00:00",{"id":84,"slug":85,"title":86,"created_at":87},"af9c46c3-7a28-410b-9f04-32b3de30a68c","prompting-in-2026-what-actually-works-zh","2026 提示工程，真正有用的是什麼","2026-03-26T08:08:12.453028+00:00",{"id":89,"slug":90,"title":91,"created_at":92},"05553086-6ed0-4758-81fd-6cab24b575e0","garry-tan-open-sources-claude-code-toolkit-zh","Garry Tan 開源 Claude Code 工具包","2026-03-26T08:26:20.068737+00:00",{"id":94,"slug":95,"title":96,"created_at":97},"042a73a2-18a2-433d-9e8f-9802b9559aac","github-ai-projects-to-watch-in-2026-zh","2026 必看 20 個 GitHub AI 專案","2026-03-26T08:28:09.619964+00:00",{"id":99,"slug":100,"title":101,"created_at":102},"a5f94120-ac0d-4483-9a8b-63590071ac6a","claude-code-vs-cursor-2026-zh","Claude Code 與 Cursor 深度對比：202…","2026-03-26T13:27:14.279193+00:00",{"id":104,"slug":105,"title":106,"created_at":107},"0975afa1-e0c7-4130-a20d-d890eaed995e","practical-github-guide-learning-ml-2026-zh","2026 機器學習入門 GitHub 實用指南","2026-03-27T01:16:49.712576+00:00",{"id":109,"slug":110,"title":111,"created_at":112},"bfdb467a-290f-4a80-b3a9-6f081afb6dff","aiml-2026-student-ai-ml-lab-repo-review-zh","AIML-2026：像課綱的學生實驗 Repo","2026-03-27T01:21:51.467798+00:00",{"id":114,"slug":115,"title":116,"created_at":117},"80cabc3e-09fc-4ff5-8f07-b8d68f5ae545","ai-trending-github-repos-and-research-feeds-zh","AI Trending：把 AI 資源收成一張表","2026-03-27T01:31:35.262183+00:00",{"id":119,"slug":120,"title":121,"created_at":122},"3ce6e6e2-bac5-463e-9f8d-45caabcc61f7","awesome-ai-for-science-research-tools-map-zh","AI 科研工具清單，開始像地圖了","2026-03-27T01:46:50.521945+00:00"]