Ce n'est pas une réponse complète, mais j'espère que cela vous aidera.
Votre carte / tuile est-elle statique ou dynamique? Si c'est statique, je vous encourage fortement à effectuer un traitement hors ligne et à précalculer autant que possible de cette façon. Vous pouvez le faire comme vous le souhaitez (raycasting ou quelque chose de plus intelligent), mais vous ne vous souciez pas vraiment de faire très vite car tout se passera hors ligne pendant que vous "cuire" vos niveaux. Vous pouvez soit pré-calculer exactement quelles tuiles sont visibles de chaque endroit, soit créer une sorte de régions plus grandes et toutes les tuiles potentiellement visibles de chaque région.
Ensuite, au moment de l'exécution, la requête pour les tuiles visibles doit être très simple et très rapide.
Bien sûr, si vous avez des niveaux créés dynamiquement, cela ne s'applique pas du tout :-)