Creating a pick list based on a scan line, then restricting the ray-trace (first collision only - no reflections) to checking that scan list would probably speed things up a bit, as you wouldn’t keep collision testing for objects that weren’t anywhere near the scan line.
It works for ray-casting. I check each vertical scan line for movable objects that might intersect and make a list. Then when rendering the scan line, I only need to check a subset of objects for collisions.
(Actually I firstly check that the object is in front, using dot product, then check it is within draw range. If if passes these tests then it gets added to my first drawList (Same as for normal facet based 3D stuff). Then for each scan line, I filter the first drawList, based on ray casting collisions, to create a second drawList of objects I need to overlay on the vertical scan line. I have a third inner loop, where I draw the terrain at various depths and then overdraw the objects between the terrain billboards. It is the existence of this last inner loop which makes it worthwhile for me, otherwise it wouldn’t save any time. Used in two of my 4k games)
I wonder what would happen if for true pixel-by-pixel ray-tracing, if for each visible object I did a collision check by vertical scan line and a separate collision check by horizontal scan line, resulting in each object having a screen draw box. I suspect that the time taken for each pixel-ray to check the the intersection of the two lists would be longer than the time saved. Maybe using a hash map… Not sure. Interesting idea though I suspect the raytracing fraternity have already dug up any worthwhile optimisations.