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

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

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

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

Unity

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

Q&A

解決済

2回答

1976閲覧

Taskをまとめると速くなる理由

concern12

総合スコア18

C#

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

Unity

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

0グッド

2クリップ

投稿2021/10/05 23:56

編集2021/10/06 00:15

Unity上での話です。
以下のようなコードA,Bがあった際に、コードAのようにListでまとめてからawaitをする方が処理が何倍も速かったのですがどういった理由なのでしょうか?
そもそもIList<IResourceLocation>型の reourceLocationsを1つずつLoadAssetAsync()に渡すのではなく、
Addressable.LoadAssetsAsync<TObject>(IList<IResourceLocation> locations, Action<TObject> callback)
を使えばいいというのは承知しております。
ただ、コードAのようにまとめると速くなる理由を教えていただきたいです。
よろしくお願いいたします。

コードA

cs

1 //(代入省略) 2 IList<IResourceLocation> reourceLocations; 3 4 var handles = new List<AsyncOperationHandle<Object>>(); 5 6 foreach (var location in reourceLocations) 7 { 8 AsyncOperationHandle<Object> handle = Addressables.LoadAssetAsync<Object>(location); 9 handles.Add(handle); 10 } 11 12 foreach (var handle in handles) 13 await handle.Task; 14

コードB

cs

1 //(代入省略) 2 IList<IResourceLocation> reourceLocations; 3 4 foreach (var location in reourceLocations) 5 { 6 AsyncOperationHandle<Object> handle = Addressables.LoadAssetAsync<Object>(location); 7 await handle.Task; 8 }

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

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

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

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

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

guest

回答2

0

ベストアンサー

コードAは全部のlocationのLoadを始めてから、順番に待機する。
コードBは1つ1つのlocationのLoadを完了してから、次のlocationのLoadを開始しているからです。

LoadAssetAsyncを呼び出した時点でLoadは開始します。
コードAはLoadする"処理"をhandlesに追加して、あとで纏めて"処理"の完了を待機します。
コードBでは直後にawaitで待機しています。

投稿2021/10/06 00:29

soi013

総合スコア149

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

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

concern12

2021/10/06 16:09

LoadAssetAsyncを呼び出した時点でLoadが開始されるのですね。 ご回答ありがとうございました!
guest

0

Unity は触ったこともないので大ハズレかもしれませんが・・・

C# の async / await を使った非同期プログラムで、例えば以下のようなコード(コード A に該当?)を書くと約 3 秒でアプリ全体の実行は完了しますが、

public async Task<string> WorkAsync(int number) { // ・・・省略・・・ string retunVlaue = $"n = {number}, ThreadID: {id}" + $", start: {start:ss.fff}, "; await Task.Delay(3000); // ・・・省略・・・ return retunVlaue; } public async Task ForLoopAsync() { // ・・・省略・・・ Task<string>[] taskResults = new Task<string>[100]; taskResults[0] = WorkAsync(0); taskResults[1] = WorkAsync(1); taskResults[2] = WorkAsync(2); // ・・・省略・・・ taskResults[99] = WorkAsync(99); await Task.WhenAll(taskResults); foreach (Task<string> result in taskResults) { Console.WriteLine(result.Result); } // ・・・省略・・・ }

Task.WhenAll は使わないで、以下のように各 WorkAsync メソッドに await を付与すると各メソッドの実行時に 3 秒待機してから次のメソッドが実行されるようになり**(コード B に該当?)、アプリ全体の実行時間は 3 秒 x 100 = 5 分になります**。

string[] stringResults = new string[100]; stringResults[0] = await WorkAsync(0); stringResults[1] = await WorkAsync(1); stringResults[2] = await WorkAsync(2); // ・・・省略・・・ stringResults[99] = await WorkAsync(99);

それと似たような話ではないのでしょうか?

ハズレでしたらすみません。

投稿2021/10/06 00:53

編集2021/10/06 06:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

concern12

2021/10/06 16:11

該当する問題と同じだと思います。理解できました。 ご回答ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問