Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查2D阵列中每个邻居的最快方法_C#_Arrays_Performance_Neighbours - Fatal编程技术网

C# 检查2D阵列中每个邻居的最快方法

C# 检查2D阵列中每个邻居的最快方法,c#,arrays,performance,neighbours,C#,Arrays,Performance,Neighbours,我正在制作一个随机的地下城生成器,只是为了好玩/作为一个辅助项目来学习一些新东西。我已经编写了一个函数,它为任何给定的单元格返回一个整数散列值,这将为您提供关于它应该是什么类型的游戏对象的信息。i、 e.如果它是一堵墙,面向哪个方向,它是一个角,等等。这里是函数当前的样子 private int CellHashValue(int xIndex, int yIndex, char centerTile) { int hashValue = 0; i

我正在制作一个随机的地下城生成器,只是为了好玩/作为一个辅助项目来学习一些新东西。我已经编写了一个函数,它为任何给定的单元格返回一个整数散列值,这将为您提供关于它应该是什么类型的游戏对象的信息。i、 e.如果它是一堵墙,面向哪个方向,它是一个角,等等。这里是函数当前的样子

    private int CellHashValue(int xIndex, int yIndex, char centerTile)
    {
        int hashValue = 0;
        if (dungeon2DArray[xIndex - 1, yIndex + 1] == centerTile)
        {
            hashValue += 1;
        }
        if (dungeon2DArray[xIndex, yIndex + 1] == centerTile)
        {
            hashValue += 2;
        }
        if (dungeon2DArray[xIndex + 1, yIndex + 1] == centerTile)
        {
            hashValue += 4;
        }
        if (dungeon2DArray[xIndex - 1, yIndex] == centerTile)
        {
            hashValue += 8;
        }
        if (dungeon2DArray[xIndex + 1, yIndex] == centerTile)
        {
            hashValue += 16;
        }
        if (dungeon2DArray[xIndex - 1, yIndex - 1] == centerTile)
        {
            hashValue += 32;
        }
        if (dungeon2DArray[xIndex, yIndex - 1] == centerTile)
        {
            hashValue += 64;
        }
        if (dungeon2DArray[xIndex + 1, yIndex - 1] == centerTile)
        {
            hashValue += 128;
        }
        return hashValue;
    }

我的问题是,有没有一种更高效、更快的方法来进行这些检查,而我可能没有想到?地下城阵列的大小从100x100到1000x1000不等,但该函数不会在每个单元上调用。我有一个单独的列表,其中包含房间,每个方向都有开始索引和结束索引,我迭代以实例化对象

由于您使用数组来构建映射,因此由于直接访问,访问时间是恒定的。因此,检查每个数组索引的过程很快

有几件小事可以加速该功能

  • 返回相应的
    if
    语句中的哈希值。这将删除几行代码
  • 通过删除
    hashValue
    变量并返回硬编码值,将从进程中删除变量初始化。这比看起来更重要。创建和删除对象需要时间,缩放时需要大量时间
  • xIndex
    yIndex
    可以成为对象的全局索引要小心实现这个想法。因为在检查特定条件时xIndex和yIndex不会改变,所以它们可以在对象中成为全局的。这将减少传入的参数数量。由于Java不通过引用传递,因此会创建一个大小相等的对象并将其传递到函数中。一个简单的
    int
    不会对速度产生太大影响,但是如果您有一个包含许多变量的对象,那么需要更多的时间来构建另一个值相等的对象
  • 每个支票都可以移动到单独的功能。这主要有助于以后的可读性和调试。有一些速度优势,但它们取决于项目。通过观察对象如何初始化/操作,通常可以强制某些条件为真。如果不需要检查逻辑,并且不需要检查就可以得出结论,那么所需的时间就更少了

  • 只是一些想法。如果您有时间进行研究,第2点和第3点将使用
    低延迟/高频率的概念。另外,请注意,这些概念中的一些并不被视为最佳实践。

    由于您使用数组构建映射,因此由于直接访问,访问时间是恒定的。因此,检查每个数组索引的过程很快

    有几件小事可以加速该功能

  • 返回相应的
    if
    语句中的哈希值。这将删除几行代码
  • 通过删除
    hashValue
    变量并返回硬编码值,将从进程中删除变量初始化。这比看起来更重要。创建和删除对象需要时间,缩放时需要大量时间
  • xIndex
    yIndex
    可以成为对象的全局索引要小心实现这个想法。因为在检查特定条件时xIndex和yIndex不会改变,所以它们可以在对象中成为全局的。这将减少传入的参数数量。由于Java不通过引用传递,因此会创建一个大小相等的对象并将其传递到函数中。一个简单的
    int
    不会对速度产生太大影响,但是如果您有一个包含许多变量的对象,那么需要更多的时间来构建另一个值相等的对象
  • 每个支票都可以移动到单独的功能。这主要有助于以后的可读性和调试。有一些速度优势,但它们取决于项目。通过观察对象如何初始化/操作,通常可以强制某些条件为真。如果不需要检查逻辑,并且不需要检查就可以得出结论,那么所需的时间就更少了

  • 只是一些想法。如果您有时间进行研究,第2点和第3点将使用
    低延迟/高频率的概念。另外,请注意,这些概念中的一些并不被认为是最佳实践。

    您所做的基本上是应用一种卷积形式。如果没有更多关于如何调用方法或如何使用返回的哈希值的上下文,您所做的似乎接近于迭代3x3网格的最有效方式。假设你的dungeon2dArray是一个char[][]并且是全局的,我认为这更清晰、更简洁(你必须根据迭代的顺序调整如何解释结果的总和)

    private int-CellHashValue(int x,int y){
    int hashSum=0;//要返回的哈希和
    int hashValue=1;//随着2的幂增加而增加(1,2,4,8,…128)
    char centerTile=dungeon2DArray[x,y];//缓存中心tile
    
    对于(int r=-1;r您所做的基本上是应用一种卷积形式。没有更多关于如何调用方法或如何使用返回的哈希值的上下文,您所做的似乎接近于迭代3x3网格的最有效方式。假设您的dungeon2dArray是char[][]而且是全局的,我认为这更清晰、更简洁(您必须根据迭代顺序调整如何解释结果和)

    private int-CellHashValue(int x,int y){
    int hashSum=0;//要返回的哈希和
    int hashValue=1;//随着2的幂增加而增加(1,2,4,8,…128)
    char centerTile=dungeon2DArray[x,y];//缓存中心tile
    对于(int r=-1;r
    
    private int CellHashValue(int x, int y) {
        int hashSum = 0;   // Hash sum to return
        int hashValue = 1; // Increases as power of 2 (1,2,4,8,...128)
        char centerTile = dungeon2DArray[x, y]; // Cache center tile
    
        for (int r = -1; r <= 1; r++) {
            for (int c = -1; c <= 1; c++) {
                if (r == 0 && c == 0) continue; // Skip center tile
                if (dungeon2DArray[x + c, y + r] == centerTile) {
                    hashSum += hashValue;
                }
                hashValue *= 2; // Next power of two
                //could also bit shift here instead 
                // hashValue <<= 1
            }
        }
        return hashSum;
    }