Làm thế nào để một Engine như Nguồn thực thể xử lý?


9

Trên công cụ Nguồn (và đó là tiền thân, goldsrc, trận động đất), các đối tượng trò chơi được chia thành hai loại, thế giới và thực thể. Thế giới là hình học bản đồ và các thực thể là người chơi, hạt, âm thanh, điểm số, v.v. (đối với Công cụ Nguồn).

Mỗi thực thể có một chức năng suy nghĩ , làm tất cả logic cho thực thể đó.

Vì vậy, nếu mọi thứ cần được xử lý đến từ một lớp cơ sở có chức năng suy nghĩ, thì công cụ trò chơi có thể lưu trữ mọi thứ trong danh sách và, trên mỗi khung, lặp qua nó và gọi hàm đó.

Thoạt nhìn, ý tưởng này là hợp lý, nhưng nó có thể chiếm quá nhiều tài nguyên, nếu trò chơi có nhiều thực thể ..

Vậy, làm thế nào để một công cụ như Source chăm sóc (xử lý, cập nhật, vẽ, v.v.) của các đối tượng trò chơi?


2
Tại sao nó quan trọng như thế nào <some commercial engine>?
Vịt Cộng sản

8
@ Vịt Cộng sản, tôi nghĩ câu hỏi thực sự ở đây là làm thế nào một động cơ thành công làm điều đó để tôi có thể học hỏi từ họ?
subb

Câu trả lời:


5

Chà, gần như không có cách nào khác để làm điều đó - bạn sẽ phải lặp lại và gọi think()cho mọi thực thể ít nhất một vài khung hình một lần.

Bạn có thể đặt các thực thể trên luồng của riêng chúng, nhưng sau đó bạn có toàn bộ cơn ác mộng đồng bộ hóa trạng thái, điều này chắc chắn không đáng.

Thoạt nhìn, ý tưởng này là hợp lý, nhưng nó có thể chiếm quá nhiều tài nguyên, nếu trò chơi có nhiều thực thể ..

Đó là lý do tại sao công cụ Nguồn đặt giới hạn cứng cho số lượng thực thể có thể tồn tại cùng một lúc : 4096 thực thể, trong đó chỉ một nửa (2048) có thể được nối mạng. Vượt qua một trong những giới hạn này, và trò chơi sẽ sụp đổ.

Đó cũng là lý do tại sao, khi tạo bản đồ, họ khuyên bạn không nên sử dụng hơn 800 thực thể.


Không phải 2 ^ 12 chức năng gọi vẫn là số LỚN cho mỗi khung?
JulioC

@ Júlio: Chà, ở tốc độ 60 khung hình / giây, chức năng gọi là 246k mỗi giây - đó là rất nhiều, nhưng chắc chắn là có thể thực hiện được trên phần cứng ngày nay. Tuy nhiên, hãy nhớ rằng đây là mức tối đa tuyệt đối được phép trước khi Công cụ nguồn gặp sự cố - thông thường, có ít thực thể hơn trên bản đồ.
BlueRaja - Daniel Pflughoeft

5
Các thực thể có thời gian kế tiếp, hàm think không được gọi là everyframe và không dành cho tất cả các thực thể. Tôi nhớ rằng đối với trận động đất 2, thời gian suy nghĩ tối thiểu là 0,1 (100msec), chỉ 10fps cho xử lý thực thể.
bcsanches

"Bạn có thể đặt các thực thể trên luồng của riêng chúng, nhưng sau đó bạn có toàn bộ cơn ác mộng đồng bộ hóa trạng thái, điều này chắc chắn không đáng." Kiểm tra các slide Killzone 4 này nếu bạn nghĩ nó không xứng đáng: de.sl slideshoware.net/jrouwe/iêu
Tara

3

Những bước bạn đề cập nhiều khả năng được thực hiện trong các động cơ riêng biệt. Nó chỉ là các công cụ trò chơi đơn giản thường có chúng trong một lần. Trình tự của bạn

for each object
    do physics
    do game logic
    draw

trở thành

call physics subsystem
call game logic subsystem
call drawing subsystem

Engine Engine đảm nhiệm các vị trí và kích cỡ.

Game Logic Engine đảm nhiệm việc diễn giải những gì Engine Engine đã thay đổi (anh ta có thể cản trở một số điểm ...), mục tiêu của các nhân vật và hành vi họ nên làm là gì , anh ta chạy các kịch bản theo lịch trình ( chức năng suy nghĩ này ).

Công cụ Vẽ vẽ ra những vật thể có thể nhìn thấy và anh ta biết những vật thể nào có thể nhìn thấy được vì loại động cơ Quake ở đây (xem phần Vẽ).

Lời khuyên của tôi cho Bạn là nghiên cứu cách mô phỏng được thực hiện thay vì các công cụ trò chơi. Có một nền văn hóa đại chúng liên quan đến phát triển trò chơi và công cụ trò chơi được thực hiện bằng các ngôn ngữ bắt buộc (vì truyền thống & tốc độ); Vì vậy, tôi đã giác ngộ hơn khi có được sách giáo khoa tốt (đúng hơn là lý thuyết) và THEN nhìn vào động cơ (thực hành) thay vì nhìn vào động cơ và giải đố hàng giờ họ đã làm như thế nào.

Vật lý

Toàn bộ khái niệm lặp lại tất cả các thực thể và làm {think, draw} có thể sẽ dẫn đến các vấn đề. Sẽ có xung đột và như vậy. Tôi tin rằng Valve có Havok và tôi đoán Havok chăm sóc vật lý đủ chính xác.

Suy nghĩ

Chức năng Think được chạy khi một thời gian trong trò chơi bằng với thời gian trong nextthink . Nó hoạt động theo cách này trong công cụ Quake và công cụ Quake là cơ sở cho công cụ Half Life. Nó KHÔNG được chạy mọi lúc.

Trong nội bộ, nó phải là một bước lặp đơn giản thông qua một danh sách các thực thể và kiểm tra xem thời gian đã trôi qua để gọi hàm think. Độ phức tạp thời gian sẽ là O (N), trong đó N là số lượng thực thể.

Nếu có một số lượng lớn các thực thể Bạn nên đo xem nó sẽ cải thiện bao nhiêu khung hình / giây. Lưu ý rằng vì luật của Amdahl nên nó có khả năng tăng tốc vô hình. Ý tôi là, Bạn chỉ cần lặp lại máng tất cả các mục và giảm và kiểm tra một số.

Tôi sẽ tăng tốc nó bằng cách sắp xếp các thực thể theo nextthink (tạo danh sách các con trỏ tới các thực thể và sắp xếp nó mỗi lần; không phải mảng các thực thể, bởi vì các thực thể có thể thay đổi nextthink của chúng bất cứ lúc nào, do đó, việc sắp xếp lại chúng trong mảng sẽ thay O (N) thay vì O (N) 1) trong danh sách).

Bạn cũng nên xem lịch trình O (1) trong Linux .

Vẽ tranh

Động cơ vẽ những gì có thể nhìn thấy từ khu vực mà camera. Cấp trò chơi được phân vùng thành một cây và một khu vực là lá của cây đó. Tôi sẽ không làm phiền bạn với các chi tiết về nó ... Vì vậy, nếu một thực thể được nhìn thấy, nó sẽ được đưa vào một tập hợp các thực thể có thể nhìn thấy và chúng được rút ra.

Họ lưu trữ những khu vực có khả năng nhìn thấy khu vực. Nó được gọi là "tập hợp tiềm năng có thể nhìn thấy", viết tắt là PVS . Có hình dung về PVS , viên nang màu xanh lá cây là người chơi và xung quanh anh ta được hiển thị những gì PVS của anh ta chứa.


2

Vì vậy, nếu mọi thứ cần được xử lý đến từ một lớp cơ sở có chức năng suy nghĩ, thì công cụ trò chơi có thể lưu trữ mọi thứ trong danh sách và, trên mỗi khung, lặp qua nó và gọi hàm đó.

Thoạt nhìn, ý tưởng này là hợp lý, nhưng nó có thể chiếm quá nhiều tài nguyên, nếu trò chơi có nhiều thực thể ..

Trên thực tế việc đưa mọi thứ vào một danh sách lớn thường ít hơn mong muốn; nếu bạn đã nhóm các thực thể trong danh sách dựa trên, ví dụ, loại của chúng, bạn có thể phân phối xử lý tốt hơn trên nhiều luồng. Ví dụ: nếu bạn biết tất cả các thực thể loại Foo không bao giờ tương tác với bất kỳ thực thể nào khác trong giai đoạn mô phỏng, bạn có thể giảm tải chúng hoàn toàn. Nếu chúng nằm rải rác trên một số danh sách số ít thì điều này sẽ khó thực hiện hơn nhiều.

Bạn thậm chí không nhất thiết phải lấy được mọi thứ từ một lớp cơ sở chung tại thời điểm đó; Nguồn đi quá mức với lạm dụng thừa kế cho những gì có thể được thực hiện như dữ liệu về khía cạnh đó.

Tất nhiên bạn sẽ luôn có giới hạn trên về số lượng thực thể bạn có thể xử lý trên mỗi khung, ngay cả khi bạn bắt đầu giảm tải công việc cho các lõi khác. Không có cách nào khác, bạn chỉ cần có ý tưởng về giới hạn đó trong quá trình thực hiện của mình và thực hiện các bước để giảm bớt nó (loại bỏ các giai đoạn xử lý thích hợp trên các đối tượng không cần đến chúng, tránh tình trạng quá mức trong các đối tượng, et cetera).


1

Những gì bạn phải tính đến và điều này tuân theo lối suy nghĩ của các câu trả lời trước đó là hiệu suất của bạn cũng sẽ được thực hiện khi và cách bạn gọi các chức năng suy nghĩ này.

Nhìn vào liên kết bạn đã đăng trên công cụ nguồn, bạn cũng có thể đọc rằng bạn có thể thiết lập thời gian suy nghĩ và bối cảnh suy nghĩ khác nhau cho mỗi thực thể của mình, bên cạnh giới hạn cứng rõ ràng mà ai đó đã chỉ ra, đây sẽ là chìa khóa để đạt được hiệu suất cao hơn với số lượng thực thể cao hơn, bằng cách tạo các bản cập nhật từng bước để xử lý hiệu năng đói qua nhiều khung thực hiện hoặc bằng cách loại bỏ xử lý không cần thiết tùy thuộc vào bối cảnh hiện tại (nghĩa là các thực thể ở quá xa hoặc vượt quá nhận thức của người chơi không cần cùng một mức độ "nghĩ chi tiết" như nhân vật ở gần một người chơi chỉ đơn giản wont thấy một nhân vật 2 dặm chọn mũi của mình).

Và có nhiều mức độ tối ưu cụ thể khác tùy thuộc vào logic và tình huống trò chơi cụ thể của bạn.


"một cầu thủ chỉ đơn giản wont thấy một nhân vật 2 dặm chọn mũi của mình" Haha! Nhưng tại sao không ai chỉ ra rằng sử dụng các chức năng ảo là rất chậm?
Tara
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.