You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TexImage2D在子线程OpenGL上下文随机触发栈溢出异常求助

子线程OpenGL上下文加载纹理时随机触发栈缓冲区溢出崩溃

开发了一款以网格形式展示图片的程序,用户向下滚动时会加载进入视野的图片。程序运行基本正常,但会出现无规律的随机崩溃,且崩溃均发生在图片加载阶段,和加载的特定图片、加载数量无关。

奇怪的是,崩溃发生时Visual Studio不会抛出异常。用procdump生成转储文件后分析发现,程序因异常码0xC0000409(对应Status Stack Buffer Overrun,栈缓冲区溢出)退出,触发点是nvoglv64.dll调用TexImage2D的过程中。

关键特征:仅在子线程使用次级OpenGL上下文加载纹理时才会出现此问题,主线程使用主上下文加载时完全稳定,且两种加载逻辑几乎没有差异。

谷歌搜索仅找到3条相关结果,其中1条为英文内容,完全不知道该从何处入手调试,恳请提供帮助。


纹理加载代码(每个待加载纹理都会被尽可能快地调用此方法)

public static void Load( int FileIndex )
{
    BindlessTexture Texture = new();

    Texture.Handle = GL.GenTexture();
    GL.BindTexture(TextureTarget.Texture2D, Texture.Handle);

    Image<Rgba32> ImageData = Image.Load<Rgba32>(Library.Paths[FileIndex]);
    ImageData.Mutate(X => X.Flip(FlipMode.Vertical));

    byte[] PixelData = new byte[4 * ImageData.Width * ImageData.Height];
    ImageData.CopyPixelDataTo(PixelData);

    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMagFilter.Linear);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.ClampToBorderArb);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.ClampToBorderArb);
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureBorderColor, new float[4]);

    GL.TexImage2D(
        TextureTarget.Texture2D,
        0,
        PixelInternalFormat.Rgba,
        ImageData.Width,
        ImageData.Height,
        0,
        PixelFormat.Rgba,
        PixelType.UnsignedByte,
        PixelData
    );

    PixelData = null;
    ImageData.Dispose();
    GL.BindTexture(TextureTarget.Texture2D, 0);

    Texture.BindlessHandle = GL.Arb.GetTextureHandle(Texture.Handle);

    lock ( Library.BindlessTextures ) //I don't think either thread will collide but just in case?
    lock ( Library.BindlessTextureHandles )
    {
        Library.BindlessTextures[FileIndex] = Texture;
        Library.BindlessTextureHandles[FileIndex] = Texture.BindlessHandle;
    }

    TexturesToFinalize.Enqueue(FileIndex);
}

主线程纹理最终处理代码(加载完成后将纹理句柄常驻并编组到映射的SSBO)

public void FinalizeLoadingTextures()
{
    while ( TextureLoader.TexturesToFinalize.Count != 0 )
    {
        int FileIndex = TextureLoader.TexturesToFinalize.Dequeue();
        BindlessTexture Texture = Library.BindlessTextures[FileIndex];

        if ( Texture is not null )
        {

            GL.Arb.MakeTextureHandleResident(Texture.BindlessHandle);
            Marshal.WriteInt64(Library.BindlessTextureHandleBufferPointer, FileIndex * 8, Texture.BindlessHandle);

        }
    }

}

内容的提问来源于stack exchange,提问作者BBonless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:18:43