我想你们中的一些人可能会觉得这个挺有意思,尤其是如果你正在制作一款使用游戏内资源作为美术素材的卡牌游戏。

我之前使用的卡牌预制件包含:一个SDF图像背景、一个用于图像的遮罩、卡牌精灵图像本身、一个带有名称和等级文本的标题图像,以及一个用于框住等级的图像。每张卡牌总共需要4-5次绘制调用(!)。

在“手牌”区域(第一张截图底部)最多有5张这样的卡牌,但抽牌堆中的卡牌(左侧)也有类似结构,且数量可达12张。遮罩/模板缓冲写入导致卡牌产生了大量绘制调用,即使我使用了图集来管理卡牌精灵。

我的解决方案是:生成我需要的每一种卡牌排列,将实际3D对象夹在UI卡牌的正反面之间的世界空间中,并以此创建两个图集。一个图集用于主卡牌(带文字),另一个用于抽牌堆卡牌(只有背景和带遮罩的卡牌精灵)。

我还编写了一些运行时编辑器代码,用于绘制网格线辅助居中,并允许选中卡牌,以便对每张卡牌单独调整缩放/位置/旋转,适配那些未完美对齐的模型。

在组装图集之前,我最终不得不(在代码中)单独捕获每张卡牌,因为存在阴影从一个图块投射到另一个图块之类的瑕疵。但总体而言,能预览卡牌效果很好,而能让所有卡牌在同一绘制调用中完成光栅化和绘制则更棒。如最后一张截图所示,我将UI的绘制调用从133次减少到了19次(同时结合了其他清理和Canvas优化工作)。

总之,感谢阅读!希望这能带来一些趣味或帮助。:)