美文网首页
python弱引用来管理游戏中组件式的UI

python弱引用来管理游戏中组件式的UI

作者: 人在广州_2017 | 来源:发表于2017-07-07 22:56 被阅读0次

问题介绍:

项目中有一种组件式的UI,即一些UI的小部件,可以随时地卸载或显示,而不依赖于当前所在的场景,如左上角角色信息、右上角小地图、菜单、聊天框等。为了统一地对这些组件UI进行管理,需要做到:

  1. 开发更多组件UI时,需要实现展示和隐藏的接口
  2. 统一地管理添加、删除和隐藏组件UI
  3. 索引不影响UI对象的正常释放

实现:

为了在任何场景中都可以有选择的动态添加、删除或隐藏这些UI部件,我约定了一个组件UI接口类UIComponent,然后用一个全局列表索引所有组件,这样对外只需要留很少的接口就可以管理这些组件了。

但是,由于组件的UI有可能因为各种形式被程序的逻辑移除,导致组件UI的索引表失效,于是便引入了python的弱引用

python的内存是通过引用计数垃圾回收来管理的,当一个Python对象被引用时其引用计数增加1,当其不再被一个变量引用时则计数减1。当引用计数等于0时对象被删除。我们可以很轻易地用sys.getrefcount(o)这个函数来打印出python对象的引用计数。

同时,python也提供了一个weakref模块,创建了一个弱引用后,可以引用python的对象,而不增加其引用计数。弱引用提供一个函数来查询所引用的对象是否有效。
下面是python里面使用弱引用的例子:

>>> import sys
>>> import weakref
>>> class Class1:
  def test(self):
    print "test..."

>>> o = Class1()
>>> sys.getrefcount(o)
2
>>> r = weakref.ref(o) # 创建一个弱引用
11
>>> sys.getrefcount(o) # 引用计数并没有改变
2
>>>  o = None
>>>  r # 当对象引用计数为零时,弱引用失效。
<weakref at 00D3B3F0; dead>

这样,上面的组件UI全局索引改成对UI对象弱引用的索引,而不用影响UI对象的正常释放回收。相当于一个透明对这些组件UI进行管理。

class UIComponent(object):
    """组件式的UI,统一隐藏和显示行为"""
    def __init__(self, host):
        self._ret_host = weakref.ref(host)

        self._show_ui_callback = None
        self._hide_ui_callback = None

        # 创建宿主的弱引用,检查宿主失效,并清理
        G_COMPONENT_UI[self._ret_host] = weakref.ref(self)

    def destory(self):
        del G_COMPONENT_UI[self._ret_host]

    def show_component_ui_callback(self, callback):
        self._show_ui_callback = callback

    def hide_component_ui_callback(self, callback):
        self._hide_ui_callback = callback

G_COMPONENT_UI = {}
def hide_all_compent_ui():
    del_list = []
    for ref_host, ui_component in G_COMPONENT_UI.iteritems():
        host = ref_host()
        if not host:
            del_list.append(ref_host)
        else:
            ui_component = ui_component()
            if not ui_component:
                del_list.append(ref_host)
            elif ui_component._hide_ui_callback:
                ui_component._hide_ui_callback()
            else:
                if hasattr(host,"hide"):
                    host.hide()

    for i,ref_host in enumerate(del_list):
        del G_COMPONENT_UI[ref_host]

相关文章

  • python弱引用来管理游戏中组件式的UI

    问题介绍: 项目中有一种组件式的UI,即一些UI的小部件,可以随时地卸载或显示,而不依赖于当前所在的场景,如左上角...

  • iView的表格里如何使用:switch,button

    iView是一个很好用的vue组件式的一个开发后台管理系统的ui组件,它里面已经定义好了:table组件,sele...

  • reactnative 桥

    分为方法桥和UI组件桥,用来调用native代码的方法和UI组件 方法桥: 继承ReactContextBaseJ...

  • Vue 集成 storybook

    一、storybook 介绍 storybook是一个开源的组件管理、文档UI展示工具,用来在大型的项目中,让团队...

  • ViewMode

    ViewModel 负责管理UI组件(activity/fragment)相关的数据,还可以负责UI组件间的通信 ...

  • 【译】Fuse入门(三)

    UI 组件 Fuse里有大量现成的UI组件可以用来构建用户界面(User interface)。 在UX文件里,添...

  • vue-cli中使用UI组件

    1. 安装相关的UI组件 $ npm install --save element-ui 2.在main.js中引...

  • RxJava网络异步调用绑定UI生命周期

    简述因为Android UI组件通常会频繁性的创建销毁,在搭配异步操作时,子线程持有UI组件引用,而子线程通常用来...

  • @芥末的糖-----组件的定义

    1.无状态组件,函数式组件, 影子组件,傻瓜组件,UI组件 2.类的定义 总结:类的组件形式相对于函数化组件更消耗性能

  • UGUI使用小技巧(一) Content Size Fitter

    Content Size Fitter组件主要是用来设置UI的长宽,Horizontal Fit和Vertical...

网友评论

      本文标题:python弱引用来管理游戏中组件式的UI

      本文链接:https://www.haomeiwen.com/subject/svorhxtx.html