官术网_书友最值得收藏!

Obtain Components using the fastest method

There are several variations of the GetComponent() method, and they each have a different performance cost, so it becomes 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, in all later versions of Unity 5 and the initial release of Unity 2017, 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 make the relative costs clear.

Here is the result we get when the tests complete:

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 is no benefit for the costs incurred. There are some very rare exceptions, like if we were writing a custom debug console for Unity, which might parse a user-inputted string to acquire a Component. In any case, these would be used for debugging and diagnostics situations only, where performance isn't too important. For a production-level application, the use of GetComponent(string) is just a needless waste.

主站蜘蛛池模板: 阿鲁科尔沁旗| 旌德县| 宣城市| 华亭县| 丰城市| 汕尾市| 红河县| 元江| 那曲县| 墨脱县| 余庆县| 霍州市| 绿春县| 陆丰市| 姜堰市| 分宜县| 绩溪县| 汉沽区| 名山县| 巩义市| 兴安盟| 峨眉山市| 文登市| 东乌珠穆沁旗| 隆化县| 马尔康县| 宜兰市| 济源市| 三原县| 周宁县| 南投市| 南京市| 澎湖县| 福州市| 常德市| 永仁县| 定结县| 南木林县| 榆社县| 和顺县| 中超|