C# 什么类型的编程结构可用于枚举类?

C# 什么类型的编程结构可用于枚举类?,c#,.net,C#,.net,我正在创建一个光线跟踪的minecraft风格的体素引擎。我将在单个3d数组中存储级别,此时每个值表示体素的类型,例如0=空气,1=石头等。稍后,体素将需要具有某些属性,例如,一些可能会被纹理化,并且在放置时可能必须执行某些操作 我想到的第一个也是最明显的解决方案是有一个基本体素类,其中包含OnPlace等方法,这些方法将由其他类型派生。但我不确定如何将其链接回地图,我需要一种非常快速(光线跟踪非常慢)和灵活的方法,但我不知道。有什么建议吗?我想你需要使用一种新的方法。可以为每个类提供一个ID,

我正在创建一个光线跟踪的minecraft风格的体素引擎。我将在单个3d数组中存储级别,此时每个值表示体素的类型,例如0=空气,1=石头等。稍后,体素将需要具有某些属性,例如,一些可能会被纹理化,并且在放置时可能必须执行某些操作


我想到的第一个也是最明显的解决方案是有一个基本体素类,其中包含OnPlace等方法,这些方法将由其他类型派生。但我不确定如何将其链接回地图,我需要一种非常快速(光线跟踪非常慢)和灵活的方法,但我不知道。有什么建议吗?

我想你需要使用一种新的方法。可以为每个类提供一个ID,您可以轻松地将其放入公共只读属性中。然后创建一个字典,其中键是ID,值是类类型。这样,您可以高效地存储级别,并使用字典(速度快,但内存有些昂贵)查找每个块的渲染方式

当程序启动创建字典时,需要使用反射并遍历体素基类的所有子类


如果你计划支持mods/插件,你需要能够搜索比你自己的组件更多的东西(最困难的部分是获得对组件的引用,之后只是循环代码),但现在只需要从你自己的开始。

显而易见的方法是拥有3d对象阵列(属于
类体素)
)并有
location={intx,inty,intz}的反向引用


请注意,完全将引用从“体素”拖放到位置可能是个好主意,这样就不需要为每个单元使用唯一的对象。你可以考虑使用类似的“体素”对象的大部分日期,即使你仍然必须保留对地图的引用。

< P>我不完全是你所要求的,因为当你说“枚举类”时,它让我想到用反射来迭代对象属性;显然这不是你想做的

对我来说,这听起来更像是3D数组应该包含对象而不是整数。如果您有一个所有体素继承自的
体素
基类,则无需使用类型说明符。相反,您只需将抽象方法放在基类中,然后在派生类中重写它们。一旦所有这些都设置好了,处理数组的任何代码都应该能够在不知道派生类类型的情况下与之交互


应用程序代码应仅将其视为类型为
Voxel
的数组。对任何给定的
体素
调用方法应执行特定于该体素类型的行为。这是遗传和多态性的基本概念。

好了,伙计,你的性能瓶颈不是“选择体素类型”。它是对数百万条光线(至少每像素1条光线,但每像素1条光线)的相交和碰撞检测,需要以60fps的速度跟踪

如今,唯一能做到这一点的方法就是使用GPU光线跟踪

因此,您主要关心的不是“使用什么数据结构”来确定体素类型。这是GPU上高效的光线相交代码


NVIDIA目前有一个被调用的光线跟踪引擎。

这在很大程度上取决于您遍历数据的方式。对于渲染,可能是一个很好的解决方案(或者


我建议您首先关注需要什么样的访问(可能是通过测试),然后进行优化。

这一切听起来都很慢,我必须对每个像素执行多次,每秒30次。我不确定这在现代硬件上是否可行。你只需要在程序启动时创建一次字典。然后,在渲染每个像素时,从ID到体素子类的查找相当快。反射相当慢,但因为在渲染时启动有点不确定,所以应该可以。因为每个体素子类只需要一个实例,您认为最好将体素子类作为一个单独的实例,然后在启动时根据它们的ID将它们全部加载到一个数组中?这不应该更快吗?事实上,我认为所有的渲染信息要么在子类中是静态的,要么只有一个实例可以从中获取通用数据。阵列是一个很棒的主意,我真的很傻,因为我没有想到它。我习惯于不使用数字,所以当我想要关联时,我使用字典,但是使用数字直接数组会很好。我现在使用字节数组,扩展到16位整数是合理的,但32位整数不是,除非我想大幅缩小地图的大小。我倾向于使用
struct
进行快速存储。+1我也想到了同样的东西:flyweight和带反向参考的playn阵列。好吧,假设我失去了理智,添加了40000种体素,我可以将其存储在每个体素16位中,我仍然在那里浪费大量的16位。事实上,它比这更糟糕,因为我从来没有计划要有40000个类型,所以每个体素可能会浪费多达24位。40K类型(如在唯一类/结构中)确实是疯狂的。Flywweight试图解决将数据与大量相似项关联的确切问题(即,书中的原始示例谈到将数据与大量文本的字符关联)。另一方面,你们似乎已经下定决心要采取某种特殊的方法,并且对此感到非常高兴。我不确定您现在需要什么帮助。我没有说我有性能瓶颈,如果每次光线碰到某个东西时我都必须做一些慢动作,我会的。我现在关心的是如何创建灵活快速的数据结构,在cpu上以720p的速度运行