Unity3D教程:尽量避免使用foreach

Posted on 2013年04月17日 by U3d / Unity3D 基础教程 /被围观 425 次

* 版权声明:转载时请以超链接形式标明文章原始出处和作者信息

* 本文来自:Unity3D 教程手册

* 本文链接: http://www.manew.com/4143.html

为什么要尽量避免使用foreach。GC Alloc是造成Unity游戏偶尔卡帧的罪魁祸首。第一个循环大概会造成2.3K的GC Alloc。第二个循环则没有任何GC Alloc。所以,不要途方便,到处哪都用foreach循环。

foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。此语句的形式如下:

foreach (type identifier in expression) statement

其中:

type

identifier 的类型。

identifier

表示集合元素的迭代变量。如果迭代变量为值类型,则无法修改的只读变量也是有效的。

expression

对象集合或数组表达式。集合元素的类型必须可以转换为 identifier 类型。请不要使用计算为 null 的表达式。

而应计算为实现 IEnumerable 的类型或声明 GetEnumerator 方法的类型。在后一种情况中,GetEnumerator 应该要么返回实现 IEnumerator 的类型,要么声明 IEnumerator 中定义的所有方法。

statement

要执行的嵌入语句。

举一个代码列子:

      
01
using UnityEngine; 
02
using System.Collections;
03
 
04
public class ForeachTest : MonoBehaviour {
05
 
06
    protected ArrayList m_array;
07
 
08
    void Start () 
09
    { 
10
        m_array = new ArrayList(); 
11
        for (int i = 0; i < 2; i++) 
12
            m_array.Add(i); 
13
    } 
14
 
15
    void Update () 
16
    { 
17
        for (int i = 0; i < 1000; i++) 
18
        { 
19
            foreach (int e in m_array) 
20
            { 
21
                //big gc alloc!!! do not use this code! 
22
            } 
23
        }
24
 
25
        for (int i = 0; i < 1000; i++) 
26
        { 
27
            for (int k = 0; k < m_array.Count; k++) 
28
            { 
29
                //no gc alloc!! 
30
            } 
31
        } 
32
    } 
33
}

转载于:https://www.cnblogs.com/kuluodisi/p/5683849.html

Unity3D教程:尽量避免使用foreach相关推荐

  1. 【Unity3D 教程系列第 19 篇】Unity 中根据长方体模型的尺寸添加碰撞盒 BoxCollider

    这是[Unity3D 教程系列第 19 篇],如果觉得有用的话,欢迎关注专栏. 前言: 给一个长方体模型添加碰撞盒 BoxCollider,即使手动拖拽也费不了多长时间,但手动拖动不仅显得 Low , ...

  2. Unity3D教程:用快捷键控制物体的激活状态

    Unity3D中我们在调试的时候,经常会把一些物体设置成未激活状态,如下图一样,但是当物体有子物体的时候总会有这个提示框,让后再去点这个框,总会觉的有些麻烦,以下快捷键就会很快实现这个功能: Unit ...

  3. Unity3D教程宝典之Web服务器篇:(第二讲)从服务器下载图片

    转载自风宇冲Unity3D教程学院                                     从Web服务器下载图片 上一讲风宇冲介绍了wamp服务器及安装.这回介绍如何从服务器下载内容 ...

  4. (转)【风宇冲】Unity3D教程宝典之AssetBundles:第一讲

    自:http://blog.sina.com.cn/s/blog_471132920101gz8z.html 原创文章如需转载请注明:转载自风宇冲Unity3D教程学院 AssetBundles第一讲 ...

  5. Unity3D教程:手游开发常用排序算法 -下

    五.堆排序(Heap Sort) 1. 基本思想: 堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小 ...

  6. Unity3D教程:简单触发器实现自动开关门

    首先确保你已经对门进行了动画的设置. 选择Window->Animation打开动画窗口,选中需要添加动画的门之后点击红色按钮创建新动画. 选中一个需要添加动画的要素之后(比如Postion.x ...

  7. unity3d用sever还是php,unity3d教程

    对unitye3d的学者来讲,学习Unity3D教程,必须经过Photon服务器入门,那么小编下面为大家分享讲解教程的内容. 首先去PhotonServer SDK下载服务器端SDK.解压出来是四个文 ...

  8. Unity3D教程:Unity3D自带寻路教程

    1.新建一个Cube 设置大小(10,0.5,10),重命名"plane":在plane上新建3个cube改名 "obstacle":新建一个sphere,和一 ...

  9. Unity3D教程:简单的碰撞检测

    需求:当立方体Cube碰到地面Plane的时候,输出碰撞物体的名称,则表述检测到立方体碰撞了地面. 1.搭建一个简单的场景. 在新的工程中选择File->new Scene创建新的场景.然后在该 ...

最新文章

  1. 嵌入式 linux 进程锁,嵌入式  Linux线程锁详解pthread_mutexattr_t
  2. python编写Mysql自动备份脚本
  3. 编译linux3内核,与busybox,用qemu模拟运行
  4. gradle入门,安卓gradle入门
  5. ITK:计算PCA形状模型
  6. (二)注册服务提供者
  7. web-storage-cache 使用JS数据缓存
  8. 华为Mate 40系列预热海报颠覆传闻:这个设计手机圈独树一帜
  9. 全网首次公开!iOS14 到来前,开发者必需的时间表及 To do list
  10. matlab hpopup2,matlabpopupmenu的问题
  11. Android AlarmManager设置多个定时事件时只最后一个有效问题解决
  12. docker安装tomcat8
  13. ArcGIS分享: 地图分幅及编号
  14. 物联网建设,智慧城市道路智能交通解决方案
  15. 2进制转16进制c语言库函数,单片机 avr c语言 二进制 十进制 十六进制 快速转换...
  16. 2016 上海 Qcon 值得关注的技术
  17. JQuery移动动画实现点击按钮切换图片--JQuery基础
  18. 医药研发产业新平台在从化
  19. 大厂必备的40个方法论
  20. 红米android10参数,红米10x5g手机参数红米10x5g手机参数有哪些

热门文章

  1. JS日历控件优化(增加时分秒)
  2. 第 5 章 会修电脑不会修收音机 —— 依赖倒转原则
  3. 应对DDOS***需要“多管齐下”
  4. 找个轻量级的Log库还挺难
  5. L1-067 洛希极限 (10 分)-PAT 团体程序设计天梯赛 GPLT
  6. 蓝桥杯 ALGO-112 算法训练 暗恋
  7. 蓝桥杯 ALGO-93 算法训练 反置数
  8. LeetCode 49. Group Anagrams
  9. 1061. 判断题(15)-PAT乙级真题
  10. 1035. 插入与归并(25)-浙大PAT乙级真题