directx12有什么用?游戏画面优化关键在这几步

上礼拜折腾游戏优化差点没给我整秃了。本来2077跑得好好的,一开光追就跟幻灯片似的卡成狗。我叼着冰棍蹲电脑前琢磨,这破显卡也不算差,咋就带不动?结果翻开发者论坛才晓得,搞半天游戏用的还是dx11老底子!

硬着头皮啃dx12

昨儿个直接掀桌重来。先把游戏工程里那坨dx11的祖传代码全给注释掉,dx12的文档啪地拍屏幕上。刚开始连个三角形都画不出来,折腾三小时发现是命令队列没初始化。气得我猛灌两罐红牛,键盘敲得火星子直冒。

重点就这三板斧:
  • 让显卡多线程干活:原先dx11就像单车道,dx12直接改成八车道。我吭哧吭哧拆出来6个命令列表,cpu利用率肉眼可见往上蹿
  • 显存别瞎折腾:dx11那内存搬来搬去跟搬砖似的。现在搞了个资源堆,贴图直接焊死在显存里。光这步就让加载速度唰地快了40%
  • 异步计算大法:把光影计算塞进独立流水线。原先光追卡成PPT,现在显卡一边算爆炸特效一边渲染画面,两不耽误

差点翻车的坑

半夜两点调试到快崩溃,游戏画面突然开始抽风。贴图跟发癫痫似的乱闪,急得我直薅头发。发现是围栏同步搞反了——后执行的命令反而先跳出来干活。解决方法特滑稽:往代码里插了十几个Sleep(1),让线程排队上厕所似的轮着来。

今早重新跑测试直接惊呆。同个夜之城场景,dx11平均47帧,改完dx12直接飚到89帧。显卡风扇声都温柔了,老婆再也不用担心我打游戏时骂街摔键盘。这波折腾值了!

血泪经验:
  • 管线状态对象提前编译千万别在游戏运行时现编
  • 多设备别省那点显存,该分堆时分堆
  • 围栏同步宁愿多点等待,也比画面撕裂强

不过dx12这玩意儿真不是人写的。底层到要手动管显存分配,连个内存泄露都得拿放大镜找。得亏现在工具链完善了,放五年前我怕是直接举白旗投降。优化完看着满屏丝滑的光追倒影,突然觉得昨晚熬的夜也挺香。