Tôi đang nghiên cứu một phần nhỏ của công cụ trò chơi của mình và tự hỏi cách tối ưu hóa một số phần.Cấu trúc dữ liệu hai chiều cho tình huống này
Tình hình là khá đơn giản và nó là như sau:
- Tôi có một bản đồ của
Tile
s (được lưu trữ trong một mảng bi-chiều) (~ gạch 260k, nhưng giả nhiều hơn nữa) - tôi có một danh sách các
Item
s mà luôn luôn là ít nhất và nhiều nhất là một gạch - một
Tile
logic có thể chứa lượng vô hạn củaItem
s - trong thực hiện trò chơi nhiều
Item
s là liên tục ly tạo ra và họ bắt đầu từ riêng của họTile
- Mỗi
Item
liên tục thay đổiTile
của mình cho một trong những người hàng xóm (lên, phải, xuống, sang trái)
Đến nay mỗi Item
có một tham chiếu đến thực tế của nó Tile
và tôi chỉ giữ một danh sách các mục. Mỗi lần di chuyển Item
đến một ô liền kề, tôi chỉ cập nhật item->tile = ..
và tôi ổn. Điều này hoạt động tốt nhưng nó là một chiều.
Trong khi mở rộng động cơ, tôi nhận ra rằng tôi phải tìm tất cả các vật phẩm có trong ngói nhiều lần và điều này làm giảm hiệu suất (đặc biệt là trong một số trường hợp, từng cái một).
Điều này có nghĩa là tôi muốn tìm cấu trúc dữ liệu phù hợp để tìm tất cả các mục của Tile
tốt hơn so với O (n), nhưng tôi muốn tránh nhiều phí trong "di chuyển từ một ô đến một "giai đoạn (bây giờ nó chỉ là chỉ định một con trỏ, tôi muốn tránh làm nhiều hoạt động ở đó, vì nó khá thường xuyên).
Tôi đang suy nghĩ về cấu trúc dữ liệu tùy chỉnh để khai thác thực tế là các mục luôn di chuyển đến ô lân cận nhưng hiện tôi đang dò dẫm trong bóng tối! Bất kỳ lời khuyên nào sẽ được đánh giá cao, ngay cả những cách tiếp cận khôn ngoan hoặc khó hiểu. Thật không may, tôi không thể lãng phí bộ nhớ vì vậy một sự cân bằng tốt là cần thiết.
Tôi đang phát triển nó trong C++ với STL nhưng không có Tăng cường. (Có, tôi biết về multimap
, nó không thỏa mãn tôi, nhưng tôi sẽ cố gắng nếu tôi không tìm thấy bất cứ điều gì tốt hơn)
Bản đồ 'Tile' đã là một con trỏ bidimensional thô, ví dụ: 'Tile map [WIDTH] [HEIGHT]' vì vậy tôi có quyền truy cập ngẫu nhiên vào toàn bộ bản đồ, nhưng tôi không muốn có một danh sách các mục cho mỗi ô vì các mục này thưa thớt và không chiếm một vùng lớn của bản đồ .. – Jack
Điều đó nghe có vẻ như thiết kế tồi. Đầu tiên, loại bỏ các mảng kích thước cố định, và sử dụng một vector với một giao diện thích hợp, thứ hai làm cho 'Tile' sở hữu các mục của nó bằng cách cho nó vector hoặc bất cứ thứ gì cục bộ. – 111111
Nó không phải là một thiết kế xấu, bản đồ là cần thiết cho toàn thế giới. Mỗi ô phải tồn tại không phải vì mục mà vì nhiều thứ khác. Như tôi đã nói đây chỉ là một phần nhỏ của động cơ :) – Jack