Làm cách nào tôi có thể giảm tác động hiệu suất của việc kết xuất cây?


24

Tôi đang làm một loại trò chơi cách điệu poly thấp. Tôi có một địa hình với một ít nước, và tôi muốn rất nhiều cây cối; Hiện tại tôi có 10.000 cây được đặt. Mỗi cây bao gồm không quá 200 hình tam giác, vì vậy chúng không quá thuế.

Vấn đề chính là, có những cái hồ, và những cái hồ khá lớn. Bạn thực sự không thể nhìn thấy bất kỳ cây nào ở phía bên kia của hồ, và điều đó trông thực sự tồi tệ, đặc biệt là khi bạn đi bộ ở đó và cây đột nhiên xuất hiện.

Để khắc phục điều này, tôi phải tăng khoảng cách cây để bạn có thể thấy một lượng cây kha khá ở phía bên kia hồ, nhưng điều đó làm giảm hiệu suất xuống 40-50fps, và hầu như không có gì khác trong trò chơi. Tôi đang sử dụng GTX 1080, nếu điều đó có ích.

Tôi có thể làm gì để trò chơi của mình chạy nhanh hơn với nhiều cây hơn?


IIRC, Silent Hill đã sử dụng sương mù để che giấu điểm cắt ở mặt phẳng cắt xa, cho phép họ bắt đầu tải động mọi thứ ngay bên ngoài nơi sương mù cắt đứt. Bạn có thể được hưởng lợi từ một sự thay đổi trong bầu không khí của trò chơi.
Cody

Những cái cây đang kéo bạn nhìn ra cửa sổ, do đó làm giảm hiệu suất của bạn.
mbomb007

Bạn đã thử chạy profiler chưa? Nếu vậy, nút cổ chai ở đâu?
Mikael Högström

Bạn đang làm bất kỳ loại bực bội?
Krythic

Loại bỏ sự thất vọng là gì?
mr-matt

Câu trả lời:


43

Có một vài điều bạn có thể làm để tăng hiệu suất vẽ.

  1. Bạn nói họ ở khá xa. Bạn có thể sử dụng LOD để giảm số lượng đỉnh của những cây đó và do đó giảm thời gian cần thiết để đi qua tất cả các đỉnh được vẽ. Mặc dù điều này rất có thể không phải là vấn đề trong tay (GTX1080 chỉ với 10 nghìn cây với 200 tris mỗi cây, những con số trừng phạt cho gpu) tôi vẫn đưa nó vào. Billboarding là một công cụ hiệu quả cho mức LOD thấp nhất, vì thực chất nó là một mặt phẳng luôn luôn đối diện với máy ảnh với hình ảnh được hiển thị của cây trên đó. Nó mất cảm giác về chiều sâu, đó là lý do tại sao nó tốt cho cấp độ thấp nhất vì người chơi rất có thể sẽ không nhận thấy sự khác biệt.

  2. Bạn đã kích hoạt theo đợt ? Việc tạo khối động thường được thực hiện tự động nếu số lượng đỉnh của các lưới khá thấp. Việc tạo khối tĩnh cũng có thể được thử bằng cách làm cho cây tĩnh bằng cách chọn hộp kiểm trong trình chỉnh sửa thống nhất trên trò chơi cha mẹ. Điều này không hoạt động tốt với các đối tượng hoạt hình. Bạn cần các đối tượng để có tài liệu chia sẻ để làm cho công việc này.

  3. Việc tạo khối tùy chỉnh cho phép bạn kiểm soát kết xuất bằng cách tự tạo các khối thay vì để thống nhất xử lý nó và nó cũng cho phép tạo khối cho các mắt lưới lớn hơn. Điều này được thực hiện dễ dàng bởi Mesh.CombineMeshes . Điều này cũng không hoạt động tốt với các đối tượng hoạt hình. Bạn cần các đối tượng để có tài liệu chia sẻ để làm cho công việc này. Bạn có thể muốn chia thế giới của bạn thành một số loại và tạo ra các lô từ đó. Làm thế nào những khối đó nên được tạo ra thực sự tùy thuộc vào cách máy ảnh của bạn di chuyển trên thế giới.

  4. Kích hoạt tính năng instancing trên shaders. Instance cho phép động cơ vẽ nhiều đối tượng (với cùng một lưới) chỉ với một cuộc gọi vẽ. Bạn cần các đối tượng để chia sẻ lưới và chia sẻ shader để làm việc này. Vật liệu có thể khác nhau, nhưng shader phải hỗ trợ tất cả các thuộc tính khác nhau.

    Để làm cho công cụ tạo các lô kết xuất được điều chỉnh tốt hơn, có lẽ bạn muốn nhóm các lưới giống nhau lại với nhau trong cảnh. Ngoài ra, chơi với hàng đợi kết xuất vật liệu sẽ cho bạn kết quả tốt nếu một lưới luôn có cùng vật liệu. Trong quá trình phát triển trò chơi di động mà tôi hiện đang làm việc, tôi đã sử dụng điều này để giảm hơn một nửa số lượng trong các thử nghiệm của mình. Ngoài ra vì Unity 5.6 đảm bảo bạn kiểm tra Enable Instancinghộp kiểm trong tài liệu.

  5. Giữ các ngăn kéo của bạn và các cuộc gọi SetPass nói chung. Đây là các cuộc gọi thô để GPU của bạn vẽ công cụ và chúng có chi phí hoạt động lớn. Việc giảm các ngăn kéo (đó là những gì mà việc tạo khối và kích hoạt đang thực hiện) sẽ làm tăng hiệu suất tổng thể mà CPU của bạn có thể cung cấp vì nó được yêu cầu phải chờ đợi rất ít. Các cuộc gọi SetPass là các thay đổi đối với các shader hiện tại của bạn, vì vậy nếu bạn có nhiều tài liệu khác nhau, bạn sẽ có nhiều cuộc gọi SetPass, điều này cũng khiến CPU phải chờ một chút.

  6. Nếu cảnh của bạn rất lớn và thời gian CPU của bạn đi vào để đi qua tất cả các đối tượng trong cảnh, hãy cố gắng giảm các đối tượng trong cảnh. Nhóm một số cây thay vì đặt chúng một cách vô tình và có chúng như một đối tượng duy nhất. Ngoài ra, hãy đảm bảo rằng bạn không di chuyển cây hoặc các đối tượng cha, vì điều đó làm cho Unity loại bỏ các biến đổi được lưu trong bộ nhớ cache và tính toán lại toàn bộ cây cảnh.

  7. Nếu cảnh của bạn rất lớn và thời gian CPU của bạn vẫn chủ yếu đến Unity đi bộ qua cây cảnh để tạo danh sách để hiển thị tất cả các đối tượng, một điều bạn có thể làm là không để Unity xử lý kết xuất. Nếu bạn có cách tốt hơn để theo dõi các đối tượng có thể vẽ, bạn có thể sử dụng CommandBuffer.DrawMeshInstified hoặc Graphics.DrawMeshInstified để vẽ chúng bằng tay. Tôi sẽ không đi sâu vào chi tiết về vấn đề này vì nó tiên tiến hơn rất nhiều và liên quan đến việc loại bỏ những điều gây cản trở cho chính bạn và không có gì.

Trong trường hợp nếu lô tĩnh hoặc động không hoạt động đúng (bạn có thể thấy bằng cách kiểm tra trình gỡ lỗi khung), bạn cần đảm bảo rằng bạn thực sự đang sử dụng tài liệu dùng chung và không tạo ra các bản sao của tài liệu bằng cách gọi meshRenderer.material. Gọi .materialsẽ tạo bản sao của các tài liệu của bạn và phá vỡ hàng loạt. Sử dụng .sharedMaterialthay thế.

Vì Unity 5.6, bạn có thể sử dụng Trình gỡ lỗi khung để xác định lý do tại sao một số ngăn kéo nhất định không kết hợp với các ngăn kéo trước đó. Điều này sẽ thực sự hữu ích trong khi cố gắng giảm các ngăn kéo trong trò chơi của bạn.

Instaging có những ưu điểm sau so với việc tạo khối tĩnh / động / tùy chỉnh:

  • Sử dụng ít bộ nhớ hơn vì lưới không phải trùng lặp trong bộ nhớ
  • Có thể sử dụng nhiều vật liệu, chỉ cần dùng shader dùng chung
  • Đối tượng có thể được hoạt hình

Ngoài ra, đây là một nhược điểm, đây là một tính năng khá mới trong Unity và có thể hơi không ổn định. Ngoài ra GPU cũ hơn hoặc thiết bị di động không nhất thiết phải hỗ trợ kích hoạt.


1. Vâng, tôi đã thử các LOD, và thật ngạc nhiên, nó thực sự làm cho nó tồi tệ hơn. Tôi đã có 3 biến thể của mỗi cây với số lượng đỉnh thấp hơn một chút và một mặt phẳng với hình ảnh được hiển thị của cây trên đó.
mr-matt

2. Tất cả các cây của tôi được đánh dấu là tĩnh. Theo như tôi biết rằng cho phép tạo khối? Đúng không? Và khi bạn nói vật liệu được chia sẻ, bạn có đơn giản chỉ là, những cái cây có cùng một vật liệu?
mr-matt

3. Loại cải tiến hiệu suất này thực sự sẽ làm gì? Có đáng để thử không?
mr-matt

1
2/3: Theo kinh nghiệm của tôi, Unity không làm rất tốt việc tạo khối động và tạo khối tĩnh làm tăng kích thước bản dựng, vì vậy tôi đã tự thực hiện việc tạo khối và thực hiện kết hợp lưới thời gian tải. Sử dụng kỹ thuật này, tôi đã xoay sở để tạo ra 2500 bản vẽ để nén thành khoảng 300 bản vẽ, điều rất quan trọng đối với trò chơi di động của chúng tôi, nơi các bản vẽ rất quan trọng. Nó tạo ra một chút các đỉnh không cần thiết được tính toán (ngoài màn hình) nhưng nó đáng giá.
Lasse

2
tfw khi bạn đọc một câu hỏi về hiệu suất kém với cây cối và không một từ nào về bảng quảng cáo bị mất
Num Lock

13

Ok, vấn đề đơn giản là tôi đã không sử dụng GI thời gian thực được tính toán trước. Tôi đã kiểm tra điều đó một lúc trước nhưng nó không có tác dụng ngay lập tức nên tôi đã bỏ nó và quên nó đi, và thời gian xử lý ánh sáng cũng quá lâu. Tuy nhiên, nó vừa xử lý xong, và từ của tôi, khung hình / giây của tôi đã tăng gấp 3 lần. Vì vậy, bây giờ, tôi sẽ để nó ở đó và trong tương lai, đảm bảo rằng tôi luôn sử dụng GI tiền sử dụng thời gian thực!

Nếu vẫn còn bất cứ điều gì khác mà tôi có thể làm để cải thiện hiệu suất hơn nữa, xin vui lòng cho tôi biết, tôi sẽ rất biết ơn!


2
Sử dụng Ocinating Culling, ngoài ra nếu cảnh của bạn lớn - hãy xem xét chia nó thành nhiều phần, ví dụ như nhiều địa hình và tải và dỡ chúng.
Mặt trăng thí sinh _Max_

Cho rằng bạn dường như đã giải quyết vấn đề của mình, có lẽ bạn nên chấp nhận câu trả lời này.
Gnemlock
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.