From fe730defb7d72839e37bb6270c5bfeba077b7035 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Mon, 21 Feb 2022 17:13:12 +0800 Subject: [PATCH] auto clear chars from tile font. --- CMCore | 2 +- inc/hgl/graph/VKRenderResource.h | 1 - inc/hgl/graph/font/TextLayout.h | 3 ++- inc/hgl/graph/font/TextRender.h | 4 +++ inc/hgl/graph/font/TextRenderable.h | 16 +++++++++++- src/SceneGraph/Vulkan/VKRenderResource.cpp | 12 --------- src/SceneGraph/font/TextLayout.cpp | 25 ++++++++++++++++--- src/SceneGraph/font/TextRender.cpp | 29 +++++++++++++++++++--- src/SceneGraph/font/TileFont.cpp | 2 +- 9 files changed, 70 insertions(+), 24 deletions(-) diff --git a/CMCore b/CMCore index 9376568d..c2ac03c3 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit 9376568d47e1195a71b67b43d15042765e90cccf +Subproject commit c2ac03c35bc545ae529cd54569c7557dc338fd67 diff --git a/inc/hgl/graph/VKRenderResource.h b/inc/hgl/graph/VKRenderResource.h index 4b702bfb..17190f7b 100644 --- a/inc/hgl/graph/VKRenderResource.h +++ b/inc/hgl/graph/VKRenderResource.h @@ -94,7 +94,6 @@ public: //Material MaterialInstance * CreateMaterialInstance(const OSString &,const VABConfigInfo *vab_cfg=nullptr); Renderable * CreateRenderable(const uint32_t vertex_count=0); - TextRenderable * CreateTextRenderable(Material *); RenderableInstance *CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p); diff --git a/inc/hgl/graph/font/TextLayout.h b/inc/hgl/graph/font/TextLayout.h index 8144c1ac..7cf342c8 100644 --- a/inc/hgl/graph/font/TextLayout.h +++ b/inc/hgl/graph/font/TextLayout.h @@ -101,6 +101,7 @@ namespace hgl int draw_chars_count; ///<要绘制字符列表 SortedSets chars_sets; ///<不重复字符统计缓冲区 + SortedSets clear_chars_sets; ///<待清除的字符合集 TileUVFloatMap chars_uv; ///<所有要绘制字符的uv struct CharDrawAttr @@ -111,7 +112,7 @@ namespace hgl ObjectList draw_chars_list; ///<所有字符属性列表 - template bool preprocess(TileFont *,const T *,const int); + template bool preprocess(TextRenderable *,TileFont *,const T *,const int); protected: diff --git a/inc/hgl/graph/font/TextRender.h b/inc/hgl/graph/font/TextRender.h index 521dec16..691efb91 100644 --- a/inc/hgl/graph/font/TextRender.h +++ b/inc/hgl/graph/font/TextRender.h @@ -33,6 +33,8 @@ namespace hgl Color4f color; GPUBuffer * ubo_color; + SortedSets tr_sets; + private: friend TextRender *CreateTextRender(GPUDevice *,FontSource *,RenderPass *,GPUBuffer *); @@ -57,6 +59,8 @@ namespace hgl bool Layout(TextRenderable *tr,const UTF16String &str); RenderableInstance *CreateRenderableInstance(TextRenderable *text_render_obj); + + void Release(TextRenderable *); };//class TextRender /** diff --git a/inc/hgl/graph/font/TextRenderable.h b/inc/hgl/graph/font/TextRenderable.h index 68aa9410..b645b68d 100644 --- a/inc/hgl/graph/font/TextRenderable.h +++ b/inc/hgl/graph/font/TextRenderable.h @@ -19,10 +19,24 @@ namespace hgl VBO * vbo_position; VBO * vbo_tex_coord; + protected: + + friend class TextLayout; + friend class TextRender; + + SortedSets chars_sets; + + const SortedSets &GetCharsSets()const{return chars_sets;} + void SetCharsSets(const SortedSets &sl){chars_sets=sl;} + void ClearCharsSets(){chars_sets.Clear();} + + private: + + virtual ~TextRenderable(); + public: TextRenderable(GPUDevice *,Material *,uint mc=1024); - virtual ~TextRenderable(); public: diff --git a/src/SceneGraph/Vulkan/VKRenderResource.cpp b/src/SceneGraph/Vulkan/VKRenderResource.cpp index ab2653cd..41fe1624 100644 --- a/src/SceneGraph/Vulkan/VKRenderResource.cpp +++ b/src/SceneGraph/Vulkan/VKRenderResource.cpp @@ -84,18 +84,6 @@ Renderable *RenderResource::CreateRenderable(const uint32_t vertex_count) return ro; } -TextRenderable *RenderResource::CreateTextRenderable(Material *mtl) -{ - if(!mtl)return(nullptr); - - TextRenderable *tr=new TextRenderable(device,mtl); - - if(tr) - Add(tr); - - return tr; -} - RenderableInstance *RenderResource::CreateRenderableInstance(Renderable *r,MaterialInstance *mi,Pipeline *p) { if(!p||!mi||!r) diff --git a/src/SceneGraph/font/TextLayout.cpp b/src/SceneGraph/font/TextLayout.cpp index fea7a218..bc822bdb 100644 --- a/src/SceneGraph/font/TextLayout.cpp +++ b/src/SceneGraph/font/TextLayout.cpp @@ -48,9 +48,10 @@ namespace hgl * 预处理所有的字符,获取所有字符的宽高,以及是否标点符号等信息 */ template - bool TextLayout::preprocess(TileFont *tile_font,const T *str,const int str_length) + bool TextLayout::preprocess(TextRenderable *tr,TileFont *tile_font,const T *str,const int str_length) { - if(!tile_font + if(!tr + ||!tile_font ||!str||!*str||str_length<=0 ||!font_source) return(false); @@ -81,7 +82,21 @@ namespace hgl ++cp; } } - + + //释放不再使用的字符 + { + clear_chars_sets=tr->GetCharsSets(); //获取不再使用的字符合集 + + clear_chars_sets.Clear(chars_sets); //清除下一步要用的字符合集 + + if(clear_chars_sets.GetCount()>0) //可以彻底清除的字符 + { + tile_font->Unregistry(clear_chars_sets.GetList()); + + clear_chars_sets.ClearData(); + } + } + //注册不重复字符给tile font系统,获取所有字符的UV if(!tile_font->Registry(chars_uv,chars_sets)) { @@ -91,6 +106,8 @@ namespace hgl return(false); } + tr->SetCharsSets(chars_sets); //注册需要使用的字符合集 + //为可绘制字符列表中的字符获取UV { CharDrawAttr **cda=draw_chars_list.GetData(); @@ -236,7 +253,7 @@ namespace hgl int max_chars=str.Length(); - if(!preprocess(tf,str.c_str(),max_chars)) + if(!preprocess(tr,tf,str.c_str(),max_chars)) return(-2); if(draw_chars_count<=0) //可绘制字符为0???这是全空格? diff --git a/src/SceneGraph/font/TextRender.cpp b/src/SceneGraph/font/TextRender.cpp index 658d05c1..c1deac18 100644 --- a/src/SceneGraph/font/TextRender.cpp +++ b/src/SceneGraph/font/TextRender.cpp @@ -28,6 +28,14 @@ namespace hgl TextRender::~TextRender() { + for(TextRenderable *tr:tr_sets) + { + tile_font->Unregistry(tr->GetCharsSets().GetList()); + delete tr; + } + + tr_sets.Clear(); + SAFE_CLEAR(tl_engine); SAFE_CLEAR(tile_font); SAFE_CLEAR(db); @@ -139,13 +147,17 @@ namespace hgl } TextRenderable *TextRender::CreateRenderable() - { - return db->CreateTextRenderable(material); + { + TextRenderable *tr=new TextRenderable(device,material); + + tr_sets.Add(tr); + + return tr; } TextRenderable *TextRender::CreateRenderable(const UTF16String &str) { - TextRenderable *tr=db->CreateTextRenderable(material); + TextRenderable *tr=CreateRenderable(); if(tl_engine->SimpleLayout(tr,tile_font,str)<=0) return(tr); @@ -169,6 +181,17 @@ namespace hgl return db->CreateRenderableInstance(text_render_obj,material_instance,pipeline); } + void TextRender::Release(TextRenderable *tr) + { + if(!tr)return; + + if(!tr_sets.Delete(tr))return; + + tile_font->Unregistry(tr->GetCharsSets().GetList()); + + delete tr; + } + FontSource *CreateCJKFontSource(const os_char *cf,const os_char *lf,const uint32_t size) { Font eng_fnt(lf,0,size); diff --git a/src/SceneGraph/font/TileFont.cpp b/src/SceneGraph/font/TileFont.cpp index a8604be0..002a6494 100644 --- a/src/SceneGraph/font/TileFont.cpp +++ b/src/SceneGraph/font/TileFont.cpp @@ -28,7 +28,7 @@ namespace hgl /** * 注册要使用的字符 * @param rs 每个字符在纹理中的UV坐标 - * @param ch_list 要注册的字符列表 + * @param chars_sets 要注册的字符合集 */ bool TileFont::Registry(TileUVFloatMap &uv_map,SortedSets &chars_sets) {