Unity Hololens崩溃

时间:2017-11-17 09:47:40

标签: c# unity3d crash hololens

我正在使用Unity和Hololens编写使用相机的应用程序。它工作正常。然后我改变了一些东西(稍后解释)并且在崩溃后我得到了以下错误:

  

d3d11:无法创建分段2D纹理w = 896 h = 504 d3dfmt = 87 [887a0005]

     

d3d11:无法锁定大小为4194304 [0x8007000E]的缓冲区1104C69C。

     

DrawBuffers()获得了一系列索引但没有索引缓冲区(文件名:   C:\ buildslave \团结\编译\运行/ GfxDevice / D3D11 / DrawBuffersD3D11.cpp   行:137)

我搜索过这些错误,但没有适用的解决方案。我希望我能对此有所了解。

我在做什么,改变了什么

基本上,程序以字节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
}

当我应用它时,应用程序工作正常,我可以看到我正在获取灰色图像...但过了一段时间它崩溃了上面的消息。

我的图片是896x504,所以我想

  

d3d11:无法创建分段2D纹理w = 896 h = 504 d3dfmt = 87   [887a0005]

意味着某种方式无法创建Texture2D但为什么?我的纹理只在视频模式初始化时创建一次,所以我不明白为什么会发生这种情况。

我猜错误可能与我克隆图像有关。有人能帮我一下吗?

1 个答案:

答案 0 :(得分:2)

正如@Equalsk在评论中提到的那样,可能有可能重用原始数组(考虑到Array是一种引用类型)。你可以做的一件事是在传入ProcessSync()之前创建一个数组副本,这样就不会在方法中使用原始指针。

我建议的另一件事:方法应该有单一的责任(返回已处理的数组)。然后应将结果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复制数组。

希望这会有所帮助:)