Unity 场景加载时间非常长
Posted
技术标签:
【中文标题】Unity 场景加载时间非常长【英文标题】:Unity Scene loading times are extremly long 【发布时间】:2019-08-03 20:51:55 【问题描述】:我对 Unity 还很陌生,所以对 IDE 没有太多经验。 我正在开发一个非常基本的应用程序、一个登录和一个带有一些基本 UI 元素的仪表板。
我遇到的问题是当我尝试切换场景时。因此,从 LoginScene 到 Dashboard 场景最多可能需要 20 秒。 脚本甚至不需要运行太多逻辑。 在我看来,这太长了,有人知道如何优化我的代码,或者至少知道我做错了什么?
这是检查正确用户和改变场景的代码。
// Start is called before the first frame update
void Start()
Screen.orientation = ScreenOrientation.Portrait;
// Update is called once per frame
void Update()
//get values from inputfields
emailString = email.GetComponent<InputField>().text;
passwordString = password.GetComponent<InputField>().text;
btnLogin = login.GetComponent<Button>();
btnLogin.onClick.AddListener(ValidateLogin);
private void ValidateLogin()
if (emailString.Trim() == "aa" && passwordString.Trim() == "aa")
print("login succeeded!");
SceneManager.LoadScene(1);
else
print("wrong credentials");
顺便说一句:数字 1 是对我的下一个场景,仪表板场景的引用。
【问题讨论】:
只是一个问题:为什么要在更新中添加侦听器,而不是在开始中?我怀疑这就是问题所在。 嗯,有几个问题。您应该将几乎所有内容从Update
迁移到Start
。无需多次获取组件或添加侦听器。还要在ValidateLogin
中为emailString
赋值。
@Andrea 非常感谢您!不知道为什么我在更新中写了它。这是一个非常愚蠢的错误。
@AliKanat 代码现在运行流畅多了,非常感谢!
【参考方案1】:
GetComponent<>()
是一项资源密集型任务,您不必要地调用其中的 3 个,您还每帧添加一个事件侦听器。
你应该做的是:
阅读 Update、Awake、Start 的作用,然后删除 GetComponent<>()
部分并改用属性或字段,并且不要每帧都添加事件监听器。
InputField emailInputField;
InputField passwordInputField;
Button loginButton;
// Setting up the Scene
void Awake()
emailInputField = email.GetComponent<Inputfield>();
passwordInputField = password.GetComponent<InputField>();
loginButton = login.GetComponent<Button>();
loginButton.onClick.AddListener(ValidateLogin);
// Start is called before the first frame update
void Start()
Screen.orientation = ScreenOrientation.Portrait;
// Update is called once per frame
void Update()
//get values from inputfields
emailString = emailInputField.text;
passwordString = passwordInputField.text;
private void ValidateLogin()
if (emailString.Trim() == "aa" && passwordString.Trim() == "aa")
print("login succeeded!");
SceneManager.LoadScene(1);
else
print("wrong credentials");
【讨论】:
谢谢,这对我帮助很大!我开始了解这个 Unity 事件系统是如何工作的。 很高兴它对您有所帮助,这仍然不是最聪明的方法,但适合您的学习曲线 您愿意与我分享“最聪明”的方法吗?真的很想从一开始就知道“最好”的方式,这样我的学习过程会顺利很多。 当然,它不再以可衡量的方式影响您的性能,但是为什么要每帧检查字符串?,当您单击登录按钮时就足以验证它,所以我会读进去ValidateLogin()
功能(这是在线登录表单的工作方式,它们仅在按钮推送时验证),所以基本上你的更新功能在这里是不必要的,还有另一个注意事项 Unity 默认会添加更新功能,但如果你不使用任何逻辑Update()
函数你应该删除它,因为在一个更大的项目中它会以可衡量的方式影响你的表现
而这样做的原因是引擎会调用那个空的Update()
函数【参考方案2】:
转换我的评论:监听器被添加到Update()
,而不是Start()
。因此,它被分配到每一帧。
【讨论】:
你知道是什么让代码变慢了吗?不会有无穷无尽的听众,所以会有一个无限循环,我的代码会冻结吗?按钮如何知道它应该使用哪个监听器?以上是关于Unity 场景加载时间非常长的主要内容,如果未能解决你的问题,请参考以下文章