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