QT 和 OpenCascade 内存不足

Posted

技术标签:

【中文标题】QT 和 OpenCascade 内存不足【英文标题】:QT and OpenCascade out of memory 【发布时间】:2018-10-17 10:06:29 【问题描述】:

我开始在 QT 中使用 OpenCascade 进行编码,发现了这个有趣的基础项目: https://github.com/eryar/occQt/

我已经编译了这个程序:

QT += core gui opengl

当我执行它时,我收到以下错误:

TKOpenGl |类型:性能 |编号:0 |严重性:低 |消息:VBO 169 个顶点的原始数组创建失败。在......之外 内存?

我也在项目网站上发布了这个问题,但我不确定那个地方的活动。 这就是为什么我问你是否有任何解决方法的想法。

我的测试平台:

配备 8GB 内存的 Intel i7 Windows 10 OpenCascade 6.9.1 vc12-64 QT 5.5.1

【问题讨论】:

【参考方案1】:

我没有尝试编译程序,但快速查看后可能是 GPU 驱动程序 问题,由于某种原因 glGenBuffer 没有生成缓冲区对象 这就是我推断的方式>> 在occt6.9.1,文件OpenGl_PrimitiveArray.cxx,函数:

Standard_Boolean OpenGl_PrimitiveArray::initNormalVbo (const Handle(OpenGl_Context)& theCtx) const 

有:

  if (!myVboAttribs->init (theCtx, 0, myAttribs->NbElements, myAttribs->Data(), GL_NONE, myAttribs->Stride))
  
    TCollection_ExtendedString aMsg;
    aMsg += "VBO creation for Primitive Array has failed for ";
    aMsg += myAttribs->NbElements;
    aMsg += " vertices. Out of memory?";
    theCtx->PushMessage (GL_DEBUG_SOURCE_APPLICATION_ARB, GL_DEBUG_TYPE_PERFORMANCE_ARB, 0, GL_DEBUG_SEVERITY_LOW_ARB, aMsg);

    clearMemoryGL (theCtx);
    return Standard_False;
  

这意味着,在文件 OpenGl_VertexBuffer.cxx 中的函数:

bool OpenGl_VertexBuffer::init (const Handle(OpenGl_Context)& theGlCtx,
                                const GLuint   theComponentsNb,
                                const GLsizei  theElemsNb,
                                const void*    theData,
                                const GLenum   theDataType,
                                const GLsizei  theStride)

  if (!Create (theGlCtx))
  
    return false;
  

  Bind (theGlCtx);
  myDataType     = theDataType;
  myComponentsNb = theComponentsNb;
  myElemsNb      = theElemsNb;
  theGlCtx->core15fwd->glBufferData (GetTarget(), GLsizeiptr(myElemsNb) * theStride, theData, GL_STATIC_DRAW);
  bool isDone = (glGetError() == GL_NO_ERROR); // GL_OUT_OF_MEMORY
  Unbind (theGlCtx);
  return isDone;

返回假,

因为

bool OpenGl_VertexBuffer::Create (const Handle(OpenGl_Context)& theGlCtx)

  if (myBufferId == NO_BUFFER)
  
    theGlCtx->core15fwd->glGenBuffers (1, &myBufferId);
  
  return myBufferId != NO_BUFFER;

returned false ,这意味着 myBufferId 仍然等于在 OpenGl_VertexBuffer 的构造函数中设置的 NO_BUFFER 这意味着

theGlCtx->core15fwd->glGenBuffers (1, &myBufferId);

没有改变任何东西。 OpenGl_Context.hxx line:583 中的注释说

  OpenGl_GlCore15Fwd*  core15fwd;  //!< OpenGL 1.5 without deprecated entry points

OpenGl_GlCore15Fwd::glGenBuffers 函数只是调用文件 OpenGl_GlFunctions.hxx 中的 OpenGL 函数

  inline void glGenBuffers (GLsizei n, GLuint *buffers)
  
    ::glGenBuffers (n, buffers);
  

这可能是错误的推论,但我没有深入挖掘

【讨论】:

以上是关于QT 和 OpenCascade 内存不足的主要内容,如果未能解决你的问题,请参考以下文章

在vs中进行qt桌面应用开发时,编译器堆溢出的编译错误(error C1060编译器堆内存不足)

在vs中进行qt桌面应用开发时,编译器堆溢出的编译错误(error C1060编译器堆内存不足)

内存不足、内存溢出的原因和解决方法?

如何解决“内存不足”的问题

虚拟机显示物理内存不足怎么解决

安卓手机下载软件总是提示内存不足,怎么办?