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

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.

主站蜘蛛池模板: 鹤山市| 丹江口市| 大安市| 东乌珠穆沁旗| 贡觉县| 天等县| 胶南市| 临安市| 曲沃县| 元氏县| 萝北县| 黄平县| 嘉禾县| 仁寿县| 蒙山县| 广灵县| 息烽县| 霍州市| 紫金县| 马山县| 西贡区| 调兵山市| 赤壁市| 麻江县| 张掖市| 华池县| 扬中市| 封丘县| 随州市| 安义县| 广东省| 闵行区| 高淳县| 墨脱县| 聂荣县| 弥勒县| 益阳市| 兴隆县| 房山区| 吴旗县| 阳新县|