質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

2102閲覧

Unity C# リストが重い

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/26 12:07

前提・実現したいこと

リストの参照を軽くしたい

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PaintController : MonoBehaviour 6{ 7 public Material mat; 8 9 public int rows; 10 public int columns; 11 12 public float noiseScale; 13 public int octaves; 14 [Range(0, 1)] 15 public float persistance; 16 public float lacunarity; 17 public int seed; 18 public Vector2 offset; 19 20 LinkedList<int> heightList = new LinkedList<int>(); 21 22 public GameObject Quad; 23 24 void Start() 25 { 26 MeshRenderer meshRenderer = Quad.GetComponent<MeshRenderer>(); 27 meshRenderer.sharedMaterial = new Material(Shader.Find("Standard")); 28 29 meshRenderer.material = mat; 30 31 Texture2D texture = Instantiate(meshRenderer.material.mainTexture) as Texture2D; 32 meshRenderer.material.mainTexture = texture; 33 34 texture = new Texture2D(rows, columns, TextureFormat.RGBA32, false); 35 texture.filterMode = FilterMode.Point; 36 37 Color[] pixels = texture.GetPixels(); 38 Color[] buffer = new Color[pixels.Length]; 39 40 seed = Random.Range(-1000000, 1000000); 41 42 float[,] noiseMap = global::Noise.GenerateNoiseMap(rows, columns, this.seed, this.noiseScale, this.octaves, this.persistance, this.lacunarity, this.offset + Vector2.zero); 43 44 int num = -1; 45 46 for (var x = 0; x < rows; x++) 47 { 48 for (var y = 0; y < columns; y++) 49 { 50 num++; 51 float height = noiseMap[y, x]; 52 if (height < 0.55f) 53 { 54 heightList.AddLast(num); 55 } 56 } 57 } 58 59 for (int i = 0; i < buffer.Length; i++) 60 { 61 buffer[i] = Color.black; 62 foreach (int item in heightList) 63 { 64 buffer[item] = Color.blue; 65 } 66 } 67 68 texture.SetPixels(buffer); 69 texture.Apply(); 70 Quad.GetComponent<Renderer>().material.mainTexture = texture; 71 } 72} 73

C#

1using UnityEngine; 2using System.Collections; 3 4public static class Noise 5{ 6 7 public static float[,] GenerateNoiseMap(int mapWidth, int mapHeight, int seed, float scale, int octaves, float persistance, float lacunarity, Vector2 offset) 8 { 9 float[,] noiseMap = new float[mapWidth, mapHeight]; 10 11 System.Random prng = new System.Random(seed); 12 Vector2[] octaveOffsets = new Vector2[octaves]; 13 for (int i = 0; i < octaves; i++) 14 { 15 float offsetX = prng.Next(-1000000, 1000000) + offset.x; 16 float offsetY = prng.Next(-1000000, 1000000) + offset.y; 17 octaveOffsets[i] = new Vector2(offsetX, offsetY); 18 } 19 20 if (scale <= 0) 21 { 22 scale = 0.0001f; 23 } 24 25 float maxNoiseHeight = float.MinValue; 26 float minNoiseHeight = float.MaxValue; 27 28 float halfWidth = mapWidth / 2f; 29 float halfHeight = mapHeight / 2f; 30 31 32 for (int y = 0; y < mapHeight; y++) 33 { 34 for (int x = 0; x < mapWidth; x++) 35 { 36 37 float amplitude = 1; 38 float frequency = 1; 39 float noiseHeight = 0; 40 41 for (int i = 0; i < octaves; i++) 42 { 43 float sampleX = (x - halfWidth) / scale * frequency + octaveOffsets[i].x; 44 float sampleY = (y - halfHeight) / scale * frequency + octaveOffsets[i].y; 45 46 float perlinValue = Mathf.PerlinNoise(sampleX, sampleY) * 2 - 1; 47 noiseHeight += perlinValue * amplitude; 48 49 amplitude *= persistance; 50 frequency *= lacunarity; 51 } 52 53 if (noiseHeight > maxNoiseHeight) 54 { 55 maxNoiseHeight = noiseHeight; 56 } 57 else if (noiseHeight < minNoiseHeight) 58 { 59 minNoiseHeight = noiseHeight; 60 } 61 noiseMap[x, y] = noiseHeight; 62 } 63 } 64 65 for (int y = 0; y < mapHeight; y++) 66 { 67 for (int x = 0; x < mapWidth; x++) 68 { 69 noiseMap[x, y] = Mathf.InverseLerp(minNoiseHeight, maxNoiseHeight, noiseMap[x, y]); 70 } 71 } 72 73 return noiseMap; 74 } 75 76}

試したこと

リストに代入した値をもとに、Quadに青色をつけるプログラムを書きました。

ですが、リストの数が膨らむと、描画するのに時間がかかってしまいます。

縦横100だと20秒、縦横200だと1分以上かかります。(私のコンピュータでは)

普通のListではなく、LinkedListを使ってみましたが、200×200だと1分以上かかります。

色を描画するだけなら、2000×2000でも5秒ほどです。

どうすれば、リストの参照を早くできるでしょうか?

回答、お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

じっくり読みこんだわけではないのですが、見た感じ List (LinkedList) は要らなくないですか?
2重ループとループが別々にありますけど、それを3重ループにしたら List も配列も要らなくなるしループ回数も減ると思いますが、どうでしょう?

投稿2020/07/26 12:55

bboydaisuke

総合スコア5277

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/07/26 13:21

確かにそうですね…見落としていました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問