我需要将两个列表与图形打印的值进行比较。如果值相同,我什么都不做,当某些内容发生变化时,图表就会被重新打印。它可以工作但是在Unity中它会暂时停留一段时间,但足以引起口吃。我想我每秒从网上下载值的事实也无济于事。我在下面发布了我的代码,有没有办法让它更快?
void MinMaxPosition(UILineRenderer graph)
{
bool equals = true;
MaxPosition = this.GetComponent<TextReader>().prices.Max() + this.GetComponent<TextReader>().prices.Max() * 0.0003f;
MinPosition = this.GetComponent<TextReader>().prices.Min() - this.GetComponent<TextReader>().prices.Min() * 0.0003f;
print(MaxPosition);
print(MinPosition);
for(int i = 0;i<graph.Points.Count();i++)
{
if (((graph.Points[i].y / 0.8) * MaxPosition - MinPosition) + MinPosition != this.GetComponent<TextReader>().prices.ElementAt(i))
{
equals = false;
break;
}
}
if (GetComponent<TextReader>().prices.Count != lastSize || equals == false)
{
ReprintGraph(graph);
}
lastSize = GetComponent<TextReader>().prices.Count;
}
答案 0 :(得分:2)
1)什么是GetComponent()?一些DI引擎?哪一个?如果你正在使用Ninject,那是最慢的那个,你应该切换到更快的。
2)无论GetComponent()是什么,你为什么要用该方法调用50次?只需在顶部调用一次并保存TextReader实例。如果您使用慢速DI引擎,那将会变得昂贵。
3)列表中有多少个点?
4)检查是否有比您正在使用的方法更轻的方法。即Count()vs. Length,ElementAt vs. []等
5)这个需要更多的工作,但值真的每秒都会改变吗?如果没有,你就浪费了很多时间。比较每一秒。弄清楚他们真正改变的频率,并找出可接受的延迟程度。一种解决方案是在更改时推送它们,而不是循环轮询。
如果是我,我会做的第一个优化是摆脱50个GetComponent()调用并从那里开始。
答案 1 :(得分:2)
我建议的第一件事就是缓存GetComponent()的结果 - 这通常是一个非常昂贵的操作,而且你是在一个紧凑的循环中调用它。我也非常小心尝试与浮点数进行比较;由于浮点精度问题,导致ReprintGraph(图形)的调用频率超出预期,因此很容易被关闭;使用Mathf.Approximately()可能更好。所以我会更改这个代码块。
TextReader _textReader = null;
void MinMaxPosition(UILineRenderer graph)
{
bool equals = true;
if (_textReader == null)
{
_textReader = this.GetComponent<TextReader>();
}
MaxPosition = _textReader.prices.Max() + _textReader.prices.Max() * 0.0003f;
MinPosition = _textReader.prices.Min() - _textReader.prices.Min() * 0.0003f;
print(MaxPosition);
print(MinPosition);
for(int i = 0;i<graph.Points.Count();i++)
{
if (!Mathf.Approximately( ((graph.Points[i].y / 0.8) * MaxPosition - MinPosition) + MinPosition , _textReader.prices.ElementAt(i)) )
{
equals = false;
break;
}
}
if (_textReader.prices.Count != lastSize || equals == false)
{
ReprintGraph(graph);
}
lastSize = _textReader.prices.Count;
}
答案 2 :(得分:1)
请勿在运行时使用.GetComponent()或GameObject.Find()。这需要太多资源。 如果您需要这样做 - 您需要在开始或清醒时执行此操作。
如果可能的话,你需要使用transform.Find()(或transform.FindChild - 与transform.Find相同 - 所以无论如何)。这比GameObject.Find()
更轻量级这可能是你有滞后的原因。首先尝试修复此问题,如果滞后不能修复,请将结果和更新的代码写给我。