我正在编写一个使用相机的应用程序,使用。工作正常。然后,我更改了一些内容(稍后解释),并在崩溃后得到以下错误:
d3d11:未能创建暂存2D纹理w=896 h=504 d3dfmt=87 887a0005 d3d11:未能锁定大小为4194304 0x8007000E的缓冲区1104C69C。 C:\buildslave\unity\build\Runtime/GfxDevice/d3d11/DrawBuffersD3D11.cpp ()得到一系列索引,但没有索引缓冲区(文件名:DrawBuffers行: 137)
我一直在寻找这些错误,没有适用的解决方案。我希望我能对这件事有一些见解。
我在做什么我改变了什么
基本上,程序从摄像机中获得了一个字节数组( byte[] _latestImage; )的帧。
最初,此图像被应用于纹理,如
_videoTexture.LoadRawTextureData(_latestImage);
_videoTexture.wrapMode = TextureWrapMode.Clamp;
_videoTexture.Apply();
_videoPanelUIRenderer.sharedMaterial.SetTexture("_MainTex", _videoTexture);其中_videoTexture是Texture2D,_videoPanelUIRenderer是渲染器。
这个很好用。然后,我处理数组_latestImage,将其转换为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
}当我应用这个程序时,应用程序工作得很好,并且我可以看到,经过一段时间之后,我得到了灰色image...but,它与上面的消息一起崩溃了。
我的图像是896x504所以我猜
d3d11:未能创建暂存2D纹理w=896 h=504 d3dfmt=87 887a0005
这意味着Texture2D在某种程度上没有被创建,但为什么?当视频模式被初始化时,我的纹理只创建一次,所以我不明白为什么会发生这种情况。
我想这个错误可能与我克隆图像有关。这里有人能帮我吗?
发布于 2017-11-17 10:20:23
正如@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复制数组。
希望这会有所帮助:)
https://stackoverflow.com/questions/47347631
复制相似问题