zoukankan      html  css  js  c++  java
  • Wakeari(有诡)念摄模式的渲染原理和帧率暴跌原因分析,及更优化的渲染方案设想

    Wakeari(有诡)中有一个有趣的渲染模式——念摄模式。但在该模式下帧率暴跌。于是我对其进行了分析。

    非念摄模式下有60帧——

    念摄模式下仅有14帧——

    60变为14,帧率暴跌至原来的1/4左右。

      

    技术分析

    估计该游戏采取的是“渲染两次”方案。具体步骤为——

    1.根据鼠标拖动的区域,生成一张掩码位图(念摄区域图);

    2.将外衣的模型标记为可见,渲染场景,输出到纹理A;

    3.将外衣的模型标记为隐藏,渲染场景,输出到纹理B;

    4.根据掩码位图,合并纹理A 和 纹理B,然后输出到屏幕。

    该方案有两个缺点——

    1.第2步、第3步共渲染两次,使帧率下降一半。

    2.在第4步合并纹理图时,需等待第2步、第3步的渲染操作彻底完成后才能执行。堵塞了渲染流水线,严重影响帧率。

    优化方案

     “渲染两次”方案真的太渣了。在DirectX 9.0c下明明可以很简单就能渲染出类似的效果,只需要渲染一次。具体步骤为——

    1.根据鼠标拖动的区域,生成一张掩码位图,并将其作为纹理(念摄区域纹理图);

    2.其他模型仍然按老方式渲染,仅需要修改外衣渲染的像素着色器代码——将当前像素坐标变换到屏幕坐标,根据屏幕坐标查询念摄区域纹理图,若在区域外直接返回透明颜色,若在区域内就按老方法进行渲染。

    仅增加了3条指令。将当前像素坐标变换到屏幕坐标只需要一次矩阵乘法就行了,而且查询纹理图也是速度很快的操作,最后再多一条条件跳转指令。增加的开销微乎其微,理论上能达到与非念摄模式下一样的帧率。

    (完)

  • 相关阅读:
    Vector成员为指针时要注意的问题
    (转)C++中的static关键字的总结
    (转)内联(inline)函数与虚函数(virtual)的讨论
    基类类型和派生类型之间的转换以及虚函数
    (转) vector的reserve和resize
    关于函数返回值的一些见解
    (转)感受异或的神奇
    一个mysql不解的问题
    获取本机TCP连接状态信息
    (转)socket的SYN_RECV和ESTABLISHED状态
  • 原文地址:https://www.cnblogs.com/zyl910/p/wakeari_render_fps.html
Copyright © 2011-2022 走看看