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

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

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

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Unity

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

Q&A

0回答

2281閲覧

Unity:Development Buildと通常Buildでの動作の違い

nekomata

総合スコア0

C#

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

メモリリーク

メモリリークは、プログラムファイルがメモリの解放に失敗した時に起こります。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Unity

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

0グッド

0クリップ

投稿2020/09/09 04:48

UnityのPC向けアプリを制作しており、
内容は大まかに次の3つのシーンをSceneManagerで切り替えて使用しています。

  • シーンA:タイトル画面
  • シーンB:Barracudaのニューラルネットワークを用いたGPU、メモリ共に処理の高いシーン
  • シーンC:Webカメラを表示するだけの処理の軽いシーン

エディタ上のプレイとDevelopment Buildをしたアプリでは
どのシーンの遷移でもエラーなく動作するのですが、
Development Buildのチェックを外して通常Buildしたアプリでは
シーンBからシーンA、シーンCに遷移する際にその遷移先のシーンの読み込み中にクラッシュを起こして終了しました。

メモリ負荷の落差が原因かと思い、遷移前にシーンBのオブジェクトをすべて消してから遷移するようにしてみましたが解決しませんでした。

Development Buildかそうでないかはアプリ上にエラーログを表示したり、エディターと繋いでログを確認できたりするだけで
処理の動作に違いはないと思っていたのですが他にも違いがあるのでしょうか?

またDevelopment Buildをした場合でもアプリ上にエラーログ等を表示しないようにできないでしょうか?

知恵をお貸しください、よろしくお願いいたします。

なお使っているニューラルネットワークは映像から人の姿勢を推定するものです。

C#

1using UnityEngine; 2using UnityEngine.UI; 3using System.Collections; 4using System.Collections.Generic; 5using Unity.Barracuda; 6 7/// <summary> 8/// Define Joint points 9/// </summary> 10public class Barracuda : MonoBehaviour 11{ 12 /// <summary> 13 /// Neural network model 14 /// </summary> 15 public NNModel NNModel; 16 17 public WorkerFactory.Type WorkerType = WorkerFactory.Type.Auto; 18 public bool Verbose = true; 19 20 public VNectModel VNectModel; 21 22 public VideoCapture videoCapture; 23 24 private Model _model; 25 private IWorker _worker; 26 27 /// <summary> 28 /// Coordinates of joint points 29 /// </summary> 30 private VNectModel.JointPoint[] jointPoints; 31 32 /// <summary> 33 /// Number of joint points 34 /// </summary> 35 private const int JointNum = 24; 36 37 /// <summary> 38 /// input image size 39 /// </summary> 40 public int InputImageSize; 41 42 /// <summary> 43 /// input image size (half) 44 /// </summary> 45 private float InputImageSizeHalf; 46 47 /// <summary> 48 /// column number of heatmap 49 /// </summary> 50 public int HeatMapCol; 51 private float InputImageSizeF; 52 53 /// <summary> 54 /// Column number of heatmap in 2D image 55 /// </summary> 56 private int HeatMapCol_Squared; 57 58 /// <summary> 59 /// Column nuber of heatmap in 3D model 60 /// </summary> 61 private int HeatMapCol_Cube; 62 private float ImageScale; 63 64 /// <summary> 65 /// Buffer memory has 2D heat map 66 /// </summary> 67 private float[] heatMap2D; 68 69 /// <summary> 70 /// Buffer memory has offset 2D 71 /// </summary> 72 private float[] offset2D; 73 74 /// <summary> 75 /// Buffer memory has 3D heat map 76 /// </summary> 77 private float[] heatMap3D; 78 79 /// <summary> 80 /// Buffer memory hash 3D offset 81 /// </summary> 82 private float[] offset3D; 83 private float unit; 84 85 /// <summary> 86 /// Number of joints in 2D image 87 /// </summary> 88 private int JointNum_Squared = JointNum * 2; 89 90 /// <summary> 91 /// Number of joints in 3D model 92 /// </summary> 93 private int JointNum_Cube = JointNum * 3; 94 95 /// <summary> 96 /// HeatMapCol * JointNum 97 /// </summary> 98 private int HeatMapCol_JointNum; 99 100 /// <summary> 101 /// HeatMapCol * JointNum_Squared 102 /// </summary> 103 private int CubeOffsetLinear; 104 105 /// <summary> 106 /// HeatMapCol * JointNum_Cube 107 /// </summary> 108 private int CubeOffsetSquared; 109 110 /// <summary> 111 /// For Kalman filter parameter Q 112 /// </summary> 113 public float KalmanParamQ; 114 115 /// <summary> 116 /// For Kalman filter parameter R 117 /// </summary> 118 public float KalmanParamR; 119 120 /// <summary> 121 /// Lock to update VNectModel 122 /// </summary> 123 private bool Lock = true; 124 125 /// <summary> 126 /// Use low pass filter flag 127 /// </summary> 128 public bool UseLowPassFilter; 129 130 /// <summary> 131 /// For low pass filter 132 /// </summary> 133 public float LowPassParam; 134 135 public Text Msg; 136 public float WaitTimeModelLoad = 10f; 137 private float Countdown = 0; 138 public Texture2D InitImg; 139 140 private void Start() 141 { 142 // Initialize 143 HeatMapCol_Squared = HeatMapCol * HeatMapCol; 144 HeatMapCol_Cube = HeatMapCol * HeatMapCol * HeatMapCol; 145 HeatMapCol_JointNum = HeatMapCol * JointNum; 146 CubeOffsetLinear = HeatMapCol * JointNum_Cube; 147 CubeOffsetSquared = HeatMapCol_Squared * JointNum_Cube; 148 149 heatMap2D = new float[JointNum * HeatMapCol_Squared]; 150 offset2D = new float[JointNum * HeatMapCol_Squared * 2]; 151 heatMap3D = new float[JointNum * HeatMapCol_Cube]; 152 offset3D = new float[JointNum * HeatMapCol_Cube * 3]; 153 unit = 1f / (float)HeatMapCol; 154 InputImageSizeF = InputImageSize; 155 InputImageSizeHalf = InputImageSizeF / 2f; 156 ImageScale = InputImageSize / (float)HeatMapCol;// 224f / (float)InputImageSize; 157 158 // Disabel sleep 159 Screen.sleepTimeout = SleepTimeout.NeverSleep; 160 161 // Init model 162 _model = ModelLoader.Load(NNModel, Verbose); 163 _worker = WorkerFactory.CreateWorker(WorkerType, _model, Verbose); 164 165 StartCoroutine("WaitLoad"); 166 167 } 168 169 private void Update() 170 { 171 if (!Lock) 172 { 173 UpdateVNectModel(); 174 } 175 } 176 177 private IEnumerator WaitLoad() 178 { 179 inputs[inputName_1] = new Tensor(InitImg); 180 inputs[inputName_2] = new Tensor(InitImg); 181 inputs[inputName_3] = new Tensor(InitImg); 182 183 // Create input and Execute model 184 yield return _worker.StartManualSchedule(inputs); 185 186 // Get outputs 187 for (var i = 2; i < _model.outputs.Count; i++) 188 { 189 b_outputs[i] = _worker.PeekOutput(_model.outputs[i]); 190 } 191 192 // Get data from outputs 193 offset3D = b_outputs[2].data.Download(b_outputs[2].shape); 194 heatMap3D = b_outputs[3].data.Download(b_outputs[3].shape); 195 196 // Release outputs 197 for (var i = 2; i < b_outputs.Length; i++) 198 { 199 b_outputs[i].Dispose(); 200 } 201 202 // Init VNect model 203 jointPoints = VNectModel.Init(); 204 205 PredictPose(); 206 207 yield return new WaitForSeconds(WaitTimeModelLoad); 208 209 // Init VideoCapture 210 videoCapture.Init(InputImageSize, InputImageSize); 211 Lock = false; 212 Msg.gameObject.SetActive(false); 213 } 214 215 private const string inputName_1 = "input.1"; 216 private const string inputName_2 = "input.4"; 217 private const string inputName_3 = "input.7"; 218 /* 219 private const string inputName_1 = "0"; 220 private const string inputName_2 = "1"; 221 private const string inputName_3 = "2"; 222 */ 223 224 private void UpdateVNectModel() 225 { 226 input = new Tensor(videoCapture.MainTexture); 227 if (inputs[inputName_1] == null) 228 { 229 inputs[inputName_1] = input; 230 inputs[inputName_2] = new Tensor(videoCapture.MainTexture); 231 inputs[inputName_3] = new Tensor(videoCapture.MainTexture); 232 } 233 else 234 { 235 inputs[inputName_3].Dispose(); 236 237 inputs[inputName_3] = inputs[inputName_2]; 238 inputs[inputName_2] = inputs[inputName_1]; 239 inputs[inputName_1] = input; 240 } 241 242 StartCoroutine(ExecuteModelAsync()); 243 } 244 245 /// <summary> 246 /// Tensor has input image 247 /// </summary> 248 /// <returns></returns> 249 Tensor input = new Tensor(); 250 Dictionary<string, Tensor> inputs = new Dictionary<string, Tensor>() { { inputName_1, null }, { inputName_2, null }, { inputName_3, null }, }; 251 Tensor[] b_outputs = new Tensor[4]; 252 253 private IEnumerator ExecuteModelAsync() 254 { 255 // Create input and Execute model 256 yield return _worker.StartManualSchedule(inputs); 257 258 // Get outputs 259 for (var i = 2; i < _model.outputs.Count; i++) 260 { 261 b_outputs[i] = _worker.PeekOutput(_model.outputs[i]); 262 } 263 264 // Get data from outputs 265 offset3D = b_outputs[2].data.Download(b_outputs[2].shape); 266 heatMap3D = b_outputs[3].data.Download(b_outputs[3].shape); 267 268 // Release outputs 269 for (var i = 2; i < b_outputs.Length; i++) 270 { 271 b_outputs[i].Dispose(); 272 } 273 274 PredictPose(); 275 } 276 277 /// <summary> 278 /// Predict positions of each of joints based on network 279 /// </summary> 280 private void PredictPose() 281 { 282   以下略 283  } 284 285}

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問