QT和OpenCascade内存不足

时间:2018-10-17 10:06:29

标签: c++ windows qt opencascade

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

我用以下程序编译了程序:

  

QT + =核心gui opengl

当我执行它时,出现以下错误:

  

TKOpenGl |类型:性能|编号:0 |严重程度:低|讯息:VBO   169个顶点的原始数组创建失败。在......之外   记忆吗?

我也已在项目站点上发布了该问题,但是我不确定该地点的活动。 这就是为什么我问你是否有解决办法的原因。

我的测试平台:

  • 具有8GB内存的Intel i7
  • Windows 10
  • OpenCascade 6.9.1 vc12-64
  • QT 5.5.1

1 个答案:

答案 0 :(得分: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;
}

返回false,这意味着myBufferId仍等于OpenGl_VertexBuffer的构造函数中设置的NO_BUFFER 表示

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

什么都没改变。 OpenGl_Context.hxx行中的注释: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);
  }

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