- 积分
- 19613
- 明经币
- 个
- 注册时间
- 2015-8-18
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 你有种再说一遍 于 2025-5-26 04:57 编辑
我知道怎么实现一个更快的Acad文字编辑器了.
青蛙觉得用winform输入框没有可观可测,
尤其是多行文字的数学公式渲染.
首先我们知道了
Acad10之后有图元重定义,
图元重定义实际上就是应用层的渲染管线,
可以让你原本的文字渲染为不显示,可以把触发新渲染的文字也加入这里,判断是平移还是摄像机变换.这并非数据库内容更改,不涉及事务保护等耗时操作.
夹点重定义本质上就是交互.
包围盒重定义可以把渲染后的新字体大小提供给选择集,这样你才能够选中目标.
实现软件光栅化渲染字体:
解析多行文字格式,提取文字轮廓点,文字间距,
用不同的库解析ttf和shx字体就可以了,
还得实现字体回退功能,
然后把轮廓点用贝塞尔曲线描边,
利用共享内存缓存字体轮廓在非Acad进程上.
曲线和射线求交点,然后用并行SIMD求填充中间部分,
渲染器改用SIMD实现冷启动,避免调用显卡出现延迟.
注意字体不能使用有向距离场,要用传统动态采样密度,
因为我们不是游戏渲染,抗锯齿要比较高.
用Skia库实现就好了,它跨平台,而且同时实现了SIMD和GPU,
你选中其中之一就可以很方便测试速度.
实在不行可以选择重头写渲染,反正也不难
数学公式渲染:
我首先想到md的渲染器,
用KaTeX渲染公式为SVG,通过IPC传递到CAD.
它的C#版本叫做:TexMath
它可以下标和上标分别字体,贴合CAD多行文字.
编辑器功能对着抄就行,
编辑器本体也可以矩阵变换,是按照单行文字的MVP矩阵.
重点其实只是把渲染器和字体做成1:1,
然后记得设置系统缩放,看看是否出现模糊和错乱.
整个过程有点复杂,但是并非做不出来.
渲染管线只需要了解顶点着色和片元着色,
然后你就可以对比GPU和CPU在什么情况下渲染效率更高.
(嘻嘻,真踏马难) |
|