unigine多线程处理系统:
一。 更新系统:
主线程World::update_multiple()中:
1. 清空update_threads[]中每一个thread的所有结点
2. 处理所有node,将node.frame==engine.frame + 1的结点均衡地分配给update_threads[](即每个updatethread尽量拥有数量相同的node, 以便线程处理时间平衡), 同时设置分配后的node.frame=engine.frame(防止更新重入时再次加入此结点)
3. 接着通过update_shader->runSync(size);函数同步更新上述加入的所有结点:
遍历所有存有node的update_threads[],将它们与cpu工作线程关联(这样他们的线程run时会转调转回调用world中的update_threads[id].update(ifps);, 而update_threads[id]能遍历所有加入的node->update()函数同时重置node.frame=engine.frame + 1;
最后等待线程同步执行完所有更新再返回.
【注意】上述第3点的runSync()中对应cpu工作线程数为实际cpu-1个,当cpu为1个时就不用线程而是直接运行完所有结点更新,而如果是
有超过一个cpu的则本地和cpu线程同时进行更新工作。虽然在主线程中同步等待完成,但这样如果有多核则能并发同时处理。
另外还有异步runAsync()函数,分别在PathFind和Physics的更新函数中调用。这个runAsync()函数功能和runSync()差不多,只是它的工作线程为实际cpu个数,然后将任务均衡交给各线程处理,并且不会同步等待完成就返回了。所以是异步并发的。
二。渲染系统:
1.收集可视surfaces(scene intersection):
在RenderRenderer::render_world()中调用scene::getIntersection(bound_frustum,occluder,exclude)中:
a. render world occluders得到所有被occluders排除的nodes;
b. 判断node是否被occluder所排除(exclude),没有则add visible nodes.
c. objects_shader->runSync(RENDER_SCENE_NUM_THREADS);同步等待8线程并发处理所有没被occulude排除的
visible node将它置为visible并将它们在bound_frustum中的surface(submesh)加入surfaces中.
c. 在update_intersection()函数中遍历各线程所加入的surfaces[iThread].size, 将其按材质是否透明收集
到opacity_surfaces和transparent_surfaces中。
2. 反射渲染(render reflections):
render reflections中遍历opacity_surfaces和transparent_surfaces处理收集reflection_2d_surfaces和 reflection_cube_surfaces.并进行反射渲染.
3. update scene:
分别UpdateSurface了opacity_surfaces和transparent_surfaces两种surface,
内部好像只是针对OpctitySurfacefade state和tessellation state设置了对应的材质,并将surface链接起来遍历调用
它们的create(),而create()内部只调用了create(ObjectSurface *surface), 这个好像只有skinmesh重载进行了处理。
4. sort scene:
按照type、mask、center.x顺序分别对Lights、defferredLights、forwardLights进行排序
按照material、resource顺序对opacity_surfaces进行排序
按照order、sequence、distance、blending顺序对transparent_surfaces进行了排序。
在scene->optimize()中将opacity_surfaces和transparent_surfaces统一收集到optimized_surfaces中,然后让 opacity_surfaces和transparent_surfaces重新指向对应的optimized_surfaces中元素。(这是为了让surface更紧凑达到优化效果?)
5. deferred textures:
a. 先得到
deferred->depth_texture、
deferred->color_texture、
deferred->normal_texture、
deferred->parallax_texture、
deferred->texturerender
b. render deferred surfaces:
render_deferred_surfaces(scene->getOpacitySurfaces(),0)
render_deferred_surfaces(scene-getTransparentSurfaces(),0)
6. occlusion queries:
这个是使用dx9的硬件查询进行occulsion的culling.
http://frustum.org/
http://www.humus.name/index.php?page=3D
https://www.assembla.com/code/scavenger/subversion/nodes/692/Scavenger
http://www.hmrengine.com/blog/?cat=5
posted on 2014-03-21 16:01
flipcode 阅读(325)
评论(0) 编辑 收藏 引用