Khái niệm
Về cơ bản, một biểu đồ cảnh không gì khác hơn là một biểu đồ chu kỳ hai hướng, dùng để biểu diễn một tập hợp các cấu trúc các mối quan hệ không gian.
Động cơ trong tự nhiên có xu hướng bao gồm các tính năng khác vào biểu đồ cảnh, như đã lưu ý. Cho dù bạn thấy rằng thịt hay bò có thể phụ thuộc vào kinh nghiệm của bạn với các công cụ và thư viện ngoài kia.
Giữ cho nó nhẹ
Tôi thích kiểu Unity3D có nút đồ thị cảnh của bạn (mà trái tim của nó là cấu trúc liên kết chứ không phải cấu trúc không gian / địa hình) vốn đã bao gồm các tham số và chức năng không gian. Trong công cụ của tôi, các nút của tôi thậm chí còn nhẹ hơn Unity3D, nơi chúng thừa hưởng rất nhiều thành viên rác không cần thiết từ các siêu giao diện / giao diện được triển khai: Đây là những gì tôi có - nhẹ như bạn có thể nhận được:
- thành viên con trỏ cha / con.
- các thành viên tham số không gian trước biến đổi: vị trí xyz, cao độ, ngáp và cuộn.
- một ma trận biến đổi; các ma trận trong chuỗi phân cấp có thể nhân lên rất nhanh và dễ dàng bằng cách đi bộ lên / xuống cây theo cách đệ quy, cung cấp cho bạn các phép biến đổi không gian phân cấp là đặc điểm chính của biểu đồ cảnh;
- một
updateLocal()
phương thức chỉ cập nhật ma trận biến đổi của nút này
- một
updateAll()
phương thức cập nhật ma trận biến đổi này và tất cả các ma trận con cháu
... Tôi cũng bao gồm các phương trình logic chuyển động và do đó các thành viên vận tốc / gia tốc (tuyến tính & góc) trong lớp nút của tôi. Bạn có thể từ bỏ điều đó và xử lý nó trong bộ điều khiển chính của bạn thay vào đó nếu bạn muốn. Nhưng đó là nó - thực sự rất nhẹ. Hãy nhớ rằng, bạn có thể có những thứ này trên hàng ngàn thực thể. Vì vậy, như bạn đã đề nghị, giữ cho nó nhẹ.
Xây dựng hệ thống phân cấp
Bạn nói gì về một biểu đồ cảnh tham chiếu các biểu đồ cảnh khác ... Tôi đang chờ đến phần cuối? Tất nhiên họ làm. Đó là công dụng chính của họ. Bạn có thể thêm bất kỳ nút nào vào bất kỳ nút nào khác và các phép biến đổi sẽ tự động xảy ra trong không gian cục bộ của biến đổi mới. Tất cả những gì bạn đang làm là thay đổi một con trỏ, không giống như bạn đang sao chép dữ liệu xung quanh! Bằng cách thay đổi một con trỏ, sau đó bạn có một biểu đồ cảnh sâu hơn. Nếu sử dụng Proxy làm cho mọi thứ hiệu quả hơn thì bằng mọi cách, nhưng tôi chưa bao giờ thấy sự cần thiết.
Tránh Logic liên quan đến kết xuất
Hãy quên việc kết xuất khi bạn viết lớp nút biểu đồ cảnh, hoặc bạn sẽ tự làm bối rối mọi thứ. Tất cả vấn đề là bạn có một mô hình dữ liệu - cho dù đó là biểu đồ cảnh hay không không quan trọng - và một số trình kết xuất sẽ kiểm tra mô hình dữ liệu đó và kết xuất các đối tượng trên thế giới, cho dù đó là trong 1, 2 , 3 hoặc 7 chiều. Điểm tôi đang làm là: Không làm ô nhiễm biểu đồ cảnh của bạn bằng logic kết xuất. Một biểu đồ cảnh là về cấu trúc liên kết và địa hình - tức là các đặc điểm kết nối và không gian. Đây là trạng thái thực sự của mô phỏng và tồn tại ngay cả khi không có kết xuất (có thể ở bất kỳ dạng nào dưới ánh mặt trời từ góc nhìn người thứ nhất đến biểu đồ thống kê đến mô tả văn bản). Các nút không trỏ đến các đối tượng liên quan đến kết xuất - tuy nhiên điều ngược lại cũng có thể đúng. Cũng xem xét điều này: Không phải mọi nút đồ thị cảnh trong toàn bộ cây của bạn sẽ được hiển thị. Nhiều người sẽ chỉ là container. Vậy tại sao thậm chí phân bổ bộ nhớ cho một đối tượng con trỏ để kết xuất? Ngay cả một thành viên con trỏ không bao giờ được sử dụng, vẫn chiếm bộ nhớ. Vì vậy, đảo ngược hướng con trỏ: Ví dụ liên quan đến kết xuất tham chiếu mô hình dữ liệu (có thể, hoặc bao gồm, nút biểu đồ cảnh của bạn), KHÔNG ngược lại. Và nếu bạn muốn một cách dễ dàng để chạy qua danh sách bộ điều khiển của bạn mà vẫn có quyền truy cập vào chế độ xem liên quan, thì hãy sử dụng từ điển / hashtable, tiếp cận thời gian truy cập đọc O (1). Bằng cách đó, không có ô nhiễm và logic mô phỏng của bạn không quan tâm đến trình kết xuất nào đang diễn ra, điều này làm cho ngày và đêm của bạn được mã hóa Vậy tại sao thậm chí phân bổ bộ nhớ cho một đối tượng con trỏ để kết xuất? Ngay cả một thành viên con trỏ không bao giờ được sử dụng, vẫn chiếm bộ nhớ. Vì vậy, đảo ngược hướng con trỏ: Ví dụ liên quan đến kết xuất tham chiếu mô hình dữ liệu (có thể, hoặc bao gồm, nút biểu đồ cảnh của bạn), KHÔNG ngược lại. Và nếu bạn muốn một cách dễ dàng để chạy qua danh sách bộ điều khiển của bạn mà vẫn có quyền truy cập vào chế độ xem liên quan, thì hãy sử dụng từ điển / hashtable, tiếp cận thời gian truy cập đọc O (1). Bằng cách đó, không có ô nhiễm và logic mô phỏng của bạn không quan tâm đến trình kết xuất nào đang diễn ra, điều này làm cho ngày và đêm của bạn được mã hóa Vậy tại sao thậm chí phân bổ bộ nhớ cho một đối tượng con trỏ để kết xuất? Ngay cả một thành viên con trỏ không bao giờ được sử dụng, vẫn chiếm bộ nhớ. Vì vậy, đảo ngược hướng con trỏ: Ví dụ liên quan đến kết xuất tham chiếu mô hình dữ liệu (có thể, hoặc bao gồm, nút biểu đồ cảnh của bạn), KHÔNG ngược lại. Và nếu bạn muốn một cách dễ dàng để chạy qua danh sách bộ điều khiển của bạn mà vẫn có quyền truy cập vào chế độ xem liên quan, thì hãy sử dụng từ điển / hashtable, tiếp cận thời gian truy cập đọc O (1). Bằng cách đó, không có ô nhiễm và logic mô phỏng của bạn không quan tâm đến trình kết xuất nào đang diễn ra, điều này làm cho ngày và đêm của bạn được mã hóa Và nếu bạn muốn một cách dễ dàng để chạy qua danh sách bộ điều khiển của bạn mà vẫn có quyền truy cập vào chế độ xem liên quan, thì hãy sử dụng từ điển / hashtable, tiếp cận thời gian truy cập đọc O (1). Bằng cách đó, không có ô nhiễm và logic mô phỏng của bạn không quan tâm đến trình kết xuất nào đang diễn ra, điều này làm cho ngày và đêm của bạn được mã hóa Và nếu bạn muốn một cách dễ dàng để chạy qua danh sách bộ điều khiển của bạn mà vẫn có quyền truy cập vào chế độ xem liên quan, thì hãy sử dụng từ điển / hashtable, tiếp cận thời gian truy cập đọc O (1). Bằng cách đó, không có ô nhiễm và logic mô phỏng của bạn không quan tâm đến trình kết xuất nào đang diễn ra, điều này làm cho ngày và đêm của bạn được mã hóathế giới dễ dàng hơn.
Đối với việc loại bỏ, tham khảo lại ở trên. Loại bỏ khu vực quan tâm là một khái niệm logic mô phỏng. Đó là, bạn không xử lý thế giới bên ngoài khu vực này (thường là hình hộp, hình tròn hoặc hình cầu). Điều này diễn ra trong vòng điều khiển chính / vòng lặp trò chơi, trước khi kết xuất. Mặt khác, việc loại bỏ sự thất vọng hoàn toàn liên quan đến kết xuất. Vì vậy, quên đi việc loại bỏ ngay bây giờ. Nó không liên quan gì đến đồ thị cảnh, và bằng cách tập trung vào nó, bạn sẽ che khuất mục đích thực sự của những gì bạn đang cố gắng đạt được.
Một lưu ý cuối cùng ...
Tôi có được cảm giác mạnh mẽ mà bạn đang đến từ nền Flash (cụ thể là AS3), với tất cả các chi tiết về kết xuất được bao gồm ở đây. Có, mô hình Flash Stage / DisplayObject bao gồm tất cả logic kết xuất như là một phần của khung cảnh. Nhưng Flash đưa ra rất nhiều giả định mà bạn không nhất thiết muốn đưa ra. Đối với một công cụ trò chơi hoàn chỉnh, tốt hơn là không kết hợp cả hai, vì lý do hiệu suất, sự thuận tiện và kiểm soát độ phức tạp của mã thông qua SoC thích hợp .