Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 有没有更有效的方法来计算和使用柏林噪声?_C#_Noise_Perlin Noise - Fatal编程技术网

C# 有没有更有效的方法来计算和使用柏林噪声?

C# 有没有更有效的方法来计算和使用柏林噪声?,c#,noise,perlin-noise,C#,Noise,Perlin Noise,我几天前才开始使用柏林噪音,效果看起来相当不错。但是,计算并绘制所述噪声的1024x1024位图需要3秒钟以上。我使用1024x1024数组来存储范围从-1到1的int32 创建柏林噪波阵列的代码: private void button1_Click(object sender, EventArgs e) { sw.Start(); LibNoise.Perlin perlinMap = new LibNoise.Perlin(); p

我几天前才开始使用柏林噪音,效果看起来相当不错。但是,计算并绘制所述噪声的1024x1024位图需要3秒钟以上。我使用1024x1024数组来存储范围从-1到1的int32

创建柏林噪波阵列的代码:

 private void button1_Click(object sender, EventArgs e)
    {
        sw.Start();
        LibNoise.Perlin perlinMap = new LibNoise.Perlin();
        perlinMap.Lacunarity = lacunarity + 0.01d;
        perlinMap.NoiseQuality = LibNoise.NoiseQuality.High;
        perlinMap.OctaveCount = octaveCount;
        perlinMap.Persistence = persistence;
        perlinMap.Frequency = frequency;
        perlinMap.Seed = 1024;

        if (radioButton1.Checked)
            perlinMap.NoiseQuality = LibNoise.NoiseQuality.Low;
        else if (radioButton2.Checked)
            perlinMap.NoiseQuality = LibNoise.NoiseQuality.Standard;
        else if (radioButton3.Checked)
            perlinMap.NoiseQuality = LibNoise.NoiseQuality.High;

        double sample = trackBar6.Value * 10;

        double[,] perlinArray = new double[resolutieX, resolutieY];
        for (int x = 0; x < resolutieX; x++)
        {
            for (int y = 0; y < resolutieY; y++)
            {
                perlinArray[x, y] = perlinMap.GetValue(x / sample, y / sample, 1d);
            }
        }
        draw(perlinArray);
        textBox12.Text = sw.ElapsedMilliseconds.ToString() + "ms";
        sw.Reset();
    }
 public void draw(double[,] array)
    {
        Bitmap afbeelding = new Bitmap(1024, 1024);
        Color color;
        int tileSize = 1024 / resolutieY;
        for (int y = 1; y < resolutieY; y++)
        {
            for (int x = 1; x < resolutieX; x++)
            {
                if (array[x, y] <= -0.2)
                    color = Color.DarkBlue;
                if (array[x, y] <= 0)
                    color = Color.DarkBlue;
                else if (array[x, y] <= 0.1)
                    color = Color.Blue;
                else if (array[x, y] <= 0.2)
                    color = Color.Beige;
                else if (array[x, y] <= 0.22)
                    color = Color.LightGreen;
                else if (array[x, y] <= 0.40)
                    color = Color.Green;
                else if (array[x, y] <= 0.75)
                    color = Color.DarkGreen;
                else if (array[x, y] <= 0.8)
                    color = Color.LightSlateGray;
                else if (array[x, y] <= 0.9)
                    color = Color.Gray;
                else if (array[x, y] <= 1)
                    color = Color.DarkSlateGray;
                else
                    color = Color.DarkSlateGray;

                //  color = Color.FromArgb(255);

                for (int i = 0; i < tileSize; i++)
                {
                    for (int j = 0; j < tileSize; j++)
                    {
                        afbeelding.SetPixel(((x - 1) * tileSize) + i, ((y - 1) * tileSize) + j, color);
                    }
                }

            }
        }

        pictureBox1.Image = afbeelding;
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
sw.Start();
LibNoise.Perlin perlinMap=新LibNoise.Perlin();
perlinMap.空隙率=空隙率+0.01d;
perlinMap.noiseequality=LibNoise.noiseequality.High;
perlinMap.OctaveCount=OctaveCount;
perlinMap.Persistence=Persistence;
perlinMap.频率=频率;
perlinMap.Seed=1024;
如果(radioButton1.选中)
perlinMap.noiseequality=LibNoise.noiseequality.Low;
否则如果(radioButton2.选中)
perlinMap.noiseequality=LibNoise.noiseequality.Standard;
否则如果(radioButton3.选中)
perlinMap.noiseequality=LibNoise.noiseequality.High;
双样本=trackBar6.值*10;
double[,]perlinArray=新的double[Resolutionex,Resolutiony];
对于(int x=0;x
绘制柏林噪波的代码:

 private void button1_Click(object sender, EventArgs e)
    {
        sw.Start();
        LibNoise.Perlin perlinMap = new LibNoise.Perlin();
        perlinMap.Lacunarity = lacunarity + 0.01d;
        perlinMap.NoiseQuality = LibNoise.NoiseQuality.High;
        perlinMap.OctaveCount = octaveCount;
        perlinMap.Persistence = persistence;
        perlinMap.Frequency = frequency;
        perlinMap.Seed = 1024;

        if (radioButton1.Checked)
            perlinMap.NoiseQuality = LibNoise.NoiseQuality.Low;
        else if (radioButton2.Checked)
            perlinMap.NoiseQuality = LibNoise.NoiseQuality.Standard;
        else if (radioButton3.Checked)
            perlinMap.NoiseQuality = LibNoise.NoiseQuality.High;

        double sample = trackBar6.Value * 10;

        double[,] perlinArray = new double[resolutieX, resolutieY];
        for (int x = 0; x < resolutieX; x++)
        {
            for (int y = 0; y < resolutieY; y++)
            {
                perlinArray[x, y] = perlinMap.GetValue(x / sample, y / sample, 1d);
            }
        }
        draw(perlinArray);
        textBox12.Text = sw.ElapsedMilliseconds.ToString() + "ms";
        sw.Reset();
    }
 public void draw(double[,] array)
    {
        Bitmap afbeelding = new Bitmap(1024, 1024);
        Color color;
        int tileSize = 1024 / resolutieY;
        for (int y = 1; y < resolutieY; y++)
        {
            for (int x = 1; x < resolutieX; x++)
            {
                if (array[x, y] <= -0.2)
                    color = Color.DarkBlue;
                if (array[x, y] <= 0)
                    color = Color.DarkBlue;
                else if (array[x, y] <= 0.1)
                    color = Color.Blue;
                else if (array[x, y] <= 0.2)
                    color = Color.Beige;
                else if (array[x, y] <= 0.22)
                    color = Color.LightGreen;
                else if (array[x, y] <= 0.40)
                    color = Color.Green;
                else if (array[x, y] <= 0.75)
                    color = Color.DarkGreen;
                else if (array[x, y] <= 0.8)
                    color = Color.LightSlateGray;
                else if (array[x, y] <= 0.9)
                    color = Color.Gray;
                else if (array[x, y] <= 1)
                    color = Color.DarkSlateGray;
                else
                    color = Color.DarkSlateGray;

                //  color = Color.FromArgb(255);

                for (int i = 0; i < tileSize; i++)
                {
                    for (int j = 0; j < tileSize; j++)
                    {
                        afbeelding.SetPixel(((x - 1) * tileSize) + i, ((y - 1) * tileSize) + j, color);
                    }
                }

            }
        }

        pictureBox1.Image = afbeelding;
    }
public void draw(双[,]数组)
{
位图afbeelding=新位图(10241024);
颜色;
int tileSize=1024/分辨率;
对于(int y=1;y
并确保在没有附加调试器的情况下以发布模式运行代码。这两种情况都会显著影响性能

单纯形噪声在这里没有帮助,因为它在更高的维度上获得了性能。二维噪声可能没有任何性能增益

计算和使用

这是两种截然不同的野兽,每一种都有许多不同的方法。 通过在数据结构中存储柏林噪声或任何昂贵的隐式计算的结果,可以节省大量时间。
如果您想在应用程序中保持适当的帧速率,即使在现代硬件上实时评估噪声也不是一个好主意,因为它会消耗大量的处理资源。一旦存储在数据结构中,您可以将处理过程简化为对该结构的简单访问,而该结构的访问成本要低得多,并且通常可以为您提供b确认大部分处理预算。

最有可能的是
SetPixel
是您的瓶颈。查看c#中不安全的位图编辑。这个问题似乎离题了,因为它是关于提高工作代码的性能。请改为询问您的问题。您的代码与柏林噪声无关。@Ephoric添加了柏林噪声它一定是柏林噪声吗?因为你可以用单纯形噪声得到类似的结果,但它更容易计算