posts - 72,  comments - 4,  trackbacks - 0

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)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理