Tôi nên lưu trữ các thực thể trò chơi động như thế nào để lựa chọn dựa trên khu vực hiệu quả?


7

Trong trò chơi dựa trên khối 2d của tôi, tôi đang cố gắng thực hiện cấu trúc dữ liệu sẽ lưu trữ các thực thể theo cách có khả năng:

  • Lựa chọn trực tiếp dựa trên tọa độ.

  • Lặp lại

  • Lặp lại giới hạn trong một khu vực

Tôi nghĩ về những giải pháp này:

Đối với 1,3 tôi nghĩ rằng một mảng tọa độ 2 chiều của các thực thể sẽ phù hợp nhưng tôi đã có một mảng tọa độ 2 chiều của các khối và cũng không muốn có một tọa độ khác. Và giải pháp này không phù hợp với 2, sẽ có quá nhiều khoảng trống khi lặp lại mảng và đây là một sự mất hiệu suất.

Giải pháp tiếp theo tôi nghĩ đơn giản là sử dụng một mảng và thêm các thực thể mới chỉ đơn giản bằng mảng [độ dài], đây là hiệu suất khôn ngoan cho 2 nhưng thật khó để thực hiện 1 và 3 (sử dụng vòng lặp for mọi lúc để kiểm tra xem tôi có va chạm với không một thực thể (duh)).

Giải pháp cuối cùng chỉ đơn giản là thêm dữ liệu thực thể vào mảng 2 chiều blockList (đã tồn tại) của tôi, cách này có các ưu và nhược điểm gần giống với giải pháp đầu tiên.

Và luôn có sự thay thế của việc sử dụng các giải pháp thứ nhất và thứ hai cùng nhau bằng cách làm cho chúng tham chiếu đến cùng một đối tượng.


Tôi nên sử dụng một trong những giải pháp nào, vì tất cả chúng đều có ưu và nhược điểm và tôi phải sử dụng ít không gian hơn, vì bản đồ trò chơi không được sửa.


Tôi cảm thấy như bạn có thể nhận được thuật ngữ hệ thống thực thể nhầm lẫn. Tôi có đúng không khi nói rằng bạn đang yêu cầu một cách lưu trữ hiệu quả các vị trí đối tượng cho các truy vấn không gian?
Anko

Rất tiếc, xin lỗi bạn đã đúng.
MindlessRanger

Không phải lo lắng, nó xảy ra. :) Tôi đã tìm thấy một số câu hỏi tương tự về việc cải thiện hiệu suất phát hiện va chạmthực hiện hàm băm không giansự khác biệt giữa băm không gian và tứ giác .
Anko

Bạn đã kiểm tra rằng phương pháp hiện tại của bạn thực sự quá chậm? Theo kinh nghiệm của tôi, việc lặp đi lặp lại có thể lên tới hàng trăm đối tượng là đủ nhanh để thực hiện với tốc độ tương tác trong JS trên hầu hết các thiết bị.
Anko

@Anko Hiện tại, tôi không có bất kỳ phương pháp nào để lưu trữ các thực thể ', (vừa hoàn thành hàm tạo Thực thể) nhưng đó không phải là vấn đề về tốc độ, tôi đã giới hạn các chức năng cập nhật và kết xuất cho chế độ xem của người dùng. Vấn đề của tôi là: Tôi đã có một lưới để lưu trữ các khối và không muốn sử dụng lưới để lưu trữ các thực thể, bởi vì khoảng cách giữa các thực thể là lớn và vì điều này sẽ có quá nhiều khóa mảng trống nếu tôi sử dụng lưới, tôi chỉ nhìn vào một giải pháp khác nhưng sau khi thấy các kỹ thuật khác cho hệ thống lưu trữ không gian, tôi nghĩ rằng sử dụng lưới là lựa chọn tốt nhất.
MindlessRanger

Câu trả lời:


1

Một tùy chọn khác có thể là sử dụng cấu trúc tứ giác hoặc nếu bạn có nhiều đối tượng chuyển động thì một hàm băm không gian .


1
Nhưng tôi sẽ không phải xây dựng lại cây trong mỗi bản cập nhật chứ?
MindlessRanger

Không nhìn thấy băm không gian, nhìn vào nó.
MindlessRanger

1
Còn lưới, phân cấp vùng giới hạn, phân vùng không gian nhị phân, cây kd, ... thì sao?
Exilyth

0

Trong trò chơi, tôi tạo ra tôi lưu trữ các thực thể (thực tế là các thành phần của chúng) trong một mảng (cấu trúc của mảng) và sau đó tôi tạo một lưới không gian chứa, trong mỗi ô, chỉ mục mảng của các thực thể thuộc khu vực đó; và vâng, bạn phải xây dựng lại mọi khung hình cho các đối tượng động, nhưng các hướng dẫn mà tôi đã thấy (mà tôi nhớ) thực hiện điều này, đặc biệt là cho quad / octrees. Điều đó nhanh chóng cho phép lặp đơn giản và lựa chọn khu vực và trong trường hợp xây dựng lại lưới chỉ là một 'mảng.push_back' cho mỗi thực thể mỗi khung.

Bạn có thể xem xét việc sắp xếp các thực thể trong mảng dựa trên vị trí của chúng, để tránh bỏ lỡ bộ đệm khi chọn chúng theo khu vực (nếu bạn có tất cả dữ liệu được nhóm lại với nhau, bạn tránh nhảy vào đây và trên RAM). Nhưng bạn không cần phải thực hiện từng khung hình đó, có thể giữ một chỉ số về 'sự hỗn loạn của hệ thống', dựa trên mức độ các thực thể di chuyển, bao nhiêu người chết và cứ thế, và thực hiện sắp xếp khi quá cao (thử và hồ sơ nếu điều đó là cần thiết)

Tạo các mảng khác nhau cho các khu vực khác nhau Tôi nghĩ không phải là một ý tưởng hay, cả về việc duy trì mã và hiệu suất của bạn, do việc tiếp tục hoán đổi các thực thể xen kẽ một khu vực và khu vực khác (và rất nhiều dữ liệu di chuyển). Có lẽ, tôi chưa bao giờ thử phương pháp này, bạn có thể đi theo cách này nếu bạn có nhiều khu vực khác nhau không giao tiếp quá nhiều, nhưng tôi không nghĩ đó là trường hợp của bạn.


0

Tôi đã sử dụng 2 thủ thuật bẩn đơn giản.

1 - Cấp chia cho "khối". Giả sử các đơn vị trừu tượng 10x10 (CHUNK_SIZE = 10). Vì vậy, cấp độ của bạn gần ch1010. Giả sử mảng chunk - đó là một loại bản đồ có độ chi tiết thấp khi một vài phép thuật có thể nằm trong một ô. Mỗi khi thực thể di chuyển (hoặc cứ sau 10 tích tắc trò chơi), tôi lại tính toán vị trí chunk mới (như enity.chunk_x = enity.x / CHUNK_SIZE). Sau đó, nếu vị trí chunk cho thực thể đã được thay đổi (chúng tôi đã chuyển sang một đoạn khác), tôi xóa liên kết khỏi đoạn trước đó và đặt liên kết vào thực thể.

Bây giờ, giả sử, bạn đã có thể nhìn thấy 2 khối xung quanh. Nhanh hơn nhiều để nhìn vào các khối gần, hơn là đi qua một loạt các thực thể.

2 - danh sách quan sát: mỗi nhân vật có thể chơi có thể quan sát các thực thể xung quanh, có thể giữ và quản lý danh sách quan sát. (sử dụng mánh bẩn thứ 1).

Đối với javascript, techique này là quá đủ.

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.