Tôi đang cố gắng viết một công cụ voxel nhỏ vì nó thú vị, nhưng đấu tranh để tìm ra cách tốt nhất để lưu trữ các voxels thực tế. Tôi nhận thức được rằng tôi sẽ cần một số loại vì vậy tôi không cần phải có toàn bộ thế giới trong bộ nhớ và tôi nhận thức được rằng tôi cần kết xuất chúng với hiệu suất hợp lý.
Tôi đã đọc về octrees và từ những gì tôi hiểu, nó bắt đầu bằng 1 khối lập phương và trong khối đó có thể có thêm 8 khối nữa, và trong tất cả 8 khối đó có thể là 8 khối khác, v.v. Nhưng tôi không nghĩ rằng nó phù hợp với động cơ voxel của tôi bởi vì khối / vật phẩm voxel của tôi tất cả sẽ có cùng kích thước.
Vì vậy, một lựa chọn khác là chỉ cần tạo một mảng có kích thước 16 * 16 * 16 và có một mảng, và bạn điền nó với các mục. Và những phần không có vật phẩm nào sẽ có 0 là giá trị (0 = không khí). Nhưng tôi sợ điều này sẽ lãng phí rất nhiều bộ nhớ và sẽ không nhanh lắm.
Sau đó, một tùy chọn khác là một vectơ cho mỗi khối, và điền nó với các hình khối. Và khối lập phương giữ vị trí của nó trong khối. Điều này giúp tiết kiệm bộ nhớ (không có khối không khí), nhưng làm cho việc tìm kiếm một khối ở một vị trí cụ thể chậm hơn rất nhiều.
Vì vậy, tôi thực sự không thể tìm thấy một giải pháp tốt và tôi hy vọng ai đó có thể giúp tôi với điều đó. Vậy bạn sẽ sử dụng cái gì và tại sao?
Nhưng một vấn đề khác là kết xuất. Chỉ cần đọc từng đoạn và gửi nó đến GPU bằng OpenGL thì dễ, nhưng rất chậm. Tạo một lưới trên mỗi khối sẽ tốt hơn, nhưng điều đó có nghĩa là mỗi lần tôi phá vỡ một khối, tôi phải xây dựng lại toàn bộ khối có thể mất một chút thời gian gây ra một tiếng nấc nhỏ nhưng đáng chú ý, điều mà rõ ràng tôi không muốn. Vì vậy, sẽ khó hơn. Vì vậy, làm thế nào tôi sẽ làm cho các hình khối? Chỉ cần tạo tất cả các hình khối trong một bộ đệm đỉnh trên mỗi đoạn và kết xuất nó và có thể thử đặt nó vào một luồng khác, hoặc có cách nào khác không?
Cảm ơn!