当前位置:   article > 正文

【Unity】总结一点优化技巧(循环优化)_unityfor循环速度

unityfor循环速度

前言

马上要离开网易了,准备继续学习我的Unity,感觉用lua写游戏限制太多了,如果不是为了线上运行需要热更,谁又想用lua呢。决定以后在这里总结一点使用中的自己的一些优化技巧,如果能帮助到其他人自然是更好。

正片

循环优化

1.并行循环

然后今天写Unity的时候,在底层使用List作为储存空间的背包系统下要查找一个特定的物品,需要进行for循环,而如果在储存空间大,存的物品多的情况下,在Unity默认单线程的情况下无疑会有较长的耗时,这也是大部分游戏在查询物品可能会掉帧的一个原因。
众所周知,for循环是单线程的,需要找到一个物品需要在主线程里一个一个找,效率极慢,此时我们可以引入Parallel.For函数,用于并行遍历,这个Parallel.For函数可以使用多线程的方法独立运行循环内的每一个内容,尤其是现在电脑核心数量也多起来了,不能让他们偷懒,都动起来。这个方法虽然是并行多线程的,但它并不是异步而是同步的,这就意味着你可以在调用完这个函数后立即return循环后的结果,例如一个10000个值的List,List名为ListScore,求其和,可以写成例1,其中Interlocked为确保线程安全,而进行原子加法的类,仅适用于整型

# 例1
int Sum(List<int>  ListScore) 
{
	int sum = 0;
	Parallel.For(0, ListScore.Count; i => {
		Interlocked.Add(ref sum, ListScore[i]);
	});
	return sum;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

同样,循环也可以将一个List中的元素添加到另一个List中,只需要用一个中间变量ConcurrentBag<T>,它可以保证List在多线程中的操作的原子性,且最后的遍历方式也与List保持一致,基本不影响使用,若一定要转换成为List,则可以用ToList()方法转成List即可,如下例2

# 例2
List<int> FindNum(List<int>  ListScore) {
	ConcurrentBag<int> ListCache;
	Parallel.For(0, ListScore.Count; i => {
		ListCache.Add(ListScore[i]);
	});
	return ListCache.ToList();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

有人可能会觉得再进行一次List的转换会开销很大,但实际上这个转换的开销并不大,因为其在内存上是连续的,且为了防止GC,可以将ConcurrentBag<T>的定义放到函数外,作为一个类的成员变量,而每次调用之前先Clear()一下即可。

2.多判断下增加命中率

这个优化方法相较于上面那个可能不值一提,但这里还是说一下,且不仅是在循环中可用,任何函数中都应该这么做,那就是在进行数据剔除的判断时优先写更加可能出现的情况,举个例子,我有一个List,里面有很多Item对象(可能为null),这个Item对象有数量Count(1到99),有类型Type(大概3种),有品质Quality(大概6中),现在我想从List中找到品质为6(最高),类型为1的物品,且看看是否有50个以上,那么我们的函数应该这么写(例3)

# 例3
bool IsHaveHighQualityMaterail() {
	for(int i = 0; i < ListItem.Count; ++i) {
		Item item = ListItem[i];
		if(item == null) continue;
		if(item.Quality != 6) continue;
		if(item.Type != 1) continue;
		if(item.Count < 50) continue;
		return true;
	}
	return false;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

上述函数中,优先判断了非法值,然后依次判断品质,类型,最后才是数量,这么写的原因也是为空就不用继续进行判断,高品质物品多半是少数,所以按这个顺序进行返回判断。这些并不是固定的,且优化的性能也有限,但是聊胜于无,具体的写法也要参照具体的情况进行修改,不要为了少几次判断的性能开销而造成了bug

结尾

暂时先写了这么些,如果有什么地方没写对的也欢迎各位大佬指出来,有想起任何其他的优化方法再加上来,就这样。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/94406
推荐阅读
相关标签
  

闽ICP备14008679号