<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      讀 WPF 源代碼 了解獲取 GlyphTypeface 的 CharacterToGlyphMap 的數量耗時原因

      在 WPF 里面的 GlyphTypeface 表示字體的字形信息,通過 GlyphTypeface.CharacterToGlyphMap 屬性可以將給定的字符映射到字形索引,這個屬性是一個 IDictionary<int, ushort> 結構,其定義如下

          public class GlyphTypeface : ITypefaceMetrics, ISupportInitialize
          {
              ...
      
              public IDictionary<int, ushort> CharacterToGlyphMap
              {
                  get
                  {
                      CheckInitialized(); // This can only be called on fully initialized GlyphTypeface
                      return _fontFace.CharacterMap;
                  }
              }
      
              private FontFaceLayoutInfo          _fontFace;
              ...
          }
      

      咋看起來沒問題,實際調用的時候,通過 CharacterToGlyphMap 的 TryGetValue 方法獲取傳入的字符對應的字形索引也是十分快速,沒有什么耗時。唯獨只有調用 CharacterToGlyphMap.Count 屬性時,才能測量到很大的耗時

      這是為什么呢,讓咱繼續點開 _fontFace.CharacterMap 屬性的定義,其代碼如下

          internal sealed class FontFaceLayoutInfo
          {
              ...
      
              internal IntMap CharacterMap
              {
                  get
                  {
                      return _cmap;
                  }
              }
              ...
          }
      

      可見是返回了 IntMap 類型的 _cmap 字段,看到這里,似乎非常清真

      繼續看看 IntMap 類型的實現

              internal sealed class IntMap : IDictionary<int, ushort>
              {
                  ...
                  public int Count
                  {
                      get { return CMap.Count; }
                  }
      
                  private Dictionary<int, ushort> CMap
                  {
                  	...
                  }
                  ...
              }
      

      看起來其中核心就在于 CMap 的 get 函數里,繼續看看此屬性的實現

              internal sealed class IntMap : IDictionary<int, ushort>
              {
                  ...
                  private Dictionary<int, ushort> CMap
                  {
                      get
                      {
                          if (_cmap == null)
                          {
                              lock (this)
                              {
                                  if (_cmap == null)
                                  {
                                      _cmap = new Dictionary<int, ushort>();
                                      ushort glyphIndex;
                                      for (int codePoint = 0; codePoint <= FontFamilyMap.LastUnicodeScalar; ++codePoint)
                                      {
                                          if (TryGetValue(codePoint, out glyphIndex))
                                          {
                                              _cmap.Add(codePoint, glyphIndex);
                                          }
                                      }
                                  }
                              }
                          }
                          return _cmap;
                      }
                  }
      
                  private Dictionary<int, ushort>     _cmap;
      
                  ...
              }
      
          public class FontFamilyMap
          {
               ...
      
              internal const int LastUnicodeScalar = 0x10ffff;
               ...
           }
      

      可以看到,此時如果調用 CharacterToGlyphMap.Count 屬性,將會導致 _cmap 字段被初始化。而初始化的過程是采用一個巨大的循環,足足有 0x10ffff 的百萬次循環調用 TryGetValue 方法創建的字典

      即使 TryGetValue 方法速度再快,但是循環本身將會調用 1114111 (0x10ffff) 百萬次,這就是耗時的原因

      按照當前的代碼,直接調用 CharacterToGlyphMap.Count 屬性是非常虧的,將會導致 _cmap 字段被初始化,初始化此字典需要經過百萬次的循環,自然性能很差。但很顯然,這是一個很好做的優化點,只需要繞開字典初始化,直接獲取數量即可

      既然看起來這是一個很好的優化點,自然我就將其優化了: https://github.com/dotnet/wpf/pull/11139

      對于業務端開發者,等不及 WPF 的更新的伙伴們,可以直接使用 GlyphTypeface.GlyphCount 屬性代替 CharacterToGlyphMap.Count 屬性即可

          public class GlyphTypeface : ITypefaceMetrics, ISupportInitialize
          {
              ...
      
              public int GlyphCount
              {
                  get
                  {
                      CheckInitialized(); // This can only be called on fully initialized GlyphTypeface
                      int glyphCount;
      
                      MS.Internal.Text.TextInterface.FontFace fontFaceDWrite = _font.GetFontFace();
                      try
                      {
                          glyphCount = fontFaceDWrite.GlyphCount;
                      }
                      finally
                      {
                          fontFaceDWrite.Release();
                      }
      
                      return glyphCount;
                  }
              }
      
              ...
          }
      

      通過以上代碼可見 GlyphCount 屬性是直接獲取的,基本測量不出耗時

      posted @ 2025-09-27 07:24  lindexi  閱讀(77)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产三级精品三级色噜噜| 天堂网av最新版在线看| 日韩美女一区二区三区视频| 中文字幕久久久久人妻 | 久久精品免视看国产成人| 欧美精品高清在线观看| 国产精品无遮挡又爽又黄| 无码专区 人妻系列 在线| 亚洲欧美综合一区二区三区| 国产成人高清精品亚洲| 国产成人女人在线观看| 精品亚洲欧美无人区乱码| 昌平区| 国产精品一区二区色综合| av中文字幕国产精品| 野花社区视频www官网| 国产av无码专区亚洲草草| 日本一区二区三区东京热| 亚洲欧美日本久久网站| 色8久久人人97超碰香蕉987| 亚洲精品中文字幕一区二| 国产mv在线天堂mv免费观看| 成人欧美一区二区三区在线观看| 国产精品国产三级国产试看| 六十路老熟妇乱子伦视频| 欧美不卡无线在线一二三区观| 精品国产一区二区三区av色诱| 亚洲色大成网站WWW永久麻豆| 被拉到野外强要好爽| 久久美女夜夜骚骚免费视频| 久久婷婷综合色丁香五月| 国产午夜福利视频在线| 无码精品一区二区三区在线| 日韩精品一二三黄色一级| 人妻精品动漫H无码中字| 织金县| 亚洲熟妇自偷自拍另欧美| 成 人 色 网 站免费观看| 男女性杂交内射女bbwxz| 久久成人国产精品免费软件 | 久久人妻无码一区二区三区av|