[過去ログ] 【ゲームエンジン】Unity初心者質問スレBuild2 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
964: 名前は開発中のものです。 [sage] 2020/01/10(金) 12:14:16.98 ID:6FaPVqIC(1/3) AAS
>>963
963(1): 名前は開発中のものです。 [] 2020/01/10(金) 11:30:27.01 ID:08GLxpkh(1/4) AAS
>>961
よければこれの根拠教えてください
次のhp ではfor reach と大差ないとあるけど、何か他の要因?

外部リンク:qiita.com
LINQのメソッドに渡すデリゲートは取り扱いを間違えるとGC対象になるし
それに関してググって出てくる記事がほぼ全て検証も解釈も間違ってるから使うなというのは分かる
965: 名前は開発中のものです。 [] 2020/01/10(金) 12:38:04.63 ID:08GLxpkh(2/4) AAS
そう言うことですか
ガベージ関連だと初心者が考えなくても
まぁ、このスレ的には問題なさそうですね
966: 名前は開発中のものです。 [] 2020/01/10(金) 12:42:10.82 ID:08GLxpkh(3/4) AAS
だとすると「RINQ がゲームで悪手」というよりデリケート関連が全てのプログラムで悪手であって、メモリー関連の改善待ちとなるのかな?
c#のバージョンによる改善待ちになるのか
まぁ将来的な課題でしょうかね
967
(1): 名前は開発中のものです。 [sage] 2020/01/10(金) 12:57:56.83 ID:5Sf2RA1L(1/2) AAS
デリゲートがってよりも、Linqで色々繋げると色々コピーがされるしIEnum経由して列挙してくのがアレって話じゃないか?
968
(1): 名前は開発中のものです。 [sage] 2020/01/10(金) 14:23:25.79 ID:6FaPVqIC(2/3) AAS
>>967
IEnumerableは一つずつ取り出して処理する為の機能だから、
複製はされないしチェーンの数だけループ発生したりもしないよ

もちろんToArray()で新規配列は生成されるしOrderBy()でも内部で別のループが生まれてしまうがそれはそういう関数だからな
969
(2): 名前は開発中のものです。 [sage] 2020/01/10(金) 15:40:25.16 ID:5Sf2RA1L(2/2) AAS
>>968
いやもし5段階に組まれてたら下から見るとMoveNext5回呼ばれる事でやっと元のコレクションなりにたどり着くやん
あれインタフェースになってて1番下でのMoveNextでもとのに辿り着くっけ?
970
(1): 名前は開発中のものです。 [sage] 2020/01/10(金) 18:42:11.72 ID:6FaPVqIC(3/3) AAS
>>969
例えばこんなLINQがあるとするだろ
var seq = list.Where(A).Where(B).Where(C);
foreach(var n in seq) Console.WriteLine(n);

内部的にはこの処理と同じ
var tmp = list.GetEnumerator();
while(tmp.MoveNext()){
var n = tmp.Current;
if(!A(n)) continue;
if(!B(n)) continue;
if(!C(n)) continue;
Console.WriteLine(n);
}

取り出した要素をチェーンに繋いである関数に順番に渡してるだけ
要素一つにMoveNextを何回も呼んでるわけじゃない
971: 名前は開発中のものです。 [sage] 2020/01/10(金) 19:15:11.60 ID:7KV1Qvxy(1) AAS
Linqを許可しておくとRDBMSみたいに組むやついるからな
ゲームでそんな使い方されたら激重だから、使わないで統一するのが正解かと
972: 名前は開発中のものです。 [sage] 2020/01/10(金) 19:55:49.34 ID:Pn9TT9VK(1) AAS
linqの冒険…
973: 名前は開発中のものです。 [] 2020/01/10(金) 21:28:36.70 ID:08GLxpkh(4/4) AAS
>>957
957(1): 名前は開発中のものです。 [sage] 2020/01/09(木) 13:17:06.70 ID:h4Av5g/u(1) AAS
false、trueを入れるときに、変数にして+1、-1しとけばいいやん。0以下なら全部true。
不安なら、たまに時間の許す処理の時にチェックサム。
これってプログラムするとどんなコードになるのかな?
いまいち浮かばないんだが
974
(1): 名前は開発中のものです。 [] 2020/01/10(金) 22:12:46.10 ID:lJeo0zER(1/2) AAS
3dでPlatform does not support compute shadersこんなエラーが出たんだがよくわかんないんだけどどういうこと?
ユニティちゃんが原因みたいだけどそれ以上はわからなかった
975: 名前は開発中のものです。 [sage] 2020/01/10(金) 22:17:28.65 ID:Fenu7wQ/(1) AAS
そのシェーダーを積んでないから描画できないぞゴルァ、かと。
976
(2): 名前は開発中のものです。 [sage] 2020/01/10(金) 22:52:24.52 ID:L/Emtw4P(1) AAS
>>970
そだっけ?その例だとWhereの第一引数に対してMoveNextすることでさらにその上のWhereが返すIEnumにアクセスってなるんじゃ?
Linqのコンパイラでそんな最適化しないでしょ
977
(2): 名前は開発中のものです。 [sage] 2020/01/10(金) 23:26:02.35 ID:XdY5fR78(1) AAS
>>976
遅延評価というものがあるし、そもそもWhereが返すのはIEnumでなく値そのものだからそこのところを誤解してる
978: 名前は開発中のものです。 [] 2020/01/10(金) 23:40:30.02 ID:lJeo0zER(2/2) AAS
>>974
ダメだわこれ、unityちゃんの配布物全部がshaderエラーになるわ
どうなってるんだ急に
979: 名前は開発中のものです。 [sage] 2020/01/11(土) 00:03:09.69 ID:L2PVl/EJ(1) AAS
Platformがなんちゃらっつってんだからそのへんじゃないの
980: 名前は開発中のものです。 [sage] 2020/01/11(土) 00:19:49.48 ID:MByoB+15(1) AAS
ビルドターゲットをWebGL辺りに変えたんだろ
あれはCompute Shaderが使えないからそんな感じのエラーが出る
981
(1): 名前は開発中のものです。 [sage] 2020/01/11(土) 01:41:24.01 ID:1/8GPuaw(1/7) AAS
>>977
ごめん何言ってるのかよく分からん

外部リンク:docs.microsoft.com
982
(1): 名前は開発中のものです。 [sage] 2020/01/11(土) 01:45:41.87 ID:1/8GPuaw(2/7) AAS
WhereがIEnum返さなかったら次の人どうやって列挙するの
983
(1): 名前は開発中のものです。 [sage] 2020/01/11(土) 01:49:41.69 ID:1/8GPuaw(3/7) AAS
>>977
ついでに言うと遅延評価ってのはまさに後からMoveNextした時に評価されることを指すと思うぞこの場合
984
(1): 名前は開発中のものです。 [sage] 2020/01/11(土) 02:03:49.82 ID:eNMw2FnY(1/6) AAS
>>981-983
実行時の話な
var seq = list.Where(...)が返すのはIEnumだが、
実際にforeach(var n in seq)で遅延評価されるときには一つずつの値を返してるし、それが次のWhereに送られてる
ループの位置を見てみろ、配列は一回しか回ってないだろ?
985
(1): 名前は開発中のものです。 [sage] 2020/01/11(土) 02:17:15.69 ID:1/8GPuaw(4/7) AAS
>>984
いやだからその展開式みたいに実行時コードがなるって話あったっけ?
こんぱいられべるでLINQ特化で最適化しないとそうはできないと思うけど、いや俺が知らないだけかもなのでこう最適化されるよーってソースあるなら教えてくれ
986: 名前は開発中のものです。 [sage] 2020/01/11(土) 02:34:07.57 ID:eNMw2FnY(2/6) AAS
>>985
yieldのごく普通の振る舞いなんだからイテレーター使ったことあるなら分かるだろ?

ちなみに具体的なソースはこれな
外部リンク[cs]:github.com
987
(1): 名前は開発中のものです。 [sage] 2020/01/11(土) 03:28:33.54 ID:MfNXfEnO(1) AAS
コルーチンについて質問させてください。

void Start() {
StartCoroutine(A());
}

void Update()
{
Debug.Log("update");
}

IEnumerator A()
{
Debug.Log("A start");

for (int i = 0; i < 10; i++)
{
Debug.Log("A:"+i);
yield return null;
}
}

とやって動かすと、ログが
A Start
A:0
start end
update
update
A:1
になるんですが、最初のUpdateのあとにコルーチンが実行されないのはどうしてですか?
988
(1): 名前は開発中のものです。 [sage] 2020/01/11(土) 03:42:34.65 ID:eNMw2FnY(3/6) AAS
とりあえず>>969>>976から読み取ると、LINQで繋がれたメソッドは全部独立したIEnumerableを返してるような誤解をしてるんだと思う
実際は宣言時にチェーンの最後にあるメソッドが一つのIEnumerableを返すだけだし、間にある他のメソッドは最後のメソッドがデリゲートとして一括で実行する
だからMoveNextは一つの要素に一回ずつしか基本的に呼ばれず、従ってループも一回だけ
これで納得出来ないならもう5個チェーン繋げたら5回ループされてると思っても良いよ、別にそれでも実害は一切無い
1-
あと 14 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.020s