c# - 在内存中固定指针数组

标签 c# optimization unsafe raytracing

我目前正在用 C# 开发一个光线追踪器,作为一个业余项目。我试图通过从 C++ 实现中实现一些技巧来获得不错的渲染速度,但遇到了一些麻烦。

光线追踪器渲染的场景中的对象存储在 KdTree 结构中,树的节点依次存储在数组中。我遇到的优化是在尝试将尽可能多的树节点放入缓存行时。这样做的一种方法是让节点仅包含指向左子节点的指针。然后隐含右 child 紧跟在数组中的左 child 之后。

节点是结构体,在树构造期间,它们被静态内存管理器类成功放入数组中。当我开始遍历这棵树时,起初,它似乎工作得很好。然后在渲染的早期某个点(每次大约相同的位置),根节点的左子指针突然指向一个空指针。我得出的结论是垃圾收集器移动了结构,因为数组位于堆上。

我已经尝试了几种方法来将地址固定在内存中,但它们似乎都不能像我需要的那样持续整个应用程序生命周期。 “固定”关键字似乎只在单个方法调用期间有帮助,并且声明“固定”数组只能在节点不是的简单类型上完成。有没有好的方法可以做到这一点,或者我是否在 C# 不适合的东西的道路上走得太远了。

顺便说一句,改用 C++ 虽然可能是高性能程序的更好选择,但不是一个选项。

最佳答案

首先,如果你正常使用C#,你不会因为垃圾收集器移动东西而突然得到一个空引用,因为垃圾收集器也会更新所有引用,所以你不需要担心它移动周围的东西。

你可以把东西固定在内存中,但这可能会导致比它解决的问题更多的问题。一方面,它会阻止垃圾收集器正确压缩内存,并可能以这种方式影响性能。

我想从您的帖子中说的一件事是,使用结构可能无法像您希望的那样提高性能。 C# 无法内联任何涉及结构的方法调用,即使他们在最新的运行时测试版中修复了这个问题,结构通常也不会表现得那么好。

就我个人而言,我认为像这样的 C++ 技巧通常不会很好地应用到 C# 中。您可能必须学会放手一点;可以有其他更微妙的方法来提高性能;)

关于c# - 在内存中固定指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38302/

相关文章:

Mysql 查询优化、EXPLAIN 和执行缓慢

c# - native C 字符串列表对 C# 的弱引用

arrays - 是否有一种正确的方法可以在引用一维中转换二维数组

c# - Xml 序列化动态忽略

c# - 双击打开文件c#

c# - .NET 正则表达式模式?

javascript - Angular 7 中的动态验证 : enable() & setValidators depending on flags triggered by changes

c# - 如何追踪调用 "OnValidate()"的来源

java - 增加内核数量时性能下降

java - 使用Arraylist复制三维数组不安全?