中文第一计算机图形学社区OpenGPU 版权所有2007-2018

 找回密码
 注册

扫一扫,访问微社区

搜索
查看: 148|回复: 1

关于引擎UI汉字图集渲染优化方案?

[复制链接]
发表于 2018-9-12 20:58:21 | 显示全部楼层 |阅读模式
原来的方案:在UI渲染时,建立文字图集map(utf16_code, fontInfo{texcoord, font size, font face name.etc})。在UI渲染前更新此图集纹理,当一张图集装不下时,再分配一张。问题出现了,当渲染一段文字时,若文字不在同一个图集中会导致批次增高。现在想到两种方案去优化,希望大大们指教一下哪种方案比较好:

1.在UI顶点中添加图集索引index,ps阶段根据索引采样相应纹理(若不支持texture2d array)直接设到相应slot上。

2.直接推翻原有方案,按照当帧文字CPU buffer去追加相应图集,若图集容纳不下,按一定策略查找图集中不用的区域去追加。

第一个方案主要想到有些概念不太明白:在ps阶段if {}elseif {} else 去判断采样哪个纹理时,具体怎么执行的?我隐约的记得某编文章说的,ps分支是所有的shader都执行一遍,若采样n次,这代价有点高,是这样的吗?

第二个方案 也有两种方法,1.若记录追加的相应图集区域及buffer时,然后再开始渲染文字之前,需要更新纹理,反复使用UpdateSubTextureWithRect(rc)去更新 2.在cpu中缓存一份font texture的所有数据,然后再开始渲染文字之前,更新整个纹理。

关于第二个方案的两种方法,哪一种更好呢?第一种:虽然更新小块,但有可能更新多次,深究下去(gpu内部,在每次更新小区域时,是dma数据还是computer shader cpu上传至gpu?然后刷新 L2 cache(TA cache,TDCache)?)。第二种:更新整块,相当于重新创建了一张相同大小的texture,上行cpu数据至gpu。哪种方案更好呢?

还是各位大大有新的方案?谢谢


发表于 2018-9-14 11:54:16 | 显示全部楼层
1、看SIMD Mask

随便找找几篇文章
https://gain-performance.com/201 ... cution-using-masks/
http://www.cs.columbia.edu/~kar/pubsk/simd.pdf

GPU执行原理一样。

除非是代码生成之前能够优化掉,或者是码农自己用比如min max step等函数写的Trick,本质上都一样。如今GPU做if else其实都还可以,只要不要太疯狂,都还堪用。

2、这个取决于实际。哪个快好用哪个。是不是DMA,这个是驱动负责,上层应用程序思考这个毫无意义。程序通过配置一些参数可能可以进行一些配置,但是还是得按照实际执行来测试效率。很显然对于带宽需求来说,一整块肯定比一小块的负载大的多。但是CPU那边如何组织逻辑,这个就是具体程序的行为了。

其实可以看KlayGE怎么做的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|关于我们|小黑屋|Archiver|手机版|中文第一计算机图形学社区OpenGPU

GMT+8, 2018-10-20 17:16 , Processed in 0.051405 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表