Cache The RenderList

来源:互联网 发布:关键词优化 智搜宝 编辑:程序博客网 时间:2024/05/27 03:26

        大部分游戏渲染的时候都会构建一个管理Render物体的List,所以简称RenderList,所有要绘制的物体的RT,Shader,Texture,Shader Constant都是保存在这个数据结构里的,构建好RenderList之后才会把这些需求发给GPU执行。

        在场景物件很多的时候这个RenderList的构件时间极其夸张,有时候会占到Render线程一半的时间,更让人觉得接受不了的是很多时候Camera基本没怎么动这个开销依然还是那么大。因此降低这个RenderList的构件时间非常重要,因为按照优化准则,总是优化最费的那部分,RenderList这时候觉得算得上NO1了。

        我们可以想象,如果Camera不动,对于静态物体来说前一帧和当前帧画的物体一个没多一个没少,那么干嘛不把上一帧的RenderList拿来用呢?嗯,的确可以。如果Camera动起来了就不行了,因为有的物体可能看不见了,不需要再画了,有些物体上一帧没出现,camera转动之后可能当前帧看到了,需要加入新的物体到RenderList。而这时候上一帧看到并且这一帧还看到的物体占了RenderList的一大部分(比例依赖于Camera的转动幅度)。这么分析下来,思路已经很清楚了,对于上一帧出现,当前帧出现的物体继续保留,对于上一帧可见,当前帧不可见的物体垃圾回收掉,对于上一帧不可见当前帧可见的物体新增到RenderList里。

        那么怎么来标记在哪一帧可见呢?其实很简单给每一个RenderPack加一个FrameStamp即可

        

struct RenderPack{        .......//RenderPack Content        u32  mFrameStamp;};
       

        每一帧构建RenderList的时候会为每个RenderPack打标记,如果mFrameStamp==LastFrameStamp的话说明上一帧可见,并且当前帧依然可见,只需要更新mFrameStamp即可(这样就把构建一个RenderPack的操作优化为mFrameStamp的更新了),对于mFrameStamp==LastFrameStamp,而这一帧不可见的RenderPack就可以这一帧绘制的时候跳过,或者垃圾回收掉,对于mFrameStamp<LastFrameStamp的RenderPack来说上一帧是不可见的,需要从Pool里拿一个出来。


        有了RenderList的Cache机制后,可以为RenderList预留一个Pool,所有的RenderPack都是从这个Pool里去拿的,而不是动态分配和销毁,这样也可以提高性能并且降低内存碎片。这个方法有些时候会带来5倍(节省80%)的RenderList构件时间的提升

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 错过了自主招生考试怎么办? 科目一考试错过了时间怎么办 中学生网瘾怎么办济南远大认真 u盘安装不了系统怎么办 对敏感脆弱的青春期孩子怎么办? 脸变得很交黑怎么办 玩手机长痘痘了怎么办 青少年左侧后背突发疼痛怎么办 纵欲过度导致青少年白发怎么办 20岁了不想长大怎么办 网吧老板跑路了怎么办 网吧玩地下城卡怎么办 个人公积金封存之前厂子欠费怎么办 学生欠了2万块怎么办 玉米去完库存量cool怎么办 幸福蓝海电子券过期怎么办 幸福蓝海国际影城会员怎么办 幸福蓝海会员卡过期了怎么办 电机线圈处于平衡位置怎么办 混联电路求电功率最小怎么办 电脑超出工作频率范围怎么办 手机红外线感应器坏了怎么办 我的世界左右慢怎么办 发电机自动启停装置故障怎么办 如果自动启停没关发动机涉水怎么办 偏激的人不分手怎么办 被极端的人纠缠怎么办 对固执偏激的人怎么办 车子右前轮偏磨怎么办? 轮胎边缘磨黑了怎么办 36周胎儿绕颈一周怎么办 孕中期胎儿偏小怎么办 怀孕34周偏小2周怎么办 胎盘低怎么办6个月了 怀孕四个月胎盘低怎么办 怀孕五个月胎盘低怎么办 怀孕3个月胎盘低怎么办 怀孕三个月了胎盘低怎么办 新房交房开发商拿不出证件怎么办? 新干式变压器未送电进水怎么办 三相380转单相220怎么办