热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

unity数据结构_2.《Unity游戏优化》之脚本策略

没什么讲的,就几个小点。1.移出空的回调类似AwakeStart等Mono继承的类中的回调函数。在场景第一次实例化时,Unity会将任何

没什么讲的,就几个小点。

1.移出空的回调

类似Awake Start 等Mono继承的类中的回调函数。在场景第一次实例化时,Unity会将任何定义好的回调添加到一个函数指针列表中,然后在指定时刻调用这个列表。即使函数体是空的。

2. Update、Coroutines和InvokeRepeating

协程可以控制回调频率,比Update更自由,通常用于编写短事件序列的脚本。 线程以并发方式在完全不同的CPU内核上运行,多个线程何以同时运行。相反, 协程以顺序的方式在主线程上运行,保证在任何给定时刻都只处理一个协程。 协程缺点: 1. 是普通函数开销的三倍,在gameobject变成不活动时自动停止,且不会重新启动。 2. 很难调试,因为不遵循正常的执行流程;在调用栈上没有调用者。

InvokeRepeating InvokeRepeating和协程最重要的区别是InvokeRepeating完全独立于mono和GameObject的状态。

3.更快的GameObject空引用检查

与典型的C#对象相比,GameObject和MonoBehaviour是特殊对象,因为它们在内存中有两个表示:一个表示存在于管理C#代码的相同系统管理内存中,C#代码是用户编写的(托管代码),而另一个表示存在于另一个单独处理的内存空间中(本机代码)。数据可以在这两者内存空间中移动,带每次都会导致额外的CPU和内存开销。 这种效果叫做跨越本机-托管的桥接。会为对象的数据产生额外的内存分配,以便于垮桥复制,导致GC。

if (!System.Object.ReferenceEquals(gameObject, null)) {// do something}

4.避免从GameObjects检索字符串属性

f28feae7cb3b716997e8132b9832ce01.png

5.合适的数据结构

如果希望遍历一组对象,最好使用列表List,因为它实际上是个动态数组,对象/引用在内存中彼此相邻,因此迭代导致的缓存丢失最少。 如果两个对象相互关联,且希望快速获取插入删除这些关联,使用字典Dictionary 然而,需要同时处理两种情况:快速找出那个对象映射到另一个对象,同时还能遍历组。最好在列表和字典中存储数据,虽然需要额外的内存,维护多个数据结构。但迭代列表的好处和迭代字典形成鲜明对比。

6.避免修改Transform的父节点

自从5.4后,Transform的内存布局 父-子关系更像动态数组,Unity将所有共享相同父元素的Transform按照顺序存储在预先分配的内存缓冲区中,并根据Hierarchy窗口中父元素的深度进行排序。这种数据结构特点: 优点:进行更快的迭代,对物理和动画有利。 缺点:如果重新指定另一个父元素,需要将新对象放入预先分配的缓存区中,并重新排序。



推荐阅读
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
author-avatar
phpfinder
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有