Tôi đã gặp một số vấn đề với việc xác định hiệu quả nếu các phòng lớn được niêm phong trong phòng 3D dựa trên voxel. Tôi đang ở một thời điểm mà tôi đã cố gắng hết sức để giải quyết vấn đề mà không cần sự giúp đỡ, nhưng không cố gắng đủ để từ bỏ, vì vậy tôi đang yêu cầu sự giúp đỡ.
Để làm rõ, niêm phong rằng không có lỗ trong phòng. Có máy hàn oxy, kiểm tra xem phòng có bịt kín không, và niêm phong tùy thuộc vào mức độ oxy.
Ngay bây giờ, đây là cách tôi đang làm:
- Bắt đầu từ khối phía trên gạch niêm phong (lỗ thông hơi nằm trên mặt trên của miếng bịt), vòng lặp đệ quy qua tất cả 6 hướng liền kề
- Nếu gạch liền kề là một gạch đầy đủ, không chân không, tiếp tục qua vòng lặp
- Nếu gạch liền kề không đầy hoặc là gạch chân không, hãy kiểm tra xem các khối liền kề đó có, đệ quy không.
- Mỗi lần kiểm tra một lát, giảm một bộ đếm
- Nếu số đếm bằng 0, nếu khối cuối cùng liền kề với gạch chân không, hãy trả lại rằng khu vực đó không được niêm phong
- Nếu số đếm chạm 0 và khối cuối cùng không phải là khối chân không hoặc vòng lặp đệ quy kết thúc (không có gạch chân không nào) trước khi bộ đếm bằng 0, khu vực được niêm phong
Nếu khu vực không được niêm phong, hãy chạy lại vòng lặp với một số thay đổi:
- Kiểm tra các khối liền kề cho gạch "không khí thoáng khí" thay vì gạch chân không
- Thay vì sử dụng bộ đếm giảm dần, hãy tiếp tục cho đến khi không tìm thấy gạch "không khí dễ thở" liền kề nào.
- Khi vòng lặp kết thúc, đặt từng khối được kiểm tra thành một khối chân không.
Đây là mã tôi đang sử dụng: http://pastebin.com/NimyKncC
Vấn đề:
Tôi đang chạy kiểm tra này cứ sau 3 giây, đôi khi một người niêm phong sẽ phải vòng qua hàng trăm khối và một thế giới rộng lớn với nhiều máy hàn oxy, những vòng lặp đệ quy này cứ sau vài giây có thể rất khó khăn với CPU.
Tôi đã tự hỏi nếu bất cứ ai có nhiều kinh nghiệm hơn với tối ưu hóa có thể giúp tôi, hoặc ít nhất là chỉ cho tôi đi đúng hướng. Cảm ơn nhiều.