我目前正在将 C# 中的光线追踪器作为一个爱好项目。我试图通过从 c++ 实现中实现一些技巧来实现不错的渲染速度,但遇到了麻烦。
光线追踪器渲染的场景中的对象存储在 KdTree 结构中,而树的节点又存储在数组中。我遇到问题的优化是在尝试将尽可能多的树节点放入缓存行时。这样做的一种方法是让节点只包含指向左子节点的指针。然后隐含的是,右孩子紧跟在数组中的左孩子之后。
节点是结构,在树构造期间,它们被静态内存管理器类成功放入数组中。当我开始遍历树时,起初它似乎工作得很好。然后在渲染早期的某个点(每次大约在同一个地方),根节点的左子指针突然指向一个空指针。我得出的结论是,当数组位于堆上时,垃圾收集器已经移动了结构。
我已经尝试了几种方法来将地址固定在内存中,但它们似乎都不能像我需要的那样持续整个应用程序的生命周期。'fixed' 关键字似乎只在单个方法调用期间有帮助,并且声明 'fixed' 数组只能在节点不是的简单类型上完成。有没有一个好的方法可以做到这一点,或者我只是在 C# 不适合的东西的道路上走得太远了。
顺便说一句,改用 c++ 虽然可能是高性能程序的更好选择,但不是一种选择。