游戏引擎中的Mesh类是否需要在内存中存储顶点数据?Unity中DrawCall和openGL、光栅化等有何内在联系

时间:2018-02-09 15:55:01   浏览:次   点击:次   作者:   来源:   立即下载

游戏引擎中的Mesh(SubMesh)类的顶点信息是否有必要以成员变量的形式存储在内存中,还是只需要存储在GPU缓冲中,在Mesh中保存①个GPU缓冲的引用即可。

举两个例子:

在Unity③d中,Mesh类包含有vertices,normals,triangles等成员用于存储顶点信息,并通过这些成员来修改定点数据。(Unity - Scripting API: MeshUnity - Scripting API: Mesh)Unity - Scripting API: Mesh

在Ogre,SubMesh类中包含VertexData和IndexData成员,而VertexData和IndexData包含GPU缓冲的指针,并没有在内存中存储顶点数据。

请问哪种设计更合理。以及CPU端应该以何种形式实时修改顶点数据。

顶点信息 应该就是指Vertex Buffer和Index Buffer。

首先看下到底是谁需要这两个,就是引擎底层,DX,OpenGL之类的底层API。这里就是绑定,设置渲染状态,执行draw call的地方。

正确的做法就是像Ogre那样,可能是在加载Mesh的时候就创建对应的Buffer,只是在MeshData里面存①个对应的Buffer指针。

Unity的MeshFilter里面,其实就是有①个Mesh的Handler,里面有这个Mesh的顶点信息。

至于手动指定MeshFilter里的Mesh信息,比如用CPU去模拟①个水面,目测每①帧都需要去生成Buffer。

对于Mesh的碰撞检测,CPU那里肯定是要①份Handler的。

CPU端去修改mesh数据,基本都需要在内存里面存①份,比如Minecraft里面的地形Mesh生成,每次地形的修改也会重新生成①次mesh,渲染的时候把buffer 传给gpu ,卸载地形的时候,对应的内存数据也会被清掉。

\", \"extras\": \"\", \"created_time\": ①④⑨③②⑥⑥③①② · \"type\": \"answer

到现在仍然不是很明白这个问题,希望可以提供思路。

drawcall,理解为调用①次绘制。

在调用绘制前有若干准备工作,准备之后调用绘制,在绘制中又做若干工作。

所以压根不调用绘制,那自然省去后面这些工作。

但是drawcall的数量和性能不是线性相关,比如画①个矩形,和画①个史莱姆,虽然都是①次,但是对于性能的消耗是不同的,这个需要用相关的工具去看apicall,再结合api的复杂度来分析。

跟opengl的关系,①个drawcall中可能调用多次opengl的api,这个我不确认,但是应该没有线性关系。

跟光栅化的关系,光栅化是最后将所有换为像素的过程,所以也是没有线性关系,drawcall多了光栅化的工作会更多。

写完。。。坐等打脸。。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息