C# 统一全息透镜崩溃

C# 统一全息透镜崩溃,c#,unity3d,crash,hololens,C#,Unity3d,Crash,Hololens,我正在编写一个应用程序,它使用Unity和Hololens相机。它工作正常。然后,我更改了一些内容(稍后解释),并在崩溃后出现以下错误: d3d11:未能创建分段2D纹理w=896 h=504 d3dfmt=87[887a0005] d3d11:未能锁定大小为4194304[0x8007000E]的缓冲区1104C69C DrawBuffers()获得了一系列索引,但没有索引缓冲区(文件名: C:\buildslave\unity\build\Runtime/GfxDevice/d3d11/Dr

我正在编写一个应用程序,它使用Unity和Hololens相机。它工作正常。然后,我更改了一些内容(稍后解释),并在崩溃后出现以下错误:

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

d3d11:未能锁定大小为4194304[0x8007000E]的缓冲区1104C69C

DrawBuffers()获得了一系列索引,但没有索引缓冲区(文件名: C:\buildslave\unity\build\Runtime/GfxDevice/d3d11/DrawBuffersD3D11.cpp 行:137)

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


我在做什么和我改变了什么

基本上,程序以字节数组
byte[]\u latestImage从摄像机获取一帧
最初,此图像应用于纹理,如中所示

_videoTexture.LoadRawTextureData(_latestImage);
_videoTexture.wrapMode = TextureWrapMode.Clamp;
_videoTexture.Apply();
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture);
其中,
\u videoTexture
是一个纹理2D,
\u videoPanelUIRenderer
是一个渲染器

这是正确的。然后我处理数组的最新估计值,将其转换为函数
ProcessSync
中的灰色。这也适用于唯一的问题:因为阵列正在被处理(变成灰色),但也被相机自动更新,当应用到纹理中时,它会闪烁,有时是灰色,有时是彩色。但除此之外,没有碰撞

因此,我的下一步是在处理函数开始时克隆该数组,这样我就可以处理这个新数组,并将其应用于纹理,而不会受到来自摄影机的新数据的干扰

所以我做了:

 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
}
void ProcessSync(字节[]rawmimage,Matrix4x4 cTwMatrix,Matrix4x4 pMatrix)
{
int-rr,gg,bb;
int p=0;
伊瓦尔;

byte[]image=(byte[])rawmimage.Clone();//正如@Equalsk在注释中提到的,可能会重用原始数组(考虑到数组是引用类型)。可以做的一件事是在传入
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;
}
注意:
ToArray()
是创建副本的
System.Linq
的扩展。如果愿意,可以使用来复制数组


希望这能有所帮助:)

我确信,对于
.Clone()
返回浅拷贝的数组,即使包含的对象是值类型。可能是
rawmimage
被操纵或处理,这导致了它的拷贝问题。你可以改为制作深度拷贝。我不是100%,因此有一条评论;-)
var image = ProcessSync(_latestImage.ToArray(),_cTwCatrix, _pMatrix);

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