Slide 1

Slide 1 text

Unity+C#ͰֶͿʂ ϝϞϦϨΠΞ΢τͱ 
 vtableͷ͢ʍΊ CA.unity #6 
 2023-02-03 
 Ζͬ͞Ή (Mio Kutani) ʙಈతϙϦϞʔϑΟζϜΛ࣮ݱ͢Δ࢓૊Έʙ

Slide 2

Slide 2 text

Introduce myself ABOUT ME ΠʔϒΠ͕޷͖ͳήʔϜΤϯδχΞͰ͢ɻ ͱ͋ΔήʔϜձࣾʹͯɺ 
 ϦʔυΫϥΠΞϯτΤϯδχΞΛ୲౰ɻ ࠷ۙ͸࠾༻ͱϚωδϝϯτ͕ଟΊɻ 
 ෭ۀͰ͸ϝλόʔεܥ͕ϝΠϯͰ͢ɻ Ζͬ͞Ή εΩϧηοτ Unity C# 5೥͘Β͍ (2D, 3D൒ʑ) Unreal Engine C++ 3೥(झຯࠐΈ) 
 Jenkins͓͹͞Μͨ͠Γ ӳޠษڧͨ͠Γ 2018.3ʙ2022.3 MSMVPͰͨ͠

Slide 3

Slide 3 text

ࠓճͷεϥΠυͷ ݩهࣄ https://qiita.com/4_mio_11/items/ aa71f18b24ab55e4cb3d

Slide 4

Slide 4 text

Contents Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ ϝϞϦͷछྨ ελοΫͱώʔϓ جຊͷϝϞϦϨΠΞ΢τ Φϑηοτ ܧঝ࣌ͷΦϑηοτ vtableʹ͍ͭͯ ֓ཁ σϝϦοτ

Slide 5

Slide 5 text

Unity͕؅ཧͯ͠Δ 
 ϝϞϦʹ͍ͭͯ

Slide 6

Slide 6 text

C#ଆͰ࢖༻͞ΕΔɻ OSଆ΍ɺMono·ͨ͸IL2CPPʹΑͬͯ ϝϞϦͷ֬อɾղ์͕ࣗಈతʹ 
 ؅ཧ͞ΕΔϝϞϦϨΠϠʔɻ ϚωʔδϝϞϦ ϝϞϦͷछྨ Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ C#ଆͰ࢖༻͞ΕΔɻ JobSystem΍BurstΛ࢖༻͢Δࡍʹ͸ ͜ͷϝϞϦϨΠϠʔΛ࢖͏ɻ ϝϞϦͷ֬อɾղ์͸ࣗݾ੹೚Ͱߦ͏ɻ C#ͷΞϯϚωʔδϝϞϦ UnityଆͰ࢖༻͞ΕΔɻ UnityࣗମΛ࣮ߦ͢ΔC++ͷͨΊͷ 
 ϝϞϦϨΠϠʔͰ͋Γɺ 
 ௚઀৮Δػձ͸͋·Γͳ͍ɻ ωΠςΟϒϝϞϦ

Slide 7

Slide 7 text

C#ଆͰ࢖༻͞ΕΔɻ OSଆ΍ɺMono·ͨ͸IL2CPPʹΑͬͯ ϝϞϦͷ֬อɾղ์͕ࣗಈతʹ 
 ؅ཧ͞ΕΔϝϞϦϨΠϠʔɻ ϚωʔδϝϞϦ ϝϞϦͷछྨ Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ C#ଆͰ࢖༻͞ΕΔɻ JobSystem΍BurstΛ࢖༻͢Δࡍʹ͸ ͜ͷϝϞϦϨΠϠʔΛ࢖͏ɻ ϝϞϦͷ֬อɾղ์͸ࣗݾ੹೚Ͱߦ͏ɻ C#ͷΞϯϚωʔδϝϞϦ UnityଆͰ࢖༻͞ΕΔɻ UnityࣗମΛ࣮ߦ͢ΔC++ͷͨΊͷ 
 ϝϞϦϨΠϠʔͰ͋Γɺ 
 ௚઀৮Δػձ͸͋·Γͳ͍ɻ ωΠςΟϒϝϞϦ ຊ೔ղઆ͢Δͷ͸ 
 ϚωʔδϝϞϦ಺Ͱͷ࿩

Slide 8

Slide 8 text

ϚωʔδϝϞϦʹ͸3ͭͷछྨ͕ଘࡏ͠ɺ͜ΕΒ͸RAM಺ʹอଘ͞ΕΔɻ ϝϞϦͷछྨ Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ ελοΫ ώʔϓ ωΠςΟϒVM 
 ϝϞϦ (Ϛωʔδυώʔϓ) OS͕؅ཧ͢Δখ͞ ͳϝϞϦɻ ΞϓϦͷॳظԽஈ֊ ͰׂΓ౰ͯΒΕɺα Πζ͸มߋෆՄɻ ϥϯλΠϜʢMono, IL2CPPʣ͕؅ཧ͢ ΔϝϞϦɻ αΠζ͸࣮ߦ࣌ʹՄ มɻ ίʔυੜ੒Λߦ͏ ίʔυΛ࢖༻͢Δࡍ ʹ࢖༻͢ΔϝϞϦɻ ීஈ͸ҙࣝ͢Δ͜ͱ ͸͋·Γແ͍ɻ

Slide 9

Slide 9 text

ελοΫͱώʔϓ Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ ελοΫ ࢀরܕͷΫϥεͳͲͷதͰ 
 એݴ͞Ε͍ͯͳ͍஋ܕͷม਺ ߏ଄ମɺྻڍܕ ώʔϓϝϞϦ಺ͷΦϒδΣΫτͷΞυϨε stackallocͰ֬อͨ͠഑ྻ ࢀরܕͷม਺ (഑ྻɺΫϥεɺσϦήʔ τɺΦϒδΣΫτɺจࣈྻ) ϘοΫεԽ͞Εͨ஋ܕΦϒδΣΫτ ϥϜμࣜΛؚΉແ໊ؔ਺಺ͷΩϟϓνϟ͞ Εͨม਺ staticม਺ ώʔϓ (Ϛωʔδυώʔϓ) ։ൃऀ͕ओʹ৮Δͷ͸ελοΫͱώʔϓɻͦΕͧΕओʹ࣍ͷσʔλΛ֨ೲ͢Δɻ

Slide 10

Slide 10 text

ελοΫͷϝϦοτɾσϝϦοτ Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ ελοΫ ϝϞϦ಺σʔλ΁ͷΞΫηε͸ߴ଎ɻ OSଆͰϝϞϦΛݫີʹ؅ཧ͍ͯ͠Δͨ ΊɺϝϞϦͷஅยԽͳͲΛ๷͙ɻ ม਺ʹܕͷൣғ֎ͷ஋͕ೖΔͱྫ֎ൃੜɻ ελοΫࣗମͷϝϞϦྔ͕গͳ͍ͨΊɺ࢖ ͍੾ͬͨ৔߹ʹ΋ྫ֎ൃੜɻ ελοΫͱώʔϓ void Main() { int a; int b = 4; int c = b; } int a; int b; int c; void Main() { int a; int b = 4; int c = b; int d = 0; } int a; int b; int c; int d; before after +1

Slide 11

Slide 11 text

ॊೈੑ͕ߴ͘ɺඞཁͳ෼Λਵ࣌֬อՄೳɻ GCʹΑͬͯࣗಈ؅ཧ͞ΕΔͨΊɺϝϞϦ ͷഁଛ΍ΤϥʔΛ࠷খݶʹ཈͑ΒΕΔɻ GCଆͰ͸࢖༻ࡁΈϝϞϦͷ੔ཧ੔಴·Ͱ ͸ߦͬͯ͘Εͳ͍ͨΊɺஅยԽ͕ى͖Δɻ ϝϞϦ಺σʔλ΁ͷΞΫηε͸௿଎ɻ ώʔϓ (Ϛωʔδυώʔϓ) ώʔϓͷϝϦοτɾσϝϦοτ Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ ελοΫͱώʔϓ ΫϥεA ΦϒδΣΫτB ഑ྻD จࣈྻE ϝϞϦஅยԽྫ จࣈྻ(ղ์ࡁΈ) ഑ྻ(ղ์ࡁΈ) ΦϒδΣΫτF(ղ์ࡁΈ) ΦϒδΣΫτF(ղ์ࡁΈ) ΦϒδΣΫτF ҎԼͷαΠζͷ σʔλΛ֨ೲՄೳ

Slide 12

Slide 12 text

جຊͷϝϞϦϨΠΞ΢τ

Slide 13

Slide 13 text

Φϑηοτ جຊͷϝϞϦϨΠΞ΢τ ࢀরܕͷม਺ (഑ྻɺΫϥεɺσϦήʔ τɺΦϒδΣΫτɺจࣈྻ) ϘοΫεԽ͞Εͨ஋ܕΦϒδΣΫτ ϥϜμࣜΛؚΉແ໊ؔ਺಺ͷΩϟϓνϟ͞ Εͨม਺ staticม਺ ώʔϓ (Ϛωʔδυώʔϓ) Ϋϥε༻ͷϝϞϦ͸ώʔϓ্ʹ֬อ͞ΕΔɻ

Slide 14

Slide 14 text

Φϑηοτ جຊͷϝϞϦϨΠΞ΢τ intܕͷΫϥεม਺܈Λఆٛ͠ɺΠϯελϯεԽͨ͠৔߹ʢϝϞϦϨΠΞ΢τॱং͸Ұ୴ߟྀ͠ͳ͍ʣ public class Hoge { public int a; public int b; public int c; } ΫϥεHogeͷ Πϯελϯε int c; int b; int a; +0x08 +0x04 +0x00 ઌ಄ΞυϨε͔Βͷ ڑ཭ʢΦϑηοτʣ

Slide 15

Slide 15 text

ܧঝ࣌ͷΦϑηοτ جຊͷϝϞϦϨΠΞ΢τ ୯७ͳܧঝΛߦͬͨΫϥεCͷ৔߹ɺίϯύΠϧ࣌ˍϦϯΫ࣌ʹؔ਺܈ͷΞυϨεΛܭࢉ͢Δɻ 
 ΫϥεCΠϯελϯεͷϝϞϦׂΓ౰ͯߏ੒͸ҎԼͷΑ͏ͳܗʹͳΔɻ public class A { public void HogeA() { … } } public class B : A { public void HogeB() { … } } public class C : B { public void HogeC() { … } } ΫϥεCͷΦϒδΣΫτ ΫϥεCͷ৘ใ ΫϥεBͷ৘ใ ΫϥεAͷ৘ใ this(࠷ॳ͸ઌ಄Λࢦ͢)

Slide 16

Slide 16 text

جຊͷϝϞϦϨΠΞ΢τ ΫϥεCͷΦϒδΣΫτ͔ΒΫϥεBͰ࣮૷͍ͯ͠ΔHogeB()Λݺͼग़͢ࡍʹ͸ɺ thisϙΠϯλΛBͷΦϒδΣΫτ෦෼΁Ҡಈͤͯ͞ɺΫϥεBͷϙΠϯλΛಘΔඞཁ͕͋Δɻ ͦ͜ͰɺΫϥεC͕࣋ͭΫϥεB༻ͷΦϑηοτΛࢀরͯ͠ɺϙΠϯλΛͣΒ͢ɻ ΫϥεCͷΦϒδΣΫτ ΫϥεCͷ৘ใ ΫϥεBͷ৘ใ ΫϥεAͷ৘ใ this + ΫϥεB༻ͷΦϑηοτ ΫϥεCͷઌ಄ΞυϨε void Main() { var C = new C(); c.HogeB(); } ܧঝ࣌ͷΦϑηοτ

Slide 17

Slide 17 text

vtableʹ͍ͭͯ

Slide 18

Slide 18 text

֓ཁ vtableʹ͍ͭͯ ܕʹґଘͨؔ͠਺ݺͼग़͠ΛʮԾ૝ؔ਺ςʔϒϧ : virtual method table(vtable)ʯΛ࢖༻ͯ͠ղܾ͢Δɻ ͜Ε͸֘౰Ϋϥεʹؔ࿈͢ΔԾ૝ؔ਺ͷϙΠϯλΛ·ͱΊͨ΋ͷɻ গͳ͘ͱ΋ҰͭͷԾ૝ϝιουΛ࣋ͭ৔߹ɺ֤Ϋϥε޲͚ʹಠࣗͷvtable͕࡞੒͞ΕΔɻ public class Base { public virtual int GetId() { … } } public class A : Base { public override int GetId() { … } } public class B : A { public new int GetId() { … } } ΫϥεBaseͷΦϒδΣΫτ ΫϥεBaseͷ৘ใ ΫϥεBase༻ͷvtable ΫϥεAͷΦϒδΣΫτ ΫϥεBaseɾΫϥεAͷ৘ใ ΫϥεA༻ͷvtable ΫϥεBͷΦϒδΣΫτ ΫϥεBaseɾΫϥεAɾΫϥεBͷ৘ใ ΫϥεB༻ͷvtable

Slide 19

Slide 19 text

public class Base { public virtual int GetId() { … } } public class A : Base { public override int GetId() { … } } public class B : A { public new int GetId() { … } } ΫϥεBͷΦϒδΣΫτ ΫϥεBaseɾΫϥεAɾΫϥεBͷ৘ใ ΫϥεB༻ͷvtable ྫ͑͹ΫϥεBͷςʔϒϧ৘ใΛݟΔͱɺoverrideͨ͠GetId()Λ࣋ͭAଆͷؔ਺ϙΠϯλͱɺ newͰΫϥεB༻ʹ࠶ఆٛͨ͠GetId()ͷؔ਺ϙΠϯλ͕֨ೲ͞Ε͍ͯΔɻ A:GetId() B:GetId() vtableͷྫ vtableʹ͍ͭͯ

Slide 20

Slide 20 text

σϝϦοτ Ծ૝ؔ਺อ࣋ΫϥεͷΠϯελϯε͸ vtable΁ΞΫηε͢Δ༻ͷϙΠϯλ͕ ҉໧Ͱઌ಄ʹ௥Ճ͞Εɺ গ͚ͩ͠αΠζ͕େ͖͘ͳΔɻ ΠϯελϯεαΠζͷ૿Ճ Ծ૝ؔ਺ͷݺͼग़͠͸vtableܦ༝ͰߦΘΕ ΔͨΊɺ͔ᷮʹύϑΥʔϚϯεϩε͕ى͜ Δɻ͜Ε͸ඇৗʹখ͍͞΋ͷͰ͸͋Δ͕ɺ 
 1ϑϨʔϜʹԿઍճ΋ݺͼग़͢ܗʹͳΔͱɺ ͙͢ʹΦʔόʔϔου͕ੵΈॏͳΔɻ ύϑΥʔϚϯεϩε Ծ૝ؔ਺ͷ࢖༻ʹΑͬͯύϑΥʔϚ ϯε͕ଛͳΘΕͯ΋ɺͦΕ͕ݪҼͩ ͱಥ͖ࢭΊΔͷ͸೉͍͠ɻ ࠷ॳ͔ΒϦεΫΛ೦಄ʹஔ͍ͯ࢖͏ ඞཁ͕͋Δɻ ϓϩϑΝΠϦϯάͷ೉қ౓ vtableʹ͍ͭͯ

Slide 21

Slide 21 text

ࢀߟࢿྉ C++ͰֶͿʂϝϞϦϨΠΞ΢τͱvtableͷ͢ʍΊ ʙಈతϙϦϞϑΟζϜΛ࣮ݱ͢Δ࢓૊Έʙ Unity ύϑΥʔϚϯενϡʔχϯά όΠϒϧ Memory Management in Unity Unity 2021 LTSͰϝϞϦͷ࢖͍ํΛΧελϚΠζ͢Δ Unity ͷϝϞϦʢެࣜϦϑΝϨϯεʣ ʲUnityʳUnsafeUtilityʹ͍ͭͯవΊͯΈΔ UnityͷGC͸ͲΜͳ࣮૷ʹͳ͍ͬͯΔͷ͔ VIRTUAL, NEW AND OVERRIDE IN C# [ࡶه]ଟॏܧঝͰ͖ͳ͍ཧ༝ ήʔϜΤϯδϯΞʔΩςΫνϟ ୈ3൛

Slide 22

Slide 22 text

͝ਗ਼ௌ༗೉͏ޚ࠲͍·ͨ͠ʂ