化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得

这篇具有很好参考价值的文章主要介绍了化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本人使用WPF开发了一款OFD阅读器,显示字体是阅读器中最重要的功能。处理字体显示有多种方案,几易其稿,最终选用Freetype方案。本文对WPF中如何使用Freetype做简单描述。

OFD中有两种字体:嵌入字体和非嵌入字体。1) 非嵌入字体就是只提供字体名称,不提供字体对应的文件。2)嵌入字体:提供字体文件,字体名称是啥并不影响显示。由于阅读器中需要显示大量文本,必须采用最优的方式显示,否则性能难以满足要求。

WPF字体显示有多种方案。 通常可以将文本呈现分为三层:

  1. 直接使用 Glyphs 和 GlyphRun 对象。
  2. 使用 FormattedText 对象。
  3. 使用高级控件,如 TextBlock 和 FlowDocument 对象。

第三种方案,显然不合适,可行的只有第一和第二种方案。对于嵌入字体,必须采用第一种方案;非嵌入字体可以采用第一和第二种方案。总之,可以采用第三种方案解决一切字体问题。

但是,本人在使用GlyphRun 过程中,遇到很多奇怪的问题,有两方面原因导致的:

      1)越底层的功能使用的人越少,缺少相应资料。

        2)微软在开放底层功能上犹抱琵琶半遮面,导致使用过程中不知所以然,遇到问题难以解决。

本人开发的OFD阅读器最初采用了WPF自带字体方案,遇到很多坑,还有一些坑无论如何也解决不了。痛定思痛,决定采用Freetype库显示字体;经过一番折腾,终于成功了。

历经曲折,获得一番感悟:微软为了使开发者开发更方便,屏蔽了太多底层的东西;这导致开发人员遇到问题时无所适从。不要紧盯着微软不放;另辟蹊径,反而柳暗花明又一村。

使用Freetype显示字体前,需要弄明白字体的本质;字体的本质就是一系列曲线和对应的unicode编码;显示字体就是画曲线,和画一条直线、圆等没有区别。 unicode编码是为了交互用的,从阅读器上复制一行字,其实就是复制字体的unicode编码。字体除了这些属性以外,还有很多概念:字体高度、行间距、baseline、原点等。

使用Freetype,就需要获取每个字体对应的曲线和字体相关的一些列属性。但是,Freetype是用c语言开发的,导出的函数接口难以与c#交互,需要在Freetype的基础上再次封装,以方便c#调用。以获取字体对应的曲线为例,阐述如何进一步封装Freetype。

我们见到的曲线多种多样;但是从底层来看,所有的曲线可分为两类:直线和贝塞尔曲线。这些恰好对应OFD的图形对象(PathObject),看下图:

c# freetype,c#,c++,ofd,wpf,microsoft,windows

OFD文件中一段图形对象:

c# freetype,c#,c++,ofd,wpf,microsoft,windows

阅读器处理PathObject时,就需要解析这些字符串,生成对应的曲线。Freetype也需要从字库中解析出曲线,其对应的函数是非常复杂的,摘录一段函数:

c# freetype,c#,c++,ofd,wpf,microsoft,windows

很显然,c#无法直接使用;考虑PathObject的描述方式,本人眼前一亮,何不将字体曲线描述为PathObject方式,对外输出字符串。函数接口定义如下:

extern "C" FREETYPELIB_EXPORT INT32 Freetype_GetTextPath(UINT64 handle,
    UINT32 nGlyphIndex, INT32 fontSize, char* textPath, INT32 textPathLen);

textPath包含曲线信息,其格式与OFD中的PathObject规范一致,我们就可以用处理PathObject的方式处理字体。
WPF显示曲线使用PathGeometry,需要将textPath转换为PathGeometry。再而,我们就可以使用WPF类DrawingContext画出曲线

class DrawingContext
{
public abstract void DrawGeometry(Brush brush, Pen pen, Geometry geometry);
 ......
}

至此,字体就可以显示出来了。通过这一番操作,我们也对字体的本质有更加深刻的了解。前文只是简单对显示字体做了讲述,要正确处理字体还有大量的工作要做。

Freetype性能如何?

功能正常了,下一步关心的问题就是性能。为了提高性能,从FreeType获取字体的PathGeometry时做缓冲;同一个字体,下次显示时,直接使用上次的字体生成的PathGeometry,不再从Freetype获取字体。
本人做了简单的对比测试,Freetype性能要高于使用FormattedText方案,性能大概提升三倍;与GlyphRun方案没做对比。

总结: 使用FreeType库,可以使我们更好的理解底层处理逻辑,更好的理解字体的本质。抓住了本质,就能直面问题,解决问题就顺畅很多。不同的库、不同函数都有它的应用场景;当微软提供的库不再适合当前应用时,大胆的使用新库,反而可能使我们快速走出困局!文章来源地址https://www.toymoban.com/news/detail-789149.html

到了这里,关于化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 化繁为简,MyBatis-Plus 里面的增删改查

    在当前盛行的 SpringBoot 项目中,整合持久层这一块,目前主流的有两种:JPA 和 MyBatis-Plus。至于哪个用的更多一些,这个主要还是看每个公司的技术架构,但硬是要说一个最为常用的,我认为是 MyBatis-Plus,而在这里也是对 MyBatis-Plus 的一个使用进行演示 好了,废话不多说,直

    2024年02月04日
    浏览(27)
  • C++分治(分而治之)算法:将复杂问题化繁为简

    导语: 在计算机科学领域,分治算法是一种常见且强大的问题求解方法。它将一个复杂的问题分解成若干个规模较小且相互独立的子问题,并通过递归地解决这些子问题来得到最终的结果。本文将介绍C++中实现分治算法的基本原理及示例,帮助读者更好地理解和应用这一算法

    2024年01月25日
    浏览(34)
  • 华为OD机试 - 字符串化繁为简(Java & JS & Python)

    题目描述 给定一个输入字符串,字符串只可能由英文字母( \\\'a\\\' ~ \\\'z\\\'、\\\'A\\\' ~ \\\'Z\\\' )和左右小括号( \\\'(\\\'、\\\')\\\' )组成。 当字符里存在小括号时,小括号是成对的,可以有一个或多个小括号对,小括号对不会嵌套,小括号对内可以包含1个或多个英文字母,也可以不包含英文字母。

    2024年02月09日
    浏览(36)
  • 【C++】万字一文全解【继承】及其特性__[剖析底层化繁为简](20)

    前言 大家好吖,欢迎来到 YY 滴C++系列 ,热烈欢迎! 本章主要内容面向接触过C++的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《初学者易

    2024年02月01日
    浏览(30)
  • 化繁为简 面板式空调网关亮相上海智能家居展 智哪儿专访青岛中弘赵哲海

    面对中央空调协议不开放和智能家居协议不统一的问题,青岛中弘选择中央空调控制器这一细分赛道入局智能家居市场,始终贯彻“所有空调,一个网关”的产品技术理念,逐渐探索出一条中弘的发展路径和商业模式。 在2023年的SSHT上海国际智能家居展上,青岛中弘展示了其

    2024年02月09日
    浏览(47)
  • 【腾讯云 TDSQL-C Serverless 产品体验】TDSQL-C MySQL Serverless云数据库化繁为简

    随着互联网的发展,企业的规模也在不断的发展,企业内部的在线业务量也随之骤增,海量的数据访问和存储压力已经日益不满足公司业务的需求了,而且搭建传统集中式数据库也增加运维工作量和公司软硬件成本,对于突发的业务,无法满足更快更稳定的业务性能。 企业级

    2024年02月08日
    浏览(42)
  • 【WPF】使用 WriteableBitmap 提升 Image 性能

    由于中所周不知的原因,WPF 中想要快速的更新图像的显示速率一直以来都是一大难题。在本文中,我将分享一些我对于 WPF 领域的经验和见解。虽然我并不是这方面的专家,但是希望通过我的分享,能够为大家提供一些有用的信息和思考角度。 WriteableBitmap 继承至 System.Windo

    2024年01月24日
    浏览(40)
  • WPF线程使用详解:提升应用性能和响应能力

    在WPF应用程序开发中,线程的合理使用是保证应用性能和响应能力的关键。WPF提供了多种线程处理方式,包括UI线程、后台线程、Task/Async Await和BackgroundWorker。这些方式与传统的Thread类相比,更加适用于WPF框架,并能够简化线程操作。下面将详细介绍这些线程方式的特点以及与

    2024年02月15日
    浏览(49)
  • WPF性能优化示例:使用VirtualizingStackPanel提升界面加载速度

      概述: WPF界面绑定和渲染大量数据可能导致性能问题。通过启用UI虚拟化、异步加载和数据分页,可以有效提高界面响应性能。以下是简单示例演示这些优化方法。 在WPF中,当你尝试绑定和渲染大量的数据项时,性能问题可能出现。以下是一些可能导致性能慢的原因以及优

    2024年04月12日
    浏览(27)
  • 如何提升SOLIDWORKS内存使用性能

    在使用SolidWorks处理大型装配体或是进行复杂模型的设计验证分析时,如果电脑配置比较低就会出现内存不足的提示。在碰到这样的情况时,假如由于具体条件的限制无法快速实现更换电脑配置的操作,如何在电脑硬件不变的提升SolidWorks 内存使用性能,就是大家比较关心的问

    2024年02月05日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包