線分対線分だと
全ての線分と範囲チェックするコストと、
全ての線分と判定するコストが、
あんまり違わないかもね…やってみないとわからないけど。

線分の長さが一定の長さ未満なら(必要なら分割しておく)
その長さで縦横でエリア分割して、
そのエリアの線分のリストを二次元配列に登録して、
限られたエリア(2×2くらい?)の線分だけと判定するとか…

あと銃弾が機関銃かなんかなら、
先頭の弾丸が当たらなかったら、
二発目以降は判定をしないで良い…かもしれない。
まぁこれは自分が3Dでやった方法なんで、
弾丸を目で追いやすい2Dだとバグ報告されるかもしれんがww