【发布时间】:2014-08-02 19:17:46
【问题描述】:
我几天前才开始使用 Perlin 噪声,结果看起来相当不错。但是计算和绘制一个 1024x1024 的上述噪声位图需要 3 秒多的时间。我使用一个 1024x1024 的数组来存储 int32 的范围从 -1 到 1。
创建 Perlin 噪声数组的代码:
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;
}
我应该使用单纯形噪声吗?还是我在这里遗漏了什么?
【问题讨论】:
-
SetPixel很可能是您的瓶颈。调查 C# 中不安全的位图编辑。 -
这个问题似乎是题外话,因为它是关于提高工作代码的性能。请改用codereview.stackexchange.com 提问。
-
您的代码与柏林噪声无关。
-
@Euphoric 添加了 Perlin 噪声代码
-
一定是柏林噪音吗?因为您可以使用 Simplex 噪声来获得类似的结果,但更容易计算 en.wikipedia.org/wiki/Simplex_noise
标签: c# noise perlin-noise