针对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的绝对路径又可以了,这样就解决了我们的问题了。
我觉得解决问题,一定要先定位问题,在想好怎么做,一步步的解决就好了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,050评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,538评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,673评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,622评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,047评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,974评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,129评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,893评论 0 209
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,654评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,828评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,297评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,619评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,326评论 3 243
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,176评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,975评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,118评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,909评论 2 278

推荐阅读更多精彩内容

  • 编程代码规范: 1:脚本行数最多500行。 2:如果要发行其他国家的版本需要重新Copy一份客户端代码,在另行修改...
    诸子百家谁的天下阅读 2,847评论 0 2
  • 关于这些技巧这些技巧不可能适用于每个项目。这些是基于我的一些项目经验,项目团队的规模从3人到20人不等;框架结构的...
    Babybus_Unity阅读 2,702评论 2 27
  • 关于这些技巧这些技巧不可能适用于每个项目。这些是基于我的一些项目经验,项目团队的规模从3人到20人不等;框架结构的...
    游戏开发小Y阅读 982评论 0 1
  • 一:什么是协同程序? 在主线程运行的同时开启另一段逻辑处理,来协助当前程序的执行,协程很像多线程,但是不是多线程,...
    胤醚貔貅阅读 2,018评论 0 13
  • 一:什么是协同程序?答:在主线程运行时同时开启另一段逻辑处理,来协助当前程序的执行。换句话说,开启协程就是开启一个...
    CrixalisAs阅读 1,999评论 1 7