いろいろな近傍探索
sphを実装するときにいろいろな近傍探索の方法を調べたので、知ったものをまとめておきます。
1.グリッドサーチ
空間をグリッドに区切って高速化をします。
https://qiita.com/kodai100/items/d1ddb3f86ba5dccccf9f
こちらで説明されています。
2.Cell-Linked-List
正式名称不明。CompactHashと調べたほうがいいかもしれません。
モートンオーダーを使用したりして1からさらに高速化します。
論文https://cg.informatik.uni-freiburg.de/publications/2011_CGF_dataStructuresSPH.pdf
3.Compressed Neighbor List
こちらも正式名称不明。論文の名前をそのままのっけてみました。
論文https://cg.informatik.uni-freiburg.de/publications/2019_CGF_CompressedNeighbors.pdf
正直2との違いがわかりません。ただ新しいです。2019年!
2はモートンオーダーを使う上にCompactHashingたる操作をしていますが、1にモートンオーダーを使うだけでも高速化になるのではないかと思います。
1,2,3いずれもソートをする必要があります。
せっかくなのでソートもまとめてみます。ただし並列化できるもののみです。
1.バイトニックソート(BitonicSort)
近傍探索では1番人気です。調べるだけでたくさん情報が出てきます。
2.基数ソート(RadixSort)
論文では人気なイメージです。あくまでもイメージ
3.マージソート(MargeSort)
CPUのイメージがありましたが、並列化できるようです。たぶん
バイトニックソートは最適化が施された実装
https://github.com/toropippi/BitonicSort_ComputeShader
があるので、何も考えずにバイトニックソートを使うのもありだと思います。
言い忘れていましたがUnityで実装してます。
https://arxiv.org/ftp/arxiv/papers/1511/1511.03404.pdf
で速度が比較されていますが、読みとり方に自信がないので内容には触れないでおきます。