Tất cả bài viết
Hướng dẫn · 7 min read

Làm game của bạn chạy trên một củ khoai: tối ưu môi trường cho PC yếu và Steam Deck

Một sổ tay thực hành để đạt ngân sách khung hình thấp mà không moi ruột nghệ thuật của bạn: thời gian khung hình thực sự đi đâu, overdraw và tán lá, draw call và instancing, LOD và khoảng cull, cùng phương pháp camera cố định để tìm những hồi quy thật.

Slow tropical river between dense green banks, with clouds mirrored on the surface

Tóm lại: một phần khổng lồ người chơi ở trên phần cứng khiêm tốn (laptop, máy cầm tay như Steam Deck, GPU cũ hơn) và một môi trường chỉ chạy trên dàn cao cấp bỏ họ ra ngoài. Tin tốt: hầu hết hiệu năng môi trường mất ở vài nơi có thể đoán trước (overdraw, draw call, tán lá dày, texture quá khổ) và giành lại bằng vài thói quen kỷ luật. Đây là một sổ tay thực hành để đạt ngân sách khung hình thấp mà không moi ruột nghệ thuật của bạn, cộng phương pháp camera cố định để bắt hồi quy trước khi xuất xưởng.

Một khu rừng dày chật kín cây và bụi cây chồng lấp Đây là loại cảnh đắt nhất để chạy: các lớp lá trong suốt, hàng ngàn instance, overdraw nặng. Nó cũng là nơi những chiến thắng lớn nhất, dễ nhất sống một khi bạn biết thời gian khung hình đi đâu.

Đặt ngân sách trước, bằng mili giây

Chọn một thời gian khung hình mục tiêu trên phần cứng yếu nhất bạn hỗ trợ (16,6 ms cho 60 fps, 33,3 ms cho 30) và coi nó như một giới hạn cứng. "Tối ưu sau" nghĩa là "xây lại sau"; lập ngân sách từ đầu rẻ hơn nhiều.

Tối ưu không có con số chỉ là cảm tính. Quyết định khung hình bạn nhắm trên phần cứng sàn của bạn (Steam Deck, một laptop tầm trung, spec tối thiểu của bạn là gì đi nữa) và đổi nó ra mili giây, vì mili giây cộng dồn và phần trăm nói dối. Rồi giữ mỗi cảnh theo đó khi xây, không phải ở cuối. Các đội xuất xưởng mượt trên máy yếu không tối ưu mạnh hơn; họ chỉ đơn giản không bao giờ để một cảnh phá vỡ ngân sách ngay từ đầu, điều đó tốn một phần nhỏ so với cào lại hiệu năng sau khi nghệ thuật xong và mọi thứ phụ thuộc vào nó.

Biết thời gian đi đâu

Thời gian khung hình môi trường thường bị ăn bởi overdraw (tán lá trong suốt), quá nhiều draw call (đối tượng không batch), texture quá khổ (băng thông bộ nhớ), và ánh sáng/bóng đổ đắt. Profile để tìm nút cổ chai CỦA BẠN trước khi tối ưu mù.

Đoán về tối ưu phí phạm nhiều ngày. Mở một profiler, tìm xem bạn CPU-bound (thường là draw call) hay GPU-bound (thường là overdraw, shading, hoặc băng thông), và tấn công nút cổ chai thật. Dù vậy, môi trường thất bại theo những cách có thể đoán, và gần như luôn là một trong: overdraw từ tán lá trong suốt xếp lớp; draw call từ hàng ngàn đối tượng không instance; bộ nhớ/băng thông texture từ texture quá khổ hoặc quá nhiều; và chi phí ánh sáng/bóng đổ từ quá nhiều đèn động hoặc bản đồ bóng độ phân giải cao. Phần còn lại của sổ tay này đi qua chúng theo thứ tự tác động thường thấy.

Tán lá và overdraw: kẻ phản diện quen thuộc

Các card tán lá trong suốt chồng lấp và re-shade cùng những pixel nhiều lần: đó là overdraw, và là kẻ giết số một của máy yếu. Giảm chồng lấp card lá, dùng LOD hung hãn, và cull tán lá xa thật mạnh.

Thực vật dày là nơi hầu hết ngân sách khung hình máy yếu chết, vì mỗi card lá bán trong suốt buộc GPU shade những pixel mà nó sau đó sẽ vẽ đè lên lại, đôi khi mười lần trở lên mỗi pixel trong một tán rừng dày. Cách sửa: dùng card lá chặt hơn với ít vùng trong suốt phí phạm hơn, rơi nhanh xuống LOD rẻ hơn khi tán lá lùi ra, và đặt khoảng cull cứng để cỏ và bụi xa đơn giản ngừng vẽ. Trên một máy cầm tay, khác biệt giữa "cỏ đến chân trời" và "cỏ bị cull ở một khoảng cách hợp lý" có thể là toàn bộ khác biệt giữa 25 và 40 fps. Bake tán lá thành instance native để GPU có thể batch nó, và để instancing của engine làm việc nặng.

Draw call và instancing

Mỗi đối tượng duy nhất được gửi riêng là một draw call, và hàng ngàn cái làm CPU khựng. Instance các mesh lặp lại để hàng trăm bản sao tốn một call; gộp clutter tĩnh nơi có ý nghĩa.

Nếu bạn CPU-bound, draw call thường là lý do. Mỗi thứ riêng biệt bạn yêu cầu engine render mang overhead, và một cảnh đặt tay với một ngàn tảng đá và bụi cây riêng lẻ nhấn chìm CPU trong chi phí gửi. Instancing là thuốc chữa: các mesh lặp lại vẽ như instance sập hàng trăm bản sao thành một call duy nhất, đó chính xác là lý do các công cụ scatter bake thành instance native của engine quan trọng cho hiệu năng: scatter trông như một ngàn cây tốn như một nắm. Nơi instancing không áp dụng, gộp clutter tĩnh nhỏ thành mesh kết hợp cũng cắt số call. Đây là một nơi mà một quy trình như của Numivo (vẽ mật độ, rồi bake thành mesh instance thường) trả tiền trực tiếp trên phần cứng yếu, vì đầu ra là thứ rẻ mà GPU muốn.

Một hồ nước lặng, đơn giản dưới bầu trời trong, rẻ để render Không phải mọi cảnh đều phải dày tối đa. Không gian yên tĩnh, thoáng đãng tốn gần như không gì và cho cả phần cứng lẫn người chơi một sự nghỉ ngơi; nhịp hóa mật độ của bạn tự nó là một tối ưu.

LOD, khoảng cull, và kích thước texture

Cho mỗi mesh quan trọng các LOD để bản sao xa rẻ, đặt khoảng cull để đối tượng nhỏ-trên-màn-hình ngừng vẽ, và giới hạn độ phân giải texture ở mức camera phân giải được ở khoảng cách. Ba cái này giành lại nhiều với ít công.

Ba thói quen kém hào nhoáng gánh phần lớn ngân sách còn lại. LOD: mesh xa nên chuyển sang phiên bản đa giác thấp hơn, vì chi tiết đầy đủ trên một cây 20 pixel là phí. Khoảng cull: bất cứ gì quá nhỏ trên màn hình để nhận ra nên ngừng render hoàn toàn (prop nhỏ, sỏi, cỏ mịn), chỉnh theo loại đối tượng. Kích thước texture: giới hạn độ phân giải ở mức thực sự phân giải được ở khoảng cách người chơi (xem logic mật độ texel: thứ xa cần ít texel hơn nhiều), vì texture quá khổ đốt băng thông bộ nhớ mà GPU yếu không thể dành. Không cái nào trong số này hại cái nhìn khi chỉnh đúng; chúng chỉ ngừng bắt bạn trả tiền cho chi tiết không ai thấy.

Tìm hồi quy bằng camera cố định

Định nghĩa vài "camera ngân sách" (vista tệ nhất của bạn, không gian chiến đấu dày nhất, nội thất bận rộn nhất) và kiểm thời gian khung hình của chúng mỗi build. Bay lượn ngẫu nhiên giấu hồi quy; cùng những góc nhìn tàn bạo mỗi lần phơi bày chúng.

Hiệu năng mục ruỗng âm thầm khi nội dung được thêm, và bạn sẽ không bắt được nó khi dạo quanh màn chơi qua loa. Thay vào đó, ghim một nắm góc nhìn tệ nhất của bạn (điểm nhìn rừng dày, chợ đông, trận đánh nặng hiệu ứng) và đo chính xác những cái đó, mỗi build, đối với ngân sách. Khi một con số đỏ, bạn biết một thay đổi gần đây gây ra nó, và đại khái ở đâu. Đây là khác biệt giữa một đội phát hiện khủng hoảng hiệu năng ở cuối và một đội sửa một hồi quy 2 ms ngay ngày nó xuất hiện. Trên mục tiêu máy yếu, cho một trong những camera đó chạy trên Steam Deck thật hoặc máy spec tối thiểu, không chỉ một ước tính của trình chỉnh sửa.

Những con số thực địa đáng đánh cắp

  • Ngân sách khung hình: 16,6 ms (60 fps) / 33,3 ms (30 fps), đặt trên phần cứng sàn của bạn
  • Kẻ giết máy yếu quen thuộc: overdraw tán lá, card chặt hơn, LOD nhanh, cull cứng
  • Mesh lặp lại → instance: hàng trăm bản sao cho một draw call
  • Giới hạn kích thước texture ở chi tiết camera phân giải được, thứ xa cần ít texel hơn nhiều
  • Bắt hồi quy bằng camera ngân sách cố định, đo mỗi build

Hỏi-Đáp nhanh

Tôi có phải chọn giữa đẹp và máy yếu không? Ít hơn bạn nghĩ. Hầu hết chi phí máy yếu là phí phạm (overdraw, call không batch, texture quá khổ), không phải chất lượng nhìn thấy được. Cắt phí phạm và nghệ thuật sống sót; người chơi trên phần cứng yếu hiếm khi nhớ chi tiết bạn đã trả tiền nhưng họ không thể thấy.

Ánh sáng động có bị cấm trên Steam Deck không? Không cấm, nhưng được lập ngân sách. Giới hạn số đèn động và vật đổ bóng, dựa vào ánh sáng baked nơi cảnh tĩnh, và dành chi phí động cho nơi quan trọng. Đó là một dòng ngân sách, không phải một lệnh cấm.

Thay đổi đơn lẻ nào giúp nhất trên máy cầm tay? Thường là thuần hóa tán lá: card lá chặt hơn, LOD hung hãn, và khoảng cull cứng trên cỏ và bụi cây. Overdraw là nút cổ chai máy cầm tay phổ biến nhất, và thực vật là nơi overdraw sống.

Tôi nên kiểm trên phần cứng mục tiêu sớm đến đâu? Từ vertical slice đầu tiên. Một ước tính của trình chỉnh sửa trên một máy dev mạnh giấu chính xác những vấn đề máy cầm tay sẽ có. Đưa một build lên thiết bị spec tối thiểu thật sớm và giữ nó trong vòng lặp.

Chạy trên một củ khoai không phải về làm game của bạn xấu; mà về không trả tiền cho chi tiết người chơi không thể thấy. Lập ngân sách bằng mili giây, giết overdraw, instance các thứ lặp lại, cull cái vô hình, và theo dõi các camera tệ nhất mỗi build, và môi trường của bạn sẽ trông tuyệt chạy cho khối khán giả khổng lồ không ở trên dàn cao cấp.