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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

2478閲覧

Unity ガベージコレクションについて

seri

総合スコア422

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2016/02/08 15:00

現在スロットマシーンを作っています。

絵柄の付いた平面をListのImagesに入れて
上から下に移動させて、ある一定の位置まで来たら
Destroy (Images [0]);
としています。

その後
Images.RemoveAt (0);
GameObject obj1 = Instantiate (Image1, Vector3.zero, Quaternion.Euler (0, -180, 0))as GameObject;
Images.Insert (0, obj1);
とし、このオブジェクトを再生成して、上から下に移動させます。

一応、Imagesの同じ配列にInsertしているのですが、これは、動作が重くなる原因になりえますでしょうか?

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

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

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

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

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

guest

回答2

0

「これは、動作が重くなる原因になりえますでしょうか?」の部分に回答すると、なります。
要素をDestroyして再生成する度にゴミが出来ていくので、回避できないGCが発生します。
意味が同じオブジェクトを再生成して使用するのであれば、再利用してしまうほうが良いです。
メモリ消費については、適切にDestroyしているのであれば使用量が余計に増えるということはありません。

またもう一つ、ListのInsertを繰り返す実装について、ListのInsert処理というのは、挿入する位置より後ろの全ての要素を1要素分次の位置にコピーする操作を行うので、こちらも効率が良くないです。
スロットのように一回転が定まっているのであれば、やはりリングバッファ実装などを利用するのが最も適切だと思われます。

投稿2016/02/09 01:20

tamoto

総合スコア4105

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

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

seri

2016/02/09 02:14

回答あとうございます。 回答者様がおっしゃる適切なdestroyについて教えていただけないでしょうか? リングバッファも魅力的なのですが、現在、list型で動作は問題なく作れております、リングバッファの勉強の前に、今回はリストについて勉強しておきたいと思っています
guest

0

ベストアンサー

リングバッファでやればいいと思います。
リストに、a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u 21駒の画像
で、a,b,c が盤面にあり、スクロールすると、b,c,d になります。更にスクロールすると、c,d,eになります。ここで、先頭の a を リストから取り除き、末尾に追加する。
c,d,e が見えてるときのリストは、b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,a
2駒盤面外に出たら1駒リスト先頭から末尾に移動させる。これを延々繰り返す。なんで、前後1駒余裕を持たせるかというと、盤面が縦3駒表示のとき、一瞬だけ3駒表示ですが、殆どの場合は4駒表示になるためです。
前後一コマ余裕があることで、正回転と逆回転両方に対応できます。
なので正確には、21駒あるとき、1駒目は、bにするのが正しくなりますね。裏で21駒のリストを管理して、表示用の5駒だけ毎回レンダリングさせれば無駄が無いのでは?と思います。

ついき

21駒は、現行?内規、時速何キロだったか思い出せません。
確か一周0.37 秒くらいだったような、、、

なんか、gcについての話なのに全然関係ないこと書いていますが、メモリ節約、既存メモリの使い回しによる有限資源の枯渇を防ぐには色々悩みますね。なので、destroy は破棄みたいな処理でしょうか、破棄ではなくてclear あたりが適当なのでは?と思います。5駒のイメージを1駒スクロールさせて、次の1駒スクロール用の5駒のイメージとスワップする。3リールあれば、5駒のイメージエリアが6つ必要になりますが、必要な資源は予め確保しておいて、動作中はなるべくメモリ確保なふぉは行わないようにできればメモリ利用効率も高くなり、動作も安定するのでは?と思います。クラスインスタンスやリストの確保などもメモリ確保になります。リストも実は内部の閾値を超えたときに新たに倍のメモリを確保する、というのをー延々繰り返します。
List list = new List(); よりも、最大容量がわかってるならば、new List(250); などとした方がメモリの分断も起きにくく、gcも掛かりにくくなります。
メモリ分断とは、
利用中、解放済み、利用中、利用中、解放済み、解放済み、利用中、、、、、、
みたいな状況です。gcはヒープ領域が少なくなると、解放済みエリアを圧縮して再配置することで未使用領域を広げようと頑張ります。頑張る時間だけ処理落ちになるのでメモリ管理は大事です。

投稿2016/02/09 00:23

編集2016/02/09 00:50
ipadcaron

総合スコア1693

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

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

seri

2016/02/09 00:28

回答ありがとうございます。 せっかくなのですが、そのような動作は、質問にも書かせていただいたListを使って、すでに完成しています。。 質問の内容は、このListをDestroyしたりInsartしたりした時の、記憶メモリへの影響をきいているのです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問