zyl910

优化技巧、硬件体系、图像处理、图形学、游戏编程、国际化与文本信息处理。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  215 随笔 :: 0 文章 :: 145 评论 :: 111万 阅读
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

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

 

(完)

posted on   zyl910  阅读(2815)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示