Unity3D中被频繁c4d克隆物体如何散开复制的物体要使用对象池吗

赞助商链接
当前位置: >>
unity常见面试题目
1. 游戏对象问题:游戏对象消失三种方法的区别?(enabled/Destroy/active) gameObject.renderer.enabled=fasle 是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的只是想当于隐 身而物体本身的碰撞体还依然存在的 GameObject.Destroy() 表示移除物体或物体上的组件代表销毁该物体 实际上该物体的内存并没有立即 释放而是在你下下个场景中槽释放内存资源,就是你 a 场景中 Destroy 了一般是 在 c 场景中才真正释放该物体的内存资源(这是我的体会不知道理解错误没) gameObject.active=false 是否在场景中停用该物体 找不到该物体 如果该物体有子物体你要用 SetActiveRecursively(false) 来控制是否在场景中停 用该物体(递归的) 副作用:通过 GameObject.Find 方法查找不到 在你 gameObject.active =false 中则你在场景中用 find2. 协同程序(Coroutine)协同程序, 即在主程序运行时同时开启另一段逻辑处理, 来协同当前程序的执行。 换句话说,开启协同程序就是开启一个线程。 原理: 协同程序被开启后作为一个线程在运行, 而 MonoBehaviour 也是一个线程, 他们成为互不干扰的模块,除非代码中用调用,他们共同作用于同一个对象,只 有当对象不可见才能同时终止这两个线程。 使用 MonoBehaviour.StartCoroutine 方法即可开启一个协同程序。 使用 StopCoroutine(string methodName)来终止一个协同程序,使用 StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止 该 MonoBehaviour 中的协同程序。 还有一种方法可以终止协同程序,即将协同程序所在 GameObject 的 Active 属性 设置为 false,当再次设置 active 为 ture 时,协同程序并不会再开启。 协同程序和多线程的区别?3. 动态加载资源的方式?(有时候也问区别,具体请百度)Resources.Load();Resources.LoadAll() AssetBundle Resources.Load 资源必须放在 Resources 文件夹,只能加载本地文件。 AssetBundle 和 WWW 一起使用,可以实现从服务器上下载资源,并动态加载。4. 使用 unity3d 实现 2D 游戏,有几种方式?1.使用本身的 GUI; 2.把摄像机的 Projection(投影)值调为 Orthographic(正交投影),不考虑 z 轴; 3.使用 2d 插件,如:2DToolKit、Uni2D; 4.Unity 4.3 版本新增的 Native 2D(原生)5. AssetBundleAssetBundle 的管理总共分为三部分:1、AssetBundle 文件 2、AssetBundle 内存 镜像 3、AssetBundle 内存对象实例 一张图读懂 AssetBundle 内存管理机制 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3046.tmp.png 常见问题: 举一个例子说明 AssetBundle 如何进行内存释放? 一个常见的错误:你从某个 AssetBundle 里 Load 了一个 prefab 并克隆之: obj=Instantiate(AssetBundle1.Load('MyPrefab”); 这个 prefab 比如是个 npc。 然后你不需要他的时候你用了:Destroy(obj);你以为就释放干净了。其实这时候 只是释放了 Clone 对象,通过 Load 加载的所有引用、非引用 Assets 对象全都静 静静的躺在内存里。 这种情况应该在 Destroy 以后用:AssetBundle1.Unload(true),彻底释放干净。 如果这个 AssetBundle1 是要反复读取的不方便 Unload, 那可以在 Destroy 以后用: Resources.UnloadUnusedAssets()把所有和这个 npc 有关的 Asset 都销毁。 当然如果这个 NPC 也是要频繁创建销毁的那就应该让那些 Assets 呆在内存里以 加速游戏体验。 由此可以解释另一个之前有人提过的话题:为什么第一次 Instantiate 一个 Prefab 的时候都会卡一下,因为在你第一次 Instantiate 之前,相应的 Asset 对象还没有 被创建, 要加载系统内置的 AssetBundle 并创建 Assets,第一次以后你虽然 Destroy 了,但 Prefab 的 Assets 对象都还在内存里,所以就很快了。 问题:unity3d 中如何实现动态资源加载? 使用 AssetBundle 技术,通过 WWW 类从服务器下载 AssetBundle 资源包,将需 要的资源加载到项目中。AssetBundle 资源包带有版本号,用来判断是否需要更 新。 问题:AssetBunlde 的优点? 可以动态加载资源 可以将资源放在服务器上,方便版本更新。 AssetBundle 资源的加载和是否可以手动控制,方便资源管理。6. 组件(组件思想)是什么? Unity3D 面向对象编程最大的体现就是组件化,任何一个游戏对象都是通过附加 不同的组件实现。每一个游戏对象都具有一个 Transform 组件。 问题:获取、增加、删除组件的命令分别是什么? 获取:GetComponent 增加:AddComponent 删除:Destroy7. 物理引擎物理引擎就是在游戏中模拟真实的物理效果。Unity 内置了 NVIDIA 的 Physx 物 理引擎,Physx 是目前使用最为广泛的物理引擎,被很多游戏大作所采用,开发 者可以通过物理引擎高效、逼真地模拟刚体碰撞、车辆驾驶、布料、重力等物理 效果,使游戏画面更加真实而生动。 物理引擎主要包含三个核心内容: 1. Collider 是最基本的触发物理的条件,例如碰撞检测。基本上,没有 Collider 物理系统基本没有意义(除了重力); 2. Rigidbody 是物体的基本物理属性设置,当检测碰撞完之后,就要计算物理效 果,而 Rigidbody 提供计算基本参数。 3. PhysicMaterial 则是附加的基本物理参数,是一个物理材质,UNITY3D 有自带 默认的物理材质的系数(在 Edit/Project Settings/Physic 下设置),它参与碰撞的 计算例如反弹效果摩擦效果等。 常见问题: 对 Rigidbody 施加力的常用方式? AddForce 添加普通力; AddExplosionForce 添加爆炸力; AddForceAtPosition 添加 位置力。 两个 Collider 产生碰撞的必要条件? 至少要有一个物体具有 Rigibody 刚体才会触发 OnColliderEnter 函数。 有碰撞器 Collider 碰撞器和触发器的区别? 最大的区别是碰撞器有碰撞效果触发器没有;触发器是一个特殊的碰撞器。 Collider 有几种?(三种) 1、Static Collider(静态碰撞器):带有 Collider 没有添加 Rigidbody 的对象,用 于静止物体如地理环境; 2、Rigidbody collider:带有 rigidbody 的 collider 对象,能够根据物理引擎很好的 响应外力和碰撞作用。 3、 Kinematic rigidbody collider: 带有 rigidbody 的 collider 对象, 开启 Is kinematic。 当物体进来 OnTriggerEnter 触发,出去时 OnTriggerExit 触发。那么物体在进来 后 Destory 后会如何? 经过测试是:不会调用 OnTriggerExit。 PhysicMaterial 有哪些主要属性? dynamicFriction:移动摩擦力,值在 0 到 1 之间。 staticFriction:静止摩擦力,值在 0 到 1 之间。 Bounciness:弹力,0 值没有弹力,1-没有能量损失的反弹。 Character Controller(角色控制器)的特性 角色本身不受 Physics 影响, 需要接受外力作用时, 使用 OnCharacterColliderHit(); 使用角色控制器如何防止角色经常卡住? Skin Width:设置为 radius 的 10%; Step offset:对于 2meter(米)高的 Character 设为 0.1 到 0.4; Min move distance 设为 0 即可。 Rigidbody 常用属性? 打开 Is Kinematic 后物体不受物理引擎影响,只受 Transform 控制; Freeze Position 冻结位置轴向, Freeze Rotation 冻结方向轴向, 冻结之后的轴向只 受 Transform 控制; 使用 Physics 时不要使用 Transform CharacterController 和 Rigidbody 的区别? CharacterController 自带胶囊碰撞器,里面包含有刚体的属性; Rigidbody 就是刚体,使物体带有刚体的特征。 什么是 Trigger? Collider 勾选 Is Trigger 属性,碰撞器变成触发器; 在物体发生碰撞的整个过程中,有几个阶段,分别列出对应的函数? OnCollisionEnter(进入)、OnCollisionStay(保持)、OnCollisionExit(退出) 什么叫做链条关节? Hinge Joint,可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物 体在一个固定距离内部相互移动而不产生作用力, 但是达到固定距离后就会产生 拉力。8. 导航网格参看 PDF9. 解释下 A*寻路?(AI 是实时计算的,导航网格是自动计算的。AI 可以自己研究算法,比导航网格 更方便,导航网格被封装了。) 首先,A*算法的提出是为了解决游戏中从 A 点到目标 B 点绕过障碍物寻找最短 路径的问题。 其次,A*算法核心为:启发式搜索、估值函数、选取最小估值 最后,A*算法有优点也有缺点,它理论上将是时间最优的,但空间增长是指数 级别的10. 光照贴图(Lightmapping)Lightmapping 是一种增强静态场景光照效果的技术, 较少的性能消耗使静态场景 看上去更真实、丰富以及更具有立体感。 Unity 使用 Autodesk 的 Beast 插件。 使用光照贴图的优点: A:使用光照贴图比使用实时光源渲染要快 B:可以降低游戏内存消耗 C、多个 物体可以使用同一张光照贴图11. 后期屏幕渲染参看 PDF12. 遮挡剔除参看 PDF 13. 插件最喜欢的就是 U3D 中的插件系统,Unity3D 中的插件极大得提高了开发效率。 问题:常用的插件有哪些? NGUI、2D Toolkit、iTween、PlayMaker、特效插件 FxMaker、NGJMinMap(小 地图)等(最好多熟悉几个插件,问的时候好回答) 一界面制作推荐:NGUI 二 2D 游戏制作推荐:2D Toolkit 三可视化编程推荐:PlayMaker 四插值插件推荐:iTween,HOTween 五路径搜寻推荐:Simple Path //[?tu:lk?t] 工具包,工具箱14. iTween 插件是什么?iTween 是一个动画库。 原理?iTween 的核心是数值插值, 简单说就是给 iTween 两个数值(开始值, 结束 值),它会自动生成一些中间值。 应用场景?对象移动、振屏效果15. 协同程序 Coroutine协同程序, 即在主程序运行时同时开启另一段逻辑处理, 来协同当前程序的执行。 换句话说,开启协同程序就是开启一个线程。 问题:协同程序有几种开启方式? 有两种。在 Unity3D 中,使用 StartCoroutine(string methodName)和 StartCoroutine(IEnumerator routine)都可以开启一个线程。区别在于使用字符串作 为参数可以开启线程并在线程结束前终止线程,相反使用 IEnumerator 作为参数 只能等待线程的结束而不能随时终止(除非使用 StopAllCoroutines()方法); 另外使 用字符串作为参数时, 开启线程时最多只能传递一个参数,并且性能消耗会更大 一点,而使用 IEnumerator 作为参数则没有这个限制。 问题:如何终止协同程序? 使用 StopCoroutine(string methodName)来终止一个协同程序,使用 StopAllCoroutines()来终止所有可以终止的协同程序,但这两个方法都只能终止 该 MonoBehaviour 中的协同程序。 还有一种方法可以终止协同程序, 即将协同程序所在 gameobject 的 active 属性设 置为 false。 问题:协同程序和线程之间的区别? 协程和线程差不多, 线程的调度是由操作系统完成的,协程把这项任务交给了程 序员自己实现,当然也就可以提高灵活性,另外协程的开销比线程要小,在程序 里可以开更多的协程。 线程与协同程序的主要区别在于, 一个具有多线程的程序可以同时运行几个线程, 而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任 何时刻只能运行一个协同程序, 并且正在运行的协同程序只会在其显示地挂起时, 它的执行才会暂停。16. 动画系统U3D 中支持模型动画和骨骼动画,模型动画是模型中自包含的帧动画,使用 Animation 组件控制; 骨骼动画使用 Animator 组件控制, 也就是 Mecanim 系统, 通过状态机和混合树控制动画的状态转换。骨骼动画应用最广泛。 问题:写出 Animation 的五个方法? AddClip 添加剪辑、Blend 混合、Play 播放、Stop 停止、Sample 采样17. 如何实现游戏的暂停、加速和减速?Time.timeScale= 0;即可让游戏暂停。 Time.timeScale=1 时, Update、 LateUpdate、 FixedUpdate 都按正常的时间来执行。 Time.timeScale=2 时,Update 和 LateUpdate 的执行速度是之前的 2 倍,而 FixedUpdate 还是按正常时间来执行。18. 如何在 Unity3D 中使用单例模式?先声明一个静态私有变量, 如: instance; 再声明一个静态公共方法, 如: GetInstance, 在该方法中判断 instance 为 null 时,通过 GameObject.FindObjectOfType(typeof(MyClass))创建 instance 的实例(在 C#中直 接 new 一个新的实例),不为 null 则直接返回。 参考代码: public class MyClass { private static MyC public static MyClassGetInstance() { if (!instance) { instance = GameObject.FindObjectOfType(typeof(MyClass)); } } }19. 什么是游戏 AI游戏 AI 是游戏中的人工智能,AI 中最常用到的是随机数 Random 和状态控制。 如怪物 AI:巡逻(随机目标点)-&发现-&追赶-&攻击-&返回-&继续巡逻 在实际项目中,AI 脚本的参数往往设置成 Public,供策划人员修改。如:攻击 速度、技能类型、移动速度、命中率、攻击百分比 形成一个闭环,保证任何时候 Ai 可用 要能够画出逻辑图20. Unity3D 中脚本的编译顺序脚本的编译过程分四步: 1. 码 2. 3. 4. 编译所有“Standard Assets/Editor”, “Pro Standard Assets/Editor” or 编译除了上面列出来的目录和 Editor 目录之外的所有代码 编译 Editor 目录下的代码 “Plugins/Editor” 目录下的代码 编译所有”Standard Assets”, “Pro Standard Assets” or “Plugins” 目录下的代问题:如何在 C#脚本中调用 JS 脚本中的方法? 如果你希望某个 Javascript 能被其他脚本引用,那么把它放到第一组的某个目录 里,然后把要使用它的代码放在第三组的某个目录里就好了。 同样,如果希望某个 C#代码能被其他 Javascript 脚本引用,也必须把这个 C#脚 本放到第一组的某个目录里,Javascript 代码放到第三组的某个目录里。 编辑器类存放路径是什么? 工程目录下的 Assets/Editor 文件夹下。 21. U3D 提供了一个用于保存读取数据的类, (playerPrefs) , 请列出保存读取整形数据的函数PlayerPrefs.SetInt 与 PlayerPrefs.GetInt22. unity3d 从唤醒到销毁有一段生命周期,请列出系统自己 调用的几个重要方法。Awake C&OnEnable C& Start C& Update C&FixedUpdate C& LateUpdate C&OnGUI C& Reset C& OnDisable C& OnDestroy23. 有两个相同的方法,放在两个脚本的 Awake 里,将这两 个脚本放在同一个游戏对象上, 先执行那个? (李老师原创)跟脚本的添加顺序有关, 后添加的先执行。由此可以推断游戏对象添加的组件以 “栈”的数据结构保存,后进先出。24. 物理更新一般在哪个系统函数里?FixedUpdate,每固定帧绘制时执行一次,和 update 不同的是 FixedUpdate 是渲 染帧执行, 如果你的渲染效率低下的时候 FixedUpdate 调用次数就会跟着下降。 FixedUpdate 比较适用于物理引擎的计算,因为是跟每帧渲染有关。Update 就 比较适合做控制。25. 移动相机动作在哪个函数里,为什么在这个函数里。LateUpdate,,是在所有 update 结束后才调,比较适合用于命令脚本的执行。官 网上例子是摄像机的跟随,都是在所有 update 操作完才跟进摄像机,不然就有 可能出现摄像机已经推进了,但是视角里还未有角色的空帧出现。 26. 当游戏中需要频繁创建一个物体对象时,我们需要怎么 做来节省内存。对象池,做一个 pool,游戏开始时预先实例化足够的数量,然后用的时候取不 用的时候收回27. 一个场景放置多个 camera 并同时处于活动状态, 会发生 什么实际看到的画面由多个 camera 的画面组成, 由 depth、 Clear Flag、 Culling Mask 都会影响最终合成效果。28. 简述 prefab 的用处和环境在游戏运行时实例化,prefab 相当于一个模版,对你已有的素材、脚本、参数做 一个默认配置,以便于以后修改,同时 prefab 打包的内容简化了导出的操作, 便于团队的交流。29. 如何销毁一个 UnityEngine.Object 以及其子类Destroy30. 为什么 u3d 会出现组件上数据丢失的情况一般是组件上绑定的物体对象被删除了31. u3d 下如何安全的在不同工程迁移 asset 数据方法 1,可以把 assets 目录和 ProjectSetting 目录一起迁移, 方法 2,导出包 方法 3,用 unity 带的 assets server 功能32. 请描述游戏动画有哪几种,以及其原理。主要有关节动画、单一网格模型动画(关键帧动画)、骨骼动画。 关节动画把角色分成若干独立部分,一个部分对应一个网格模型,部分的动画连 接成一个整体的动画,角色比较灵活 Quake2 中使用了这种动画。 单一网络模型动画由一个完整的网格模型构成, 在动画序列的关键帧里记录各个 顶点的原位置及其改变量,然后插值运算实现动画效果,角色动画较真实。 骨骼动画,广泛应用的动画方式,集成了以上两个方式的优点,骨骼按角色特点 组成一定的层次结构,由关节相连,可做相对运动,皮肤作为单一网格蒙在骨骼 之外,决定角色的外观。皮肤网格每一个顶点都会受到骨骼的影响,从而实现完 美的动画。 (骨骼动画是由关节动画发展而来的,如今基本都使用骨骼动画来实 现角色动画) 问题:写出 Animation 的五个方法33. 如何优化内存?有很多种方式,例如 1.压缩自带类库; 2.将暂时不用的以后还需要使用的物体隐藏起来而不是直接 Destroy 掉; 3.释放 AssetBundle 占用的资源; 4.降低模型的片面数,降低模型的骨骼数量,降低贴图的大小; 5.使用光照贴图, 使用多层次细节(LOD), 使用着色器(Shader), 使用预设(Prefab)。34. 图像学底层原理(李老师原创)1.GPU 计算:顶点、线、三角、像素颜色(贴图) 2.(摄像机进行)可视化检测 3.调用显卡的底层渲染 API(OpenGL、DX11) -DrawPoint/DrawLine/DrawColor35. NGUI 核心原理?(原创)UIGeomety (几何图形计算) -&UIWebgit (部件) -&UIPanel (容器分组) -&UICamera (可视化检测)-&UIDrawCall(渲染)36. 坐标系Unity3D 采用左手坐标系 坐标系有:世界坐标系、屏幕坐标系、GUI 坐标系 问题:localPosition 与 Position 的使用区别? localPosition:自身位置,相对于父级的变换的位置。 Position:在世界坐标 transform 的位置 37. 脚本问题:怎么拿到一个对象上脚本的方法 GameObject.GetComponent&&();38. 简述一下对象池,你觉得在 FPS 游戏里哪些东西适合使用 对象池?对象池就存放需要被反复调用资源的一个空间, 比如游戏中要常被大量复制的对 象,子弹,敌人,以及任何重复出现的对象。39. 对象池的原理?(原创)作用:复用,提高对象使用效率,避免频繁的销毁、创建操作。 过程: 预热-在使用之前批量创建对象 使用-从对象列表中获取 回收-隐藏 扩容-自动批量创建(使用对象达到总容量 80%)40. 角色换装怎么做?思路1.模型贴图(类似人体彩绘) 2.Mesh Reander(换网格) 3.纸娃娃系统41. 技能释放怎么做?一般游戏中的技能都是粒子特效,结合输入控制粒子特效的播放。42. 有限状态机每个对象都维护自己的状态机,状态机的状态改变,靠状态触发器。每一个状态 触发器都包含三个固定函数:Enter(进入)、Excute(执行)、Exit(退出) 请给我设计一个状态机,完成一个简单的 xxxx 情景。 答: 状态机并不是单纯的 switch 结构,如果你是新手,你说 switch 我可以容忍, 如果你干了好些年 2Dx, 然后想自废武功搞 U3d 了, 再说 switch 就直接 pass 了。 FSM FSMSystem 负责状态的切换 FSMState 表示各个状态基类,执行 Excute、进入、退出、切换条件 ChangeCheck -Update 可以怪物 AI 来使用 FSM 对比(伪代码) Update() If(state1) { If(state is 2) { //go to state2 } Excute(); } If(state2) { }43. Unity 连接数据库本地数据最常用的是 SQLite,需要得到 Mono.Data.Sqlite.dll 文件与 System.Data.dll 文件。44. 本地数据存储方式?(原创)文本:xml、json、excel(cvs) 数据库:SQLite PlayerPrefes45. 请描述 MeshRender 中 material 和 shader 的区别? Shader(着色器)实际上就是一小段程序,它负责将输入的 Mesh(网格)以指 定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个 输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的 Shader,以及 对 Shader 的特定的参数设置,将这些内容(Shader 及输入参数)打包存储在一 起,得到的就是一个 Material(材质)46. LayerMask.NameToLayer()这个方法有什么作用?LayerMask 的使用是按位操作的,LayerMask.NameToLayer(&Players&) 返回该 Layer 的编号。 在射线、摄像机遮罩剔除(Culling Mask)使用47. itween 插件的作用是什么,itween 作用于世界坐标还是 局部坐标,请列举出 3 个其常用方法?iTween 是一个动画库,作者创建它的目的就是最小的投入实现最大的产出。让 你做开发更轻松, 用它可以轻松实现各种动画, 晃动, 旋转, 移动, 褪色, 上色, 控制音频等等 方法:a、MoveTo 物体移动 ;b、ColorTo:随着时间改变对象的颜色组; c、 LookTo:随时间旋转物体让其脸部朝向所提供的 Vector3 或 Transform 位置。48. 什么是局部坐标,什么是世界坐标?世界坐标是不会变的,一直以世界坐标轴的 XYZ 为标准。 局部坐标其实就是自身的坐标,会随着物体的旋转而变化的。49. 以下哪个函数在游戏进入新场景后会被马上调用?MonoBehaviour.OnLevelWasLoaded50. Mecanim 系统中,Body Mask 的作用是?指定身体的某一部分是否参与渲染51. Material 和 Physic Material 区别?PhysicMaterial 物理材质:物理材质描述,如何处理物体碰撞(摩擦,弹性)。 Material 材质 (材质类) 为了获得一个对象使用的材质, 可以使用 Renderer.materia 属性52.动画层(Animation Layers)的作用是什么?动画层作为一个具有层级动画编辑概念的工具, 可以用来制作和处理任何类型的 动画53. 请简述 OnBecameVisible 及 OnBecameInvisible 的发生时 机,以及他们执行的意义?当 renderer(渲染器)在任何相机上都不可见时调用:OnBecameInvisible 当 renderer(渲染器)在任何相机上可见时调用:OnBecameVisible54. 请简述四元数的作用以及四元数相对于欧拉角的优点A.四元数一般定义如下:q=w+xi+yj+zk 其中 i*i=-1 j*j=-1 k*k=-1 q=[w,v] B.四元数也可以表示为: w,x,y,z 是实数。同时,有:有多种方式可表示旋转,如 axis/angle、欧拉角(Euler angles)、矩阵(matrix)、四 元组等。 相对于其它方法,四元组有其本身的优点: a.四元数不会有欧拉角存在的 c.两个四元数之间更容易插值 d.四元数、矩阵在多次运算后会积攒误差,需要分别对其做规范化(normalize)和 正交化 (orthogonalize),对四元数规范化更容易 e.与旋转矩阵类似,两个四元组相乘可表示两次旋转 gimbal lock 问题[万向节死锁 b.四元数由 4 个数组成,旋转矩阵需要 9 个数55. 说一下您在 U3D 游戏中用到的设计模式?单例 MVC(NGUI 的 MVC 架构: 1. 一个 UI Panel(比如背包界面)打成一个预制件-View 封装 2. 背包数据放在 Model 里面 3. 行为控制对应一个 Controler 脚本
赞助商链接
unity3d-高频率面试题目(单选) - unity3d-高频率面试题目(单选) 选择题(共 50 题,每题 2 分) 1、 NavMeshAgent 组件中的 Speed 指的是?答案:(A...史上最全的Unity面试题(五)_面试_求职/职场_实用文档。六十:Unity3D 的协程...系统自动分配和释放, heap 的空间是手动申请和释放的, heap 常用 new 关键字...赛欧必弗 unity3d 技术部面试题 1, C#中所有引用类型的基类是什么 答:引用类型的基类是 System.Object 值类型的基类是 System.ValueType 同时,值类型也隐式继承...unity常见面试题2_面试_求职/职场_实用文档。21.为什么 dynamic font 在 unicode 环境下优于 static font Unicode 是国际组织制定的可以容纳世界上所有文字和符号的...Unity面试题_理学_高等教育_教育专区。Unity面试题 最近unity3d 找工作有些受挫,自己也开始补课了。 下面把这段时间看到的些 面试题供出来让大家也学习下,题目...史上最全的Unity面试题(一)_面试_求职/职场_实用文档。一:什么是协同程序?在...Unity 中物理系统最基本的一个组件, 包含了常用的物 理特性, 而 CharacterContro...Unity一些面试题整理_计算机软件及应用_IT/计算机_专业资料。60、关于光照贴图 A...让你做开 发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制...unity3d面试试题_求职/面试_求职/职场_应用文书。精华实试题的大集合,帮助你找到...MipMapping :在三维计算机图形的贴图渲染中有常用的技术,为加快渲染进度和减少...简述 Unity3D 支持的作为脚本的语言的名称 答: Unity 的脚本语言基于 Mono 的.Net 平台上运行, 可以使用.NET 库, 这也为 XML、 数据库、 正则表达式等问题...游戏公司unity面试题_面试_求职/职场_实用文档。unity面试题 Unity3d 程序员面试...答 : LOD 是 Level Of Detail 的缩写,是指的多层次细节技术,是最常用的游戏...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。Unity3D游戏架构设计之对象管理【一】
先用一张简要的模块图来帮助大家了解游戏架构设计,了解对象管理在架构中所处的位置和他的作用是。实际的模块图会比本图的内容详细,并且对模块的分割有其他的方式,这张图只是为了帮助大家了解对象管理,做了很多精简。
要想讲清楚对象管理,还得从下层的&资源管理器&说起。
1.1资源管理
资源管理主要有两个重要的功能:资源加载和资源释放。
资源加载指的是把需要的资源(如prefab,材质,贴图等,从磁盘加载到内存中),供上层模块调用。这些资源通常以某种形式进行打包。Unity3D通常是用AssetBundle打包。举例来说,想在游戏中显示一个角色需要的资源就是穿过多个模块后,最后达到资源管理模块,从这里获得。
资源释放是与其对应的,就是把不用的资源从内存中卸载。那问题来了,什么时候资源什么时候不用?通常有两种情形。场景切换和角色不在屏幕时。难道此时我们就应该把资源从内存中释放?这样做也不是不可以,但这样就意味着做出来的游戏是低效的。脑补下策划,制作人的表情:) 道理很简单,角色是非常常见的,如果每次不用了就从内存释放,那就意味着每次用的时候都要从磁盘加载。这样就引出了对象管理这个概念。
1.2 对象管理
对象管理是资源管理和上层模块的一个中间层,缓存。他主要为那些暂时不用的资源提供内存缓存作用。角色首次需要的时候确实从资源管理从获取,并且缓存在对象管理中,暂时不用时不从资源管理器释放,而是由对象管理来接管。当下次再用的时候,就从对象管理来取角色。都是在内存中,速度自然比从资源管理中快。
2 对象管理模块设计
既然作为缓存,那当然对速度有要求。比如场景中需要10个相同的NPC,那么我们缓存一个NPC显然是不够的,而是需要多个。不然对象管理的世界意义就会大打折扣。多个重复的对象(NPC),这种情形下,&对象池&出场了。对象池就是用于存储重复对象的。
NPC可能有多种,&对象池&就会有多个。既然是多个对象池,就需一个&对象池管理器&来管理这些&对象池&。比如NPC分为NPC1....NPCn,那么就会有n个对象池。我们不太可能遍列这些对象池。而是需要提供O(1)的查找效率,找到对应的对象池。在C#里采用Dictionary这个数据结构是最合适的了。他的key就是&对象池&的名字(或者是类型),value就是对象池的指针。而持有这个Dictionary的就是对象池管理器。
对象从哪个&对象池&取的问题貌似就解决了。那找到了对应的&对象池&,那怎么以O(1)的效率从&对象池&中找到对象呢?我们还是采用Dictionary这个数据结构。因为在客户端显示的NPC都是在服务器中有唯一编号的,EntityID(事实上Player也是)。他是一个唯一的编号,通常是个int或者无符号的int类型的值。是服务器和客户端双方都认可的,而且双方还约定了类型。也就是还有一个EntityType.这个EntityType就是拿来对应对象池名字的。通过EntityType,找到对应的对象池,然后通过EntityID找到对应对象。
无论是本图和上图都一个叫&缓存&的模块。这究竟是怎么回事?事实上是,整个对象管理除了&对象池管理器&和&对象池&之外,还有&缓存&。&对象池&和&缓存&都是存储重复对象的,但他们两点本质的区别。
第一,&缓存&中的对象是已经被用过的(分配了EntityID),用于相同对象(EntityID)相同的对象可以重复使用。而&对象池&中的对象可能是被用过的,也可能没被用过。当上层逻辑暂时不用时,是把对象还给&对象池&,而避免下次使用同类型的对象从资管管理器中从磁盘读取。当对象被还给&对象池&时,对象上虽然有EntityID,但他是无效的。举例来说,当一个&坦克1&对象第一次被服务器发出指令出现在屏幕上,做出一个&攻击&动作。那么&坦克1&是从&对象池&取到&缓存&中,然后取出,执行&攻击&。如果服务器又发出指令要求&坦克1&做出一个&受击&动作。这时&坦克1&是直接从&缓存&中取出,做出受击动作。如果&坦克1&过一会儿,移动出屏幕了,这时需要把&坦克1&从&缓存&移除,并还回&对象池&。然后这时服务器要求&坦克2&做出执行&攻击&。这个&坦克2&除了EnityID和之前的&坦克1&不同之外,其他都一样。那么这时从&对象池&中取出的对象,很有可能是之前用过的&坦克1&。没关系,我们把他的EntityID重新赋值即可。&缓存&和&对象池&两者配合,就实现真正的对象重复使用。也可以简单理解,缓存中的对象是游戏中正在活动的对象,有身份证的(EntityID),而对象池中的对象是预先从资源管理中读取的对象,要么没有身份证,要么身份证已经过期。
第二,两者的数据结构不同。&缓存&中的对象是存在以EntityID为key存储的Dictionary中。而&对象池&不能用Dictionary存储。因为&对象池&种对象必须是当前没有使用的。相当于有个状态。而且这个状态只有两个取值,要么正在被用,要么没有用。那他到底采用什么样的数据结构呢?先买个关子,下篇再讲。下面是对象数据的时序图,比上面的流程图更容易看懂整个过程。重要的是先访问&缓存&再访问&对象池&。}

我要回帖

更多关于 c4d 物体沿路径克隆 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信