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

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

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

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

Unity

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

Q&A

解決済

3回答

1037閲覧

これの違いってなんですか?

QuarterBoo

総合スコア7

C#

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

Unity

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

1グッド

0クリップ

投稿2018/02/04 00:39

編集2018/02/06 00:50

Unity、C#初心者です。

とあるオブジェクトを回転しようとして、
this.transform.Rotate(0,1,0);
として、意図通り毎フレームY軸回転したのですが、
ネットなどで調べてみると
this.transform.Rotate(new Vector3(0,1,0));
となっています。
当然こちらも同じように動作するのですが、
何が違っているのか分かりません。

毎フレームnewしているように思えるのですが、
これはどんどんvector3が生成されて何かメモリ?の無駄使いのようにも思えます。

初心者でオブジェクト指向の基本自体理解できていないように思いますが、
何卒ご教示いただければ幸いです。
よろしくお願いいたします。

usamino👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

意味としては一緒です。

何が違うのかというと、Rotate(数字,数字,数字)Rotate(Vector3)は厳密に言えば違うメソッドです。
使用する際に便利なように引数の型が違うメソッドを用意しています(オーバーロードと言います)。

例えばRotate(数字,数字,数字)しか無かった場合、Vector3型の各値を渡したい時は
Rotate(vec.x, vec.y, vec.z)とする必要があります。面倒臭いですね。
なのでRotate(vec)でもいいように作っています。

で、メモリと速度を確認したところ、どちらの方式もほぼ同じようです。
恐らくいずれの方法もRotate内部での型変換が行われている為かと思います。
(Unity 5.6.5f1 にて Rotate(0,1,0)、Rotate(new Vector3(0,1,0))、Rotate(Vector3.up) をそれぞれ10000000実行。ProfilerのGC Allocで確認)

今回の場合は「お好きな方法で」となりましたが、メモリについて気にすることは大事です。
自分の環境でも確認してみると良いかと思います。

投稿2018/02/04 01:40

sakura_hana

総合スコア11427

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

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

QuarterBoo

2018/02/06 00:44

理解度が低いにもかかわらず、丁寧にご説明いただき、速度まで確認していただきまして、ありがとうございました。よくわかりました。あまり気にせず使う局面に合わせて使い分ければ良いようですね。
sakura_hana

2018/02/06 01:03

いえいえ、私も最初は「今まで気にしてなかったけど、もしやnewするとGCがヤバいのでは?」と思って確認しただけですのでお気遣い無く。 ちなみにメモリリークまでいかずとも、GCはちょっとしたことでネックになったりする(Update内で文字列結合しただけで影響したりする)ので、早い内に気にしておくと後が楽かもしれないです。ご参考までに。
ozwk

2018/02/06 01:35

Vectorは構造体なのでスコープ抜けたら死ぬのでは? Unityは事情が違うんですか?
sakura_hana

2018/02/06 05:21

Bongoさんの回答にもあるように、仰る通りVectorはスコープ抜けたら死にます。(私はすっかり忘れていました)
guest

0

sakura_hanaさんの意見に同意。

Vectorを引き受けるやつだけだとやり辛いことがあります。

なのでオーバーロードという機能を使って intを3つでもいいようにしているのでは?

( 順番が逆かもしれないけど。 )

内部では intを3つ引き受けるやつも new Vectorしているはず。

で、

C#

1this.transform.Rotate(new Vector3(0,1,0));

での new Vector はメモリ常駐しますが、C言語やC++はGC ( ガーベージコレクタ ) がないので、プログラマが破棄しないといけませんが、

C#, Javaといった言語は GC が備わっているのでメモリリークはありえない。

C#では絶対にメモリリークは起きないとは言えないようですが、生成できていれば、GCが管理するらしいので、この場合はメモリリークは起きないらしいです。

( sakura_hanaさんからのご指摘を受けたので編集しました。 )

よって、問題ないと思われる。

投稿2018/02/04 01:46

編集2018/02/04 03:10
BeatStar

総合スコア4958

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

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

sakura_hana

2018/02/04 02:12

横から失礼します。 今回のケースについてはメモリリークの心配をする必要はありませんが、 状況によってはメモリリークが起こり得ます(Instantiate周りやtextureの動的生成等で発生しやすい)。 なので(Unityにおいては)「ありえない」と言い切るのは危険かと思います。
BeatStar

2018/02/04 03:06

sakura_hanaさん マジですか! 私は趣味でC++やっているので、一般的に『Java, C#にはGCがあるから』云々で奨めているのを何度も見たのでてっきり、Java,C#はメモリリークを起こさないものだとばかり...
Zuishin

2018/02/04 03:20

今回は無関係ですが、他から参照されていると GC の対象にならないのでメモリリークはあり得ます。 陥りやすいものとして INotifyPropertyChanged を実装していない ViewModel をバインドしたときメモリリークするそうです。 http://blog.okazuki.jp/entry/20110227/1298817065
QuarterBoo

2018/02/06 00:47

稚拙な疑問だったと思いますが、分かりやすくコメントいただきまして、ありがとうございました。 GCがバリバリ働く局面までコーディングできてませんが、引き続き頑張ります。
guest

0

お二人からご回答のあったように、お気になさる必要はないかと思います。Vector3の生成に関して、マニュアルによると

Types that are stored directly and copied during parameter passing are called value types. These include integers, floats, booleans and Unity’s struct types (eg, Color and Vector3). Types that are allocated on the heap and then accessed via a pointer are called reference types, since the value stored in the variable merely “refers” to the real data. Examples of reference types include objects, strings and arrays.

直接的に格納され、パラメータ渡しの際にコピーされる型は値型と呼ばれます。これには整数、浮動小数点数、ブール値や、Unityの構造体型(例えばColorVector3)も含まれます。ヒープ領域に格納され、ポインタによりアクセスされる型は参照型と呼ばれ、変数に格納されている値は単に実際のデータを「参照」しているだけです。参照型の例としてはobject、string、配列などが含まれます。

とあり、Vector3は値型に分類され、不要になればすぐ破棄されてしまうと考えられます。ですので「どんどんvector3が生成されて」とおっしゃるような、Vector3の残骸がどんどん増えていく事態にはならないものと思われます。

投稿2018/02/04 02:00

編集2018/02/04 02:03
Bongo

総合スコア10807

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

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

QuarterBoo

2018/02/06 00:49

初心者なので何をやるのもおおかなびっくりです。諸先輩から心配なしと言っていただけると安心です。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問