为什么Unity里unity3d 场景模型室内多了运行起来会变慢

给我们留言
地址:福建省晋江市青阳街道洪山路国际工业设计园纳金网
电话: 400-067-3919
(周一到周五,
周六周日休息)
查看: 2011|回复: 0
最后登录注册时间阅读权限90积分81303
纳金币-1 精华11
1.GUI内容相关
一切关于GUI内容的代码,必须通过OnGUI方法来显示
Rect a = new Rect(100,100,100,20);
//相关定义内容可以写在OnGUI方法块外面
void OnGUI()
if(GUI01){
//GUI.Box(newRect(drawPos.x + 10, drawPos.y + 10, 100, 50), &It's & +gameObject.name);
//相关显示代码
GUI.Box(a, &It's& + gameObject.name);
//显示相关的代码必须在此OnGUI方法块中
本帖隐藏的内容需要回复才可以浏览
―――――――――――――――――――――――――――――――
///可以随拖动而移动的窗体
// Use this forinitialization
public Rect window01 = new Rect(20, 20, 150, 100);
//定义窗体初始状态:X、Y位置及长宽
voidStart()
voidUpdate()
//控制界面显示的“头方法”,一要关于GUI的内容都要通过这个OnGUI来实现显示。
voidOnGUI()
//将window01GUI矩形设置为后面的DoMyWindow窗体的实例并显示之,标题设置为&My Windows&
window01 = GUI.Window(0,window01, DoMyWindow, &My Windows&);
//定义一个窗体原型DoMyWindow
voidDoMyWindow(int windowID)
GUI.Button(new Rect(20, 80, 50,20), &ok!&);
//为窗体中添加一个按钮
///使用DragWindow设置window窗体为可被鼠标拖动移动,
///并设置window窗体的鼠标响应范围,四个值分别是窗体中响应区的开始X、Y位置(窗体中的局部坐标),响应区的长宽。
GUI.DragWindow(new Rect(0, 0, 150,20));
GUI.changed的说明
当GUI窗体中发生了修改事件(如点击按钮、滑动条被拖动等),GUI.changed将会返回true。
usingUnityE
usingSystem.C
public class GUI_Toolbar_try01: MonoBehaviour
GameObject Text03, Text04;
//定义对信息显示内容的引用
int a = 0;
//记录改变次数的变量
int selectedToolbar = 0;
string[] toolbarStrings ={ &One&, &Two&};
//定义toolbar上面的按钮数量及显示内容:共两个,分别显示One和Two
// Use this for initialization
void Start () {
Text03 = GameObject.Find(&text03&);
Text04 = GameObject.Find(&text04&);
// Update is called once per frame
void Update () {
void OnGUI()
selectedToolbar = GUI.Toolbar(new Rect(50,10,Screen.width-100,30),selectedToolbar,toolbarStrings);
if(GUI.changed)//如果发生过改变
Text03.guiText.text = &This Toolbar was clicked &+a.ToString();//在信息显示上显示出此次修改
if(selectedToolbar == 0)//如果点击的按钮是第一个
Text04.guiText.text = &First button was clicked&;
else//否则
Text04.guiText.text = &Second button was clicked&;
a++;//记录一次
GUI多窗体显示的问题
同一个场景内,每个显示的窗体的ID都不能重复
usingUnityE
usingSystem.C
public class GUI_MultiWindows_try01: MonoBehaviour
// Use this for initialization
public Rectwindow01 = new Rect(50,50, 200, 200);
public Rectwindow02 = new Rect(50,100, 200, 200);
void Start () {
// Update is called once per frame
void Update () {
void OnGUI()
///多窗体显示的话,每个窗体的ID不能重复
window01 = GUI.Window(0, window01,IsWindows01, &windows01&);
//第一个实参为此窗体的ID
window02 = GUI.Window(1, window02,IsWindows02, &windows02&);
//第一个实参为此窗体的ID
void IsWindows01(int WindowID)
GUI.Label(newRect(50,50,100,20),&hahaha...&);
GUI.DragWindow();
void IsWindows02(int WindowID)
GUI.Button(newRect(100,50,50,50),&button01&);
GUI.DragWindow();
GUI窗体显示中文的问题
void OnGUI()
GUI.skin = Resources.Load(&ChineseFontSkin&) as GUIS
//设置GUI窗体上的文字为中文字体,场景的Resources目录中必须有相关的中文字体和ChineseFontSkin.GUISkin文件
window01 = GUI.Window(0,window01,MyWindow01,&功能面板&);
window01.x = Mathf.Clamp(window01.x,0.0f,Screen.width-window01.width);
window01.y = Mathf.Clamp(window01.y,0.0f,Screen.height-window01.height);
2. Camera.main.WorldToScreenPoint(transform.position)只能在与场景运行相关的代码块中使用
Vector3 drawPos = Camera.main.WorldToScreenPoint(transform.position);
Vector3drawP
// 先在外面定义
// 然后要在Update()方法块中进行定义,否定会系统会报错
void Update () {
drawPos= Camera.main.WorldToScreenPoint(transform.position);
drawPos.y = Camera.main.pixelHeight -drawPos.y;
3.制作场景,必须在英文目录中。
U饭_叫你自由(:41:19
这个真的不是bug
六必居的老中医(:41:42
主要是因为双字节的不支持
U饭_叫你自由(:41:52
你只要把字体放在一个非中文路径下的目录,再拖到unity里就可以了
U饭_叫你自由(:41:57
U饭_叫你自由(:42:04
你按我的说法做一次就知道了
4.在场景中创建游戏对象时
5.unity场景创建时的几个重要目录:
脚本运行时需要引用的自定义的类及对象所在的目录
场景运行时需要动态调用的资料目录,也就是说只要存在于这个目录中的文件,在编译时都会被打入场景包中。
6.Plugins目录的用途:
在制作场景时,很时候需要一些可以被所有的脚本读取使用的自定义类,所以unity3d提供了Plugins目录,只要将包含自定义类的文件置入其中,在场景运行时相关的脚本就可以找到需要的自定义类。
下面是一个Plugins目录中的例文件:
usingUnityE
usingSystem.C
usingSystem.T
文件名:sy01.cs
这种用途的文件,就不像一般的脚本文件一样需要“public class 类名称: MonoBehaviour”,而是直接在文件内添加类的定义即可
public class display01
//定义的第一个类
public inta=20;
public stringc=&&;
public display01(int a_in , string c_in)
this.a = a_
this.c = c_
public stringdisplayAll()
StringBuilder sb = new StringBuilder();
sb.Append(&a: &);
sb.AppendLine(this.a.ToString());
sb.Append(&c: &);
sb.Append(this.c.ToString());
return sb.ToString();
public class display02
//定义的第二个类
public stringname =&&;
public display02(int b_in, string name_in)
this.b = b_
this.name = name_
public stringdisplayAll()
StringBuilder sb = new StringBuilder();
sb.Append(&b: &);
sb.AppendLine(this.b.ToString());
sb.Append(&Name: &);
sb.AppendFormat(this.name.ToString());
return sb.ToString();
脚本中对上面文件中类的调用:
usingUnityE
usingSystem.C
public class UsePlugins_try01: MonoBehaviour
GameObject Text03;
GameObject Text04;
void Start () {
Text03 = GameObject.Find(&text03&);
//定义对场景中GuiText文字显示对象text03的引用
Text03.guiText.font = Resources.Load(&xiyuanjian&) asF
//设置其字体为细圆简
Text04 = GameObject.Find(&text04&);
//定义对场景中GuiText文字显示对象text04的引用
Text04.guiText.font = Resources.Load(&xiyuanjian&) asF
//设置其字体为细圆简
void Update () {
display01 a = new display01(5,&程兆祥&);
Text03.guiText.text = a.displayAll();
display02 b = new display02(100,&czx_main是程兆祥&);
Text04.guiText.text = b.displayAll();
7.GetComponentInChildren方法的使用:
javas cript代码
//print(GetComponentInChildren(Rigidbody).name);
//可以运行,用来访问子对象上的组件
GetComponentInChildren(display01_js).display();
//可以运行,用来访问子对象上的脚本
print((GetComponentInChildren(typeof(Rigidbody)) asRigidbody).name);
//可以运行,用来访问子对象上的组件
(GetComponentInChildren(typeof(display01))as display01).display();
//可以运行,用来访问子对象上的脚本
可以通过GetComponentInChildren()方法实现对子对象上的组合的访问,但这有一个前提,如果父对象上也有相同的组件,那么最终返回的是父对象上的组件。
8.字符串类型转换为浮点类型:
利用System命名空间:
float temp = (float)Convert.ChangeType(x_in,typeof(float));
float temp = Convert.ToSingle(x_in);
不利用System命名空间:
float a = float.Parse(x_in);
9.实现在网页传递给场景中对象多参数:
因为就目前所知,SendMessage()方法只能为对象的脚本方法传递一个参数,这样当脚本方法的参数是多个时,就成问题了。
利用System.IO命名空间的StringReader类:
voidEnterString(string enter_string) //将传递的参数字符串分割后传递给Move
///技术上要求传递给此方法的字符串(enter_string)是多行的,第一行是X值,第二行是Y值,第三行是Z值
StringReaderSR = new StringReader(enter_string);
stringx_enter = SR.ReadLine();
//获取第一行,即X
stringy_enter = SR.ReadLine();
//获取第二行,即Y
stringz_enter = SR.ReadLine();
//获取第三行,即Z
Move(x_enter, y_enter, z_enter);
//将分割好的参数传递给Move方法
void Move(string x_in, stringy_in, string z_in)
//测试多参数
void Move(stringx_in)
//测试单参数
Vector3Translate_temp = new Vector3(float.Parse(x_in),float.Parse(y_in),float.Parse(z_in));
//Vector3Translate_temp = transform.//测试单参数所用
//Translate_temp.x= float.Parse(x_in);
//测试单参数所用
transform.position = Translate_
///下面是用来测试字符串转换浮点数的代码
//print((float)Convert.ChangeType(x_in,typeof(float)));
//print(Convert.ToSingle(x_in));
//print(float.Parse(x_in));
10.Unity3d中模型面片的上限
任意单体模型,当中的三角面片数量都不能超过65000,这一点在从其它软件中导入模型时尤其要注意。
11.关于使用Event类时需要注意的问题
因为Event类属于是Unity3d中GUI的事件类,所以在使用此类时,必须要由OnGUI方法来调用它,如果使用非OnGUI方法来调用的话,就会报“NullReferenceException:Object reference not set to an instance of an object
比如下面的windowRegionFind()方法:
//本GUI窗体对鼠标光标屏幕坐标的感知
bool windowRegionFind(Rect windowIn)
//if (windowIn.Contains(Input.mousePosition))
if (windowIn.Contains(Event.current.mousePosition))
//s cript01.MouseInGUI=
//s cript01.MouseInGUI=
通过OnGUI方法使用之
void OnGUI()
window01 = GUI.Window(0, window01,MyWindow01, window_title01); //在场景中显示定义好的window01GUI窗体
//设置window01GUI窗体只能在屏幕以内显示,不会出界
window01.x = Mathf.Clamp(window01.x, 0.0f, (Screen.width-window01.width));
window01.y = Mathf.Clamp(window01.y,0.0f,(Screen.height-window01.height));
a = windowRegionFind(window01);
//if(window01.Contains(Event.current.mousePosition))
//在OnGUI方法里直接使用Event类
//s cript01.MouseInGUI=
//s cript01.MouseInGUI=
通过Update方法使用之
void Update () {
//a = windowRegionFind(window01);
//运行时会报错
站长推荐 /1
纳金名模第113期美术用品3d模型:数量30个,大小为55.9MB。完全免费下载哦!这样的福利我和我的小伙伴们都惊呆了!!下载地址:
400-067-3919
Powered by - X2.5
Narkii Inc.我原本有一个场景,实现的是轮播图片的功能,可以做到最快一秒75帧。&br&然后我添加了几个场景,实际运行的时候是先运行添加进去的那几个场景,最后再跳转到轮播图片的场景。这时候发现,最快一秒只能50帧了。直接掉了三分一的速度啊!!!&br&&br&请问为什么会出现这种情况?&br&我跳转场景用的是
Application.LoadLevel();这个函数不是跳转到下一个场景后会自动把上一个场景的东西销毁掉么?既然前面几个场景的东西都被销毁了,是什么在影响我当前场景的速度呢?&br&&br&PS:以上情况都是在安卓的环境下测试的。而在PC上看,运行轮播场景时的内存和CPU占用率,在直接进入轮播场景与最后进入轮播场景的不同情况下是差不多的。第一张图是直接进入,第二张图是最后进入。&br&&img src=&/0e418ff8bdc58ebd8a00ff_b.png& data-rawwidth=&613& data-rawheight=&345& class=&origin_image zh-lightbox-thumb& width=&613& data-original=&/0e418ff8bdc58ebd8a00ff_r.png&&&img src=&/4a72b0c28f8cbd9ed9a0915bbc59170a_b.png& data-rawwidth=&611& data-rawheight=&351& class=&origin_image zh-lightbox-thumb& width=&611& data-original=&/4a72b0c28f8cbd9ed9a0915bbc59170a_r.png&&
我原本有一个场景,实现的是轮播图片的功能,可以做到最快一秒75帧。然后我添加了几个场景,实际运行的时候是先运行添加进去的那几个场景,最后再跳转到轮播图片的场景。这时候发现,最快一秒只能50帧了。直接掉了三分一的速度啊!!!请问为什么会出现这种情况?我跳转场景用的是
Application.LoadLevel();这个函数不是跳转到下一个场景后会自动把上一个场景的东西销毁掉么?既然前面几个场景的东西都被销毁了,是什么在影响我当前场景的速度呢?PS:以上情况都是在安卓的环境下测试的。而在PC上看,运行轮播场景时的内存和CPU占用率,在直接进入轮播场景与最后进入轮播场景的不同情况下是差不多的。第一张图是直接进入,第二张图是最后进入。…
谢邀。先说为什么会慢。原因:1、u3d切换场景后,看到之前场景被销毁,实际未必所有对象和资源都被回收。其中有gc的bug,有机制问题,有实现问题,情况会比较复杂。2、如果有较多的单例和全场景通用的控制模块,那么切换场景并不会减少这些部分的开销,同时又增加新场景的开销,最终导致切换场景的次数越多,运行越慢。针对以上两点:1、题主需要使用profile或者自己写测试去更精确的定位具体损耗是哪里。然后针对问题修改。2、可以使用assetbundle更加精确可控的去管理资源,未必比resource streaming效率更高,但是更可控。3、重新评估多场景切换的必要性,要知道如果需要平滑轮转,可能不需要加载新场景,只需要增加缺失的对象,或者直接使用静态场景和摄像机裁剪。明确自己的需求,选择最好的解决方案,然后再谈优化。以上。
可以在loadlevel之后call一下Resources.unloadunusedxxxxxx试试,另外多用unity的profiler工具,会有更详细的性能分析信息,比我们在这里瞎猜对你的帮助会更大
可以在loadlevel之后call一下Resources.unloadunusedxxxxxx试试,另外多用unity的profiler工具,会有更详细的性能分析信息,比我们在这里瞎猜对你的帮助会更大
谢邀。第一,使用Unity的Profile工具,然后让数据说话而非在这里猜想,否则没有人可以给你给出答案;第二,关注通过Resources.Load()方式和AssetBundle方式加载及其善后事宜,需注意资源释放。第三,LoadLevel是指加载场景,它不代表每次加载完场景以后,资源都能得到有效释放,尤其是喜欢使用单例进行全局控制的这种情况。&br&&br&我能想到的大概有这些,你可以创建一个新的场景来验证是否场景数目增加会引发这个问题,我认为是没有关系的,你看《雨血》和《仙剑奇侠传六》以及《穹之扉》,它们出现卡顿的情况都是和场景规模有关的。
谢邀。第一,使用Unity的Profile工具,然后让数据说话而非在这里猜想,否则没有人可以给你给出答案;第二,关注通过Resources.Load()方式和AssetBundle方式加载及其善后事宜,需注意资源释放。第三,LoadLevel是指加载场景,它不代表每次加载完场景以后,资…
已有帐号?
无法登录?
社交帐号登录
我用代码拯救你的梦想为什么Unity里场景多了运行起来会变慢?
我原本有一个场景,实现的是轮播图片的功能,可以做到最快一秒75帧。&br&然后我添加了几个场景,实际运行的时候是先运行添加进去的那几个场景,最后再跳转到轮播图片的场景。这时候发现,最快一秒只能50帧了。直接掉了三分一的速度啊!!!&br&&br&请问为什么会出现这种情况?&br&我跳转场景用的是
Application.LoadLevel();这个函数不是跳转到下一个场景后会自动把上一个场景的东西销毁掉么?既然前面几个场景的东西都被销毁了,是什么在影响我当前场景的速度呢?&br&&br&PS:以上情况都是在安卓的环境下测试的。而在PC上看,运行轮播场景时的内存和CPU占用率,在直接进入轮播场景与最后进入轮播场景的不同情况下是差不多的。第一张图是直接进入,第二张图是最后进入。&br&&img src=&/0e418ff8bdc58ebd8a00ff_b.png& data-rawwidth=&613& data-rawheight=&345& class=&origin_image zh-lightbox-thumb& width=&613& data-original=&/0e418ff8bdc58ebd8a00ff_r.png&&&img src=&/4a72b0c28f8cbd9ed9a0915bbc59170a_b.png& data-rawwidth=&611& data-rawheight=&351& class=&origin_image zh-lightbox-thumb& width=&611& data-original=&/4a72b0c28f8cbd9ed9a0915bbc59170a_r.png&&
我原本有一个场景,实现的是轮播图片的功能,可以做到最快一秒75帧。然后我添加了几个场景,实际运行的时候是先运行添加进去的那几个场景,最后再跳转到轮播图片的场景。这时候发现,最快一秒只能50帧了。直接掉了三分一的速度啊!!!请问为什么会出现这种情况?我跳转场景用的是
Application.LoadLevel();这个函数不是跳转到下一个场景后会自动把上一个场景的东西销毁掉么?既然前面几个场景的东西都被销毁了,是什么在影响我当前场景的速度呢?PS:以上情况都是在安卓的环境下测试的。而在PC上看,运行轮播场景时的内存和CPU占用率,在直接进入轮播场景与最后进入轮播场景的不同情况下是差不多的。第一张图是直接进入,第二张图是最后进入。…
可以在loadlevel之后call一下Resources.unloadunusedxxxxxx试试,另外多用unity的profiler工具,会有更详细的性能分析信息,比我们在这里瞎猜对你的帮助会更大
谢邀。第一,使用Unity的Profile工具,然后让数据说话而非在这里猜想,否则没有人可以给你给出答案;第二,关注通过Resources.Load()方式和AssetBundle方式加载及其善后事宜,需注意资源释放。第三,LoadLevel是指加载场景,它不代表每次加载完场景以后,资源都能得到有效释放,尤其是喜欢使用单例进行全局控制的这种情况。我能想到的大概有这些,你可以创建一个新的场景来验证是否场景数目增加会引发这个问题,我认为是没有关系的,你看《雨血》和《仙剑奇侠传六》以及《穹之扉》,它们出现卡顿的情况都是和场景规模有关的。
谢邀。先说为什么会慢。原因:1、u3d切换场景后,看到之前场景被销毁,实际未必所有对象和资源都被回收。其中有gc的bug,有机制问题,有实现问题,情况会比较复杂。2、如果有较多的单例和全场景通用的控制模块,那么切换场景并不会减少这些部分的开销,同时又增加新场景的开销,最终导致切换场景的次数越多,运行越慢。针对以上两点:1、题主需要使用profile或者自己写测试去更精确的定位具体损耗是哪里。然后针对问题修改。2、可以使用assetbundle更加精确可控的去管理资源,未必比resource streaming效率更高,但是更可控。3、重新评估多场景切换的必要性,要知道如果需要平滑轮转,可能不需要加载新场景,只需要增加缺失的对象,或者直接使用静态场景和摄像机裁剪。明确自己的需求,选择最好的解决方案,然后再谈优化。以上。
“我跳转场景用的是 Application.LoadLevel();这个函数不是跳转到下一个场景后会自动把上一个场景的东西销毁掉么?“从表象来说是看不见了,但在是内存里呢?让unity的profiler告诉你吧还可以多看看官方资源管理这块的文档,你的一些疑惑就会解开了。
Unity游戏影响性能的因素很多,除渲染模块外,动画模块、物理模块、加载模块和UI模块都可能造成较大的性能开销。对此,如果是是在本地,可以通过Profiler直接查看性能占用情况。同时,也可以来UWA网站进行深入的性能测评,可以快速帮你定位性能瓶颈并给出优化方案。网址是:另外,建议你看一下这篇Blog,是我们这几年来在Unity游戏性能优化上的经验总结。
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 unity切换场景不销毁 的文章

 

随机推荐