Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 2009中使用FastMM 4.97的OpenGL 3.2在FullDebuggMode下的UBOs问题_Delphi_Opengl_Fastmm - Fatal编程技术网

Delphi 2009中使用FastMM 4.97的OpenGL 3.2在FullDebuggMode下的UBOs问题

Delphi 2009中使用FastMM 4.97的OpenGL 3.2在FullDebuggMode下的UBOs问题,delphi,opengl,fastmm,Delphi,Opengl,Fastmm,我正在使用Delphi2009中的OpenGL3.2应用程序。使用定义了FullDebugMode的FastMM 4.97时,UBOs无法正确获取数据。在FullDebugMode未定义的情况下,一切工作都像一个符咒 例如: 在我们的渲染帧类中,设置指向两个私有整数字段FWidth和FHeight的视口维度 glBufferSubData(GL_UNIFORM_BUFFER, VUniform.Offset, VUniform.Size, @FWidth); 这件事我已经纠结了好几天了,我真的

我正在使用Delphi2009中的OpenGL3.2应用程序。使用定义了FullDebugMode的FastMM 4.97时,UBOs无法正确获取数据。在FullDebugMode未定义的情况下,一切工作都像一个符咒

例如: 在我们的渲染帧类中,设置指向两个私有整数字段FWidth和FHeight的视口维度

glBufferSubData(GL_UNIFORM_BUFFER, VUniform.Offset, VUniform.Size, @FWidth);
这件事我已经纠结了好几天了,我真的不知道该怎么办。我不希望在这里得到完全的OpenGL支持,但希望有人能根据在FullDebuggMode和not模式下运行的已知差异提出一些建议

项目设置:

[Compiling]
Optimization    False
Stack frames    True
Use debug .dcus True
[Linking]
Debug info      True
Map file        Detailed
操作系统是64位的Windows7

编辑: 找到了!
它与OpenGL毫无关系。在我们的代码库的其他地方,一个函数使用Result返回了一个PAnsiChar:=@AnsiStringObject.Name[1];这在正常运行的大部分时间都有效,因为内存只被释放,但没有改变。在FullDebuggMode中,数据在释放时被$80序列覆盖。

您可能看到的是您自己的应用程序过早释放的内存

通常,您仍然能够访问旧值,直到它们被新的分配+写入覆盖。这可以让应用程序正常运行,即使您正在访问内存中过时的释放部分


但是,在FullDebuggMode中,释放的内存将填充一个字节$80序列。如果您知道对glBufferSubData的确切调用发生中断,您可以很容易地对此进行检查,只需查看该点的内存。

发送到videmo内存的数据(在我的示例中为FWidth)在调用glBufferSubData之前的行上设置。FWidth:=400;glBufferSubDataGL_UNIFORM_BUFFER,VUniform.Offset,VUniform.Size,@FWidth;一种可能的解释是,在我的设置和OpenGL从内存传输到视频内存之间,FastMM在FullDebuggMode下清除数据。此外,如果UViewDimensionX==0,则在片段着色器内部的UBO中检查上载的值时,其计算结果为true。填充了$80序列的整数不应该是零。我只查看了GPU端缓冲区中数据的设置。您关于陈旧内存的理论似乎是合理的,但对于绑定和使用缓冲区的代码部分来说是合理的。对于缓冲区中的错误集数据和缓冲区设置出错,片段着色器内部的行为将是相同的。我会进一步调查的。