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 阅读(344) 
评论(0)  编辑 收藏 引用