2017-11-17 6 views
3

私は、UnityとHololensを使用してカメラを使用するアプリケーションをコーディングしています。それは大丈夫です。その後、私は何か(後述)に変更し、私はクラッシュ後に次のエラーを得た:Unity Hololensクラッシュ

d3d11:896、H = 504 d3dfmt = 87 [887a0005]

d3d11 = W 2Dテクスチャをステージング作成に失敗しました:サイズ4194304 [0x8007000E]のバッファ1104C69Cをロックできませんでした。

DrawBuffers()インデックスの範囲が、無インデックスバッファました(ファイル名: C:\ buildslave \ユニティ\ビルド\ランタイム/ GfxDevice/d3d11/DrawBuffersD3D11.cpp ライン:137)

Iこれらのエラーを検索し、解決策はありません。私はこれについていくつかの洞察を得ることができればと思います。


私は何をやっていたし、私は基本的に

を変更するプログラムはbyte[] _latestImage;
はもともとこの画像は

にとテクスチャに適用されたバイト配列にカメラからフレームを取得
_videoTexture.LoadRawTextureData(_latestImage); 
_videoTexture.wrapMode = TextureWrapMode.Clamp; 
_videoTexture.Apply(); 
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture); 

ここで、_videoTextureはTexture2D、_videoPanelUIRendererはレンダラーです。

これは正しく動作します。次に、配列_latestImageを処理して、関数ProcessSyncの中でGrayに変換しました。これは唯一の問題でもうまくいきます:配列が(グレーに)処理されているので、がカメラによって自動的に更新されているため、テクスチャに適用するとちらつきがあり、灰色になることがあります。しかし、それ以外の、クラッシュはありません。

私の次のステップは、この新しい配列を処理してカメラからの新しいデータの干渉を受けずにテクスチャに適用できるように、処理機能の開始時に配列をコピーすることでした。

ので、私はやった:

void ProcessSync(byte[] rawimage, Matrix4x4 cTwMatrix, Matrix4x4 pMatrix) 
    { 
     int rr, gg, bb; 
     int p = 0; 
     int yval; 
     byte[] image=(byte[])rawimage.Clone();//<--THIS is the only change 

     for (int y = 0; y < height; y++) 
      for (int x = 0; x < width; x++) 
       { //...some processing here 
       } 

     //Then apply it to the texture like indicated above 
} 

私はこれを適用すると、アプリケーションが正常に動作し、私はグレーの画像を取得していていることがわかります...しかし、いくつかの時間後に、それは上記のメッセージでクラッシュ。

私の画像は、私は

d3d11を推測896x504である:= 504 d3dfmt = 87 [887a0005]

896 hが何とかにTexture2Dが失敗したことを意味= W 2Dテクスチャをステージング作成に失敗しました作成される理由は何ですか?私のテクスチャは、ビデオモードが初期化されているときに一度だけ作成されるので、なぜこのようなことが起こるのか分かりません。

私は画像とのクローニングに関連したエラーが考えられます。誰も私をここで助けることができますか?

+1

私は '.Clone()は'含まれるオブジェクトが値型であっても、浅いコピーを返すことアレイと確信しています。おそらく 'rawimage'が操作されたり廃棄されたりして、そのコピーで問題が引き起こされるのでしょう。あなたは代わりに深いコピーを作ることを見ることができます。私は100%コメントではない;-) – Equalsk

答えて

2

@Equalskはコメントに記載されているように、元の配列が再利用されている可能性があります(Arrayが参照型であることを考慮)。あなたができることの1つは、ProcessSync()を渡す前に配列のコピーを作成して、メソッドで元のポインタが使用される可能性がないようにすることです。

私が示唆しているもう1つのこと:メソッドは単一の責任を持つ必要があります(処理された配列を返します)。その結果得られるbyte[]はテクスチャに適用されるべきです。

byte[] ProcessSync(byte[] image, Matrix4x4 cTwMatrix, Matrix4x4 pMatrix) 
{ 
    int rr, gg, bb; 
    int p = 0; 
    int yval; 

    for (int y = 0; y < height; y++) 
     for (int x = 0; x < width; x++) 
      { //...some processing here 
      } 
    return image; 
} 

その後、次のようにそれを使用します。

var image = ProcessSync(_latestImage.ToArray(),_cTwCatrix, _pMatrix); 

_videoTexture.LoadRawTextureData(image); 
_videoTexture.wrapMode = TextureWrapMode.Clamp; 
_videoTexture.Apply(); 
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture); 

注:ToArray()はコピーを作成しますSystem.Linqから拡張したものです。必要に応じてother waysを使用してアレイをコピーすることができます。

希望はこのことができます:)

関連する問題