- Unity Game Optimization
- Dr. Davide Aversa Chris Dickinson
- 278字
- 2021-06-24 12:13:02
Obtaining components using the fastest method
There are several variations of the GetComponent() method, and they each have a different performance cost, so it is prudent to call the fastest possible version of this method. The three overloads available are GetComponent(string), GetComponent<T>(), and GetComponent(typeof(T)). It turns out that the fastest version depends on which version of Unity we are running since several optimizations have been made to these methods through the years; however, if you are using any version of Unity (from Unity 2017 onward), it is best to use the GetComponent<T>() variant.
Let's prove this with some simple testing:
int numTests = 1000000;
TestComponent test;
using (new CustomTimer("GetComponent(string)", numTests)) {
for (var i = 0; i < numTests; ++i) {
test = (TestComponent)GetComponent("TestComponent");
}
}
using (new CustomTimer("GetComponent<ComponentName>", numTests)) {
for (var i = 0; i < numTests; ++i) {
test = GetComponent<TestComponent>();
}
}
using (new CustomTimer("GetComponent(typeof(ComponentName))", numTests)) {
for (var i = 0; i < numTests; ++i) {
test = (TestComponent)GetComponent(typeof(TestComponent));
}
}
The preceding code tests each of the GetComponent() overloads a million times. This is far more tests than would be sensible for a typical project, but it helps to make the relative costs clear.
Here is the result we get when the tests complete (of course, the specific numeric values may be different on your machine):

As you can see, the GetComponent<T>() method is only a tiny fraction faster than GetComponent(typeof(T)), whereas GetComponent(string) is significantly slower than the alternatives. Therefore, it is pretty safe to use either of the type-based versions of GetComponent() because of the small performance difference. However, we should ensure that we never use GetComponent(string) since the outcome is identical, and there are no benefits for the costs incurred. There are some very rare exceptions. Imagine that we were writing a custom debug console for Unity that can parse a user-input string to acquire a component. In this case, we would acquire a component by using the expensive GetComponent(string) only during debugging and diagnostics situations. In these cases, performance isn't too important. On the contrary, for a production-level application, the use of GetComponent(string) is just a needless waste of CPU cycles.
- scikit-learn Cookbook
- 深入理解Bootstrap
- 碼上行動:零基礎學會Python編程(ChatGPT版)
- 基于Java技術的Web應用開發
- ArcGIS By Example
- 精通Python設計模式(第2版)
- HTML5從入門到精通 (第2版)
- Service Mesh實戰:基于Linkerd和Kubernetes的微服務實踐
- Odoo 10 Implementation Cookbook
- Visual C++從入門到精通(第2版)
- Java 9 with JShell
- JSP應用與開發技術(第3版)
- Learning RSLogix 5000 Programming
- Mastering High Performance with Kotlin
- PostGIS Cookbook