针对NGUI里面Anchor的OnUpdate调用频繁的对UIRect的优化

1.看源码

通过Unity的控件发现有
image.png

然后可以看到基础控件(比如UISprite)里面的这个属性一层层找过去会发现都是继承了UIRect,
然后观察UIRect的源码可以发现:


image.png

这里确实有这个的枚举,然后再具体的看他的逻辑都在Update()里面,可以发现他在每一帧调用,这样确实比较频繁,而且没有这个必要,那我想对他进行优化就是比如能不能调用的不那么频繁,但是又不影响他本身的逻辑,比如我想他0.1s调用一次,这个人眼基本看不出来差别,所以我想增加一种新的类型,可以0.1s调用。

2.修改

image.png

增加一种类型,然后在增加自己的逻辑,其实逻辑也比较简单,就是记录上次的时间,然后加一个时间间隔,先判断是否是显得类型,每一帧调用的时候判断下间隔是否0.1秒了,如果是就执行。

核心逻辑:

image.png
image.png

3.类型新增,然后呢?

新增类型结束了,然后就是怎么将它修改到每一个的场景和控件中,这里需要俩步。你会发现需要修改的也只是每一个prefab和scene里面的anchor类型,他是有一个属性控制的,那个属性是updateAnchors.


image.png

1.我们的场景和prefab必须是可视化的,不然一个个修改,可能手都会断,新项目不至于,但是对于老项目来说容易错还有会遗漏,这需要先进行一个修改。打开unity的Project Setting:


image.png

这样就可以用文本文件打开了,这样也便于svn/git的管理。


image.png

随便打开一个prefab/unity能看到updateAnchor = 1,1就是OnUpdate的枚举,我们的枚举是 3,那么把1改成3就可以了。
image.png

4修改

所有后面我们需要做的就是如何将这些美术资源里面的属性修改掉,我本来打算使用c#实现,写一个功能,奈何搁浅了,然后我就换了方式,我使用了python,发现python可以实现,就写了这样一个脚本,逻辑也不复杂,核心就是
1:遍历Assets文件夹,获取所有的prefab和.unity的场景文件,
2:读取并修改。
代码如下:

import os
import chardet

image_path = 'xxx/Assets'



# 获取文件编码类型
def get_encoding(file):
    # 二进制方式读取,获取字节数据,检测类型
    with open(file, 'rb') as f:
        return chardet.detect(f.read())['encoding']



# 遍历文件夹及其子文件夹中的文件,并存储在一个列表中
# 输入文件夹路径、空文件列表[]
# 返回 文件列表Filelist,包含文件名(完整路径)
def get_filelist(dir, Filelist):
    newDir = dir
    if os.path.isfile(dir):
        Filelist.append(dir)
        # # 若只是要返回文件文,使用这个
        # Filelist.append(os.path.basename(dir))
    elif os.path.isdir(dir):
        for s in os.listdir(dir):
            # 如果需要忽略某些文件夹,使用以下代码
            # print(s)
            # t = s.split('.')
            # if t[len(t)-1] != "prefab":
            #     continue
            newDir = os.path.join(dir, s)
            get_filelist(newDir, Filelist)
    return Filelist

def modifyPrefab(file,old_str,new_str):
    """
    替换文件中的字符串
    :param file:文件名
    :param old_str:就字符串
    :param new_str:新字符串
    :return:
    """
    file_data = ""
    with open(file, "r", encoding="utf-8") as f:
        for line in f:
            if old_str in line:
                line = line.replace(old_str,new_str)
            file_data += line
    with open(file,"w",encoding="utf-8") as f:
        f.write(file_data)

if __name__ == '__main__':
    list = get_filelist(image_path, [])
    print("lenght------------------------------",len(list))
    for e in list:
        # print(e)
        t = e.split('.')
        if (t[len(t)-1] == "prefab" or t[len(t) - 1] == "unity"):
            # modifyPrefab(e,"updateAnchors: 1","updateAnchors: 3")
            # encoding = get_encoding(e)
            # if(encoding != 'utf-8'):
            #     print(t,"当前的编码格式不对----------------",encoding);
            # else:
            #     modifyPrefab(e,"updateAnchors: 1","updateAnchors: 3")
            #     print(e)
            modifyPrefab(e, "updateAnchors: 1", "updateAnchors: 3")
            print(e)

ps:中间的编码格式,是因为遇到报错,中断了,先以为是编码格式的问题,后来发现是prefab的脚本丢失,导致他变成乱码,所以直接中断了,如果遇到这样的问题,找到那个prefab,要么找回对应的脚本,要么先删掉,或者先删掉整个的prefab,自己记录,后续修改,毕竟错误的情况不会那么多。然后执行完我这边大概有2000个文件,有修改的大概700多个,自己玩了下没有大问题。你们在python3的环境下直接填入自己的Asset的绝对路径又可以了,这样就解决了我们的问题了。
我觉得解决问题,一定要先定位问题,在想好怎么做,一步步的解决就好了。

你可能感兴趣的:(针对NGUI里面Anchor的OnUpdate调用频繁的对UIRect的优化)