Panda3D中程序生成图元与导入3D模型的内存占用及性能影响对比咨询
我最近刚接触Panda3D,同时正在学习Python,完全是游戏开发新手,想请教大家一个问题:比如一个简单的立方体,我可以用Blender建模后通过Blend2Bam工具转成.bam格式导入Panda3D,也可以用Panda自带的机制程序生成。当对象数量不断增加时,哪种方式会占用更多内存/系统资源,或者对帧率产生更大的负面影响?
凭直觉我觉得程序生成的资源开销更低,每个对象的数据占用会更精简——比如我用Blender做的一个球体转成.bam后大小有26MB。我还看到过一篇相关的研究论文,里面的结论似乎和我的直觉一致,但那篇论文并不是针对Panda3D的,考虑到Panda3D是Python脚本调用C++底层的引擎,可能还有额外的影响因素,我不确定Panda3D的程序生成工具效率到底怎么样,希望能得到针对这个引擎的具体分析。
*Edit - 附上我目前用的程序生成立方体的代码示例:
def normalized(*args): myVec = LVector3(*args) myVec.normalize() return myVec def makeSquare(x1, y1, z1, x2, y2, z2): format = GeomVertexFormat.getV3n3t2() # vertex, normals, texcord - alternative use only vertex and texcoord: v3t2 - may not need normals vdata = GeomVertexData('square', format, Geom.UHStatic) # change to STATIC! vertex = GeomVertexWriter(vdata, 'vertex') # variable for... vertex writer? normal = GeomVertexWriter(vdata, 'normal') texcoord = GeomVertexWriter(vdata, 'texcoord') if x1 != x2: vertex.addData3(x1, y1, z1) vertex.addData3(x2, y1, z1) vertex.addData3(x2, y2, z2) vertex.addData3(x1, y2, z2) normal.addData3(normalized(2 * x1 - 1, 2 * y1 - 1, 2 * z1 - 1)) normal.addData3(normalized(2 * x2 - 1, 2 * y1 - 1, 2 * z1 - 1)) normal.addData3(normalized(2 * x2 - 1, 2 * y2 - 1, 2 * z2 - 1)) normal.addData3(normalized(2 * x1 - 1, 2 * y2 - 1, 2 * z2 - 1)) else: vertex.addData3(x1, y1, z1) vertex.addData3(x2, y2, z1) vertex.addData3(x2, y2, z2) vertex.addData3(x1, y1, z2) normal.addData3(normalized(2 * x1 - 1, 2 * y1 - 1, 2 * z1 - 1)) normal.addData3(normalized(2 * x2 - 1, 2 * y2 - 1, 2 * z1 - 1)) normal.addData3(normalized(2 * x2 - 1, 2 * y2 - 1, 2 * z2 - 1)) normal.addData3(normalized(2 * x1 - 1, 2 * y1 - 1, 2 * z2 - 1)) texcoord.addData2f(0.0, 1.0) texcoord.addData2f(0.0, 0.0) texcoord.addData2f(1.0, 0.0) texcoord.addData2f(1.0, 1.0) tris = GeomTriangles(Geom.UHStatic) tris.addVertices(0, 1, 3) tris.addVertices(1, 2, 3) square = Geom(vdata) square.addPrimitive(tris) return square # Note: it isn't particularly efficient to make every face as a separate Geom. # instead, it would be better to create one Geom holding all of the faces. square0 = makeSquare(-1, -1, -1, 1, -1, 1) #### EACH SQUARE IS TWO TRIS! square1 = makeSquare(-1, 1, -1, 1, 1, 1) square2 = makeSquare(-1, 1, 1, 1, -1, 1) square3 = makeSquare(-1, 1, -1, 1, -1, -1) square4 = makeSquare(-1, -1, -1, -1, 1, 1) square5 = makeSquare(1, -1, -1, 1, 1, 1) snode = GeomNode('square') snode.addGeom(square0) snode.addGeom(square1) snode.addGeom(square2) snode.addGeom(square3) snode.addGeom(square4) snode.addGeom(square5)
我还注意到,从.egg或.bam导入的模型,看起来不一定像程序生成的模型那样数据精简。这里面有很多变量可能影响最终结果,比如模型是否支持四边形还是只能用三角形,或者程序生成时顶点/面/三角形是逐个计算还是批量处理。上面的代码是我从社区里找的示例修改来的,里面也明确说了这种生成方式内存效率不高,因为把立方体拆成了太多不必要的子对象。
这正好点明了我的核心疑问:在理想情况下,我觉得用程序生成几何体比导入3D软件制作的模型更节省内存和资源(不管是客户端还是服务器端),但也有一些可能性说明情况未必如此,或者不是所有场景都适用。毕竟我对Panda3D引擎本身,以及它和渲染引擎配合使用系统资源的方式了解得不够多,没法判断哪种方式性能最优。
备注:内容来源于stack exchange,提问作者RasaCarta

