游戏引擎中的Mesh类是否需要在内存中存储顶点数据?Unity中DrawCall和openGL、光栅化等有何内在联系
游戏引擎中的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多了光栅化的工作会更多。
写完。。。坐等打脸。。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息