To nie jest pełna odpowiedź, ale mam nadzieję, że pomoże.
Czy twoja mapa / kafelek jest ustawiony statycznie czy dynamicznie? Jeśli jest statyczny, zdecydowanie zachęcam do przetwarzania offline i wstępnego obliczania tak dużo, jak to możliwe. Możesz to zrobić w dowolny sposób (raycasting lub coś mądrzejszego), ale tak naprawdę nie zależy ci na robieniu bardzo szybko, ponieważ wszystko to stanie się offline, gdy „upiec” swoje poziomy. Możesz albo dokładnie obliczyć, które kafelki są widoczne z każdego miejsca, albo utworzyć jakiś większy region i wszystkie kafelki potencjalnie widoczne z każdego regionu.
Następnie w czasie wykonywania zapytanie o widoczne kafelki powinno być bardzo proste i bardzo szybkie.
Oczywiście, jeśli masz dynamicznie tworzone poziomy, nie ma to w ogóle zastosowania :-)