Я играю с трассировщиком лучей Haskell и в настоящее время использую реализацию BVH, которая подчеркивает простое двоичное дерево для хранения иерархии,
data TreeBvh
= Node Dimension TreeBvh TreeBvh AABB
| Leaf AnyPrim AABB
где Размерность либо X
, Y
или Z
(используется для более быстрого обхода), а AABB - это мой тип ограничивающей рамки, выровненной по оси. Это работает достаточно хорошо, но я Я действительно хотел бы получить это как можно быстрее. Итак, моим следующим шагом (при использовании C / C ++) будет использование этого дерева для построения плоского представления, в котором узлы хранятся в массиве, «левый» дочерний элемент сразу следует за родительским узлом и индексом правого дочернего элемента родительского хранится вместе с родителем, поэтому у меня есть что-то вроде этого:
data LinearNode
= LinearNode Dimension Int AABB
| LinearLeaf AnyPrim AABB
data LinearBvh
= MkLinearBvh (Array Int LinearNode)
Я еще не пробовал это, но боюсь, что производительность все равно будет ниже номинальной, потому что я не могу сохранить LinearNode
в UArray, я также не мог сохранить Int
, индексирующий правильный дочерний элемент, вместе со значениями Float
, которые составляют AABB в одном UArray (поправьте меня, если я ошибся ). А использование двух массивов будет означать плохую когерентность кеша. Так что я' m в основном ищет способ эффективно хранить свое дерево, чтобы я мог ожидать хорошей производительности при обходе. Это могло бы быть