Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity+C#で学ぶ! メモリレイアウトとvtableのすゝめ 〜動的ポリモーフィズムを実現する仕組み〜

Kutani Mio
January 27, 2023

Unity+C#で学ぶ! メモリレイアウトとvtableのすゝめ 〜動的ポリモーフィズムを実現する仕組み〜

Unityで開発する際にはメモリ周りについて考える方も多いでしょう。
今回はそのメモリに対して焦点を当てて、Unityでのメモリがどのようにレイアウトされているのか、また動的ポリモーフィズムがどのように実現されているのかを、図を用いてなるべくわかりやすい形で解説致します。

Kutani Mio

January 27, 2023
Tweet

More Decks by Kutani Mio

Other Decks in Programming

Transcript

  1. Unity+C#ͰֶͿʂ


    ϝϞϦϨΠΞ΢τͱ

    vtableͷ͢ʍΊ
    CA.unity #6

    2023-02-03

    Ζͬ͞Ή (Mio Kutani)
    ʙಈతϙϦϞʔϑΟζϜΛ࣮ݱ͢Δ࢓૊Έʙ

    View Slide

  2. Introduce myself
    ABOUT ME
    ΠʔϒΠ͕޷͖ͳήʔϜΤϯδχΞͰ͢ɻ


    ͱ͋ΔήʔϜձࣾʹͯɺ

    ϦʔυΫϥΠΞϯτΤϯδχΞΛ୲౰ɻ


    ࠷ۙ͸࠾༻ͱϚωδϝϯτ͕ଟΊɻ

    ෭ۀͰ͸ϝλόʔεܥ͕ϝΠϯͰ͢ɻ
    Ζͬ͞Ή
    εΩϧηοτ
    Unity C# 5೥͘Β͍ (2D, 3D൒ʑ)


    Unreal Engine C++ 3೥(झຯࠐΈ)

    Jenkins͓͹͞Μͨ͠Γ


    ӳޠษڧͨ͠Γ


    2018.3ʙ2022.3 MSMVPͰͨ͠

    View Slide

  3. ࠓճͷεϥΠυͷ


    ݩهࣄ
    https://qiita.com/4_mio_11/items/
    aa71f18b24ab55e4cb3d

    View Slide

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


    ϝϞϦͷछྨ


    ελοΫͱώʔϓ


    جຊͷϝϞϦϨΠΞ΢τ


    Φϑηοτ


    ܧঝ࣌ͷΦϑηοτ


    vtableʹ͍ͭͯ


    ֓ཁ


    σϝϦοτ

    View Slide

  5. Unity͕؅ཧͯ͠Δ

    ϝϞϦʹ͍ͭͯ

    View Slide

  6. C#ଆͰ࢖༻͞ΕΔɻ


    OSଆ΍ɺMono·ͨ͸IL2CPPʹΑͬͯ


    ϝϞϦͷ֬อɾղ์͕ࣗಈతʹ

    ؅ཧ͞ΕΔϝϞϦϨΠϠʔɻ


    ϚωʔδϝϞϦ
    ϝϞϦͷछྨ
    Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ
    C#ଆͰ࢖༻͞ΕΔɻ


    JobSystem΍BurstΛ࢖༻͢Δࡍʹ͸


    ͜ͷϝϞϦϨΠϠʔΛ࢖͏ɻ


    ϝϞϦͷ֬อɾղ์͸ࣗݾ੹೚Ͱߦ͏ɻ
    C#ͷΞϯϚωʔδϝϞϦ
    UnityଆͰ࢖༻͞ΕΔɻ


    UnityࣗମΛ࣮ߦ͢ΔC++ͷͨΊͷ

    ϝϞϦϨΠϠʔͰ͋Γɺ

    ௚઀৮Δػձ͸͋·Γͳ͍ɻ
    ωΠςΟϒϝϞϦ

    View Slide

  7. C#ଆͰ࢖༻͞ΕΔɻ


    OSଆ΍ɺMono·ͨ͸IL2CPPʹΑͬͯ


    ϝϞϦͷ֬อɾղ์͕ࣗಈతʹ

    ؅ཧ͞ΕΔϝϞϦϨΠϠʔɻ


    ϚωʔδϝϞϦ
    ϝϞϦͷछྨ
    Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ
    C#ଆͰ࢖༻͞ΕΔɻ


    JobSystem΍BurstΛ࢖༻͢Δࡍʹ͸


    ͜ͷϝϞϦϨΠϠʔΛ࢖͏ɻ


    ϝϞϦͷ֬อɾղ์͸ࣗݾ੹೚Ͱߦ͏ɻ
    C#ͷΞϯϚωʔδϝϞϦ
    UnityଆͰ࢖༻͞ΕΔɻ


    UnityࣗମΛ࣮ߦ͢ΔC++ͷͨΊͷ

    ϝϞϦϨΠϠʔͰ͋Γɺ

    ௚઀৮Δػձ͸͋·Γͳ͍ɻ
    ωΠςΟϒϝϞϦ
    ຊ೔ղઆ͢Δͷ͸

    ϚωʔδϝϞϦ಺Ͱͷ࿩

    View Slide

  8. ϚωʔδϝϞϦʹ͸3ͭͷछྨ͕ଘࡏ͠ɺ͜ΕΒ͸RAM಺ʹอଘ͞ΕΔɻ
    ϝϞϦͷछྨ
    Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ
    ελοΫ
    ώʔϓ ωΠςΟϒVM

    ϝϞϦ
    (Ϛωʔδυώʔϓ)
    OS͕؅ཧ͢Δখ͞
    ͳϝϞϦɻ


    ΞϓϦͷॳظԽஈ֊
    ͰׂΓ౰ͯΒΕɺα
    Πζ͸มߋෆՄɻ
    ϥϯλΠϜʢMono,
    IL2CPPʣ͕؅ཧ͢
    ΔϝϞϦɻ


    αΠζ͸࣮ߦ࣌ʹՄ
    มɻ
    ίʔυੜ੒Λߦ͏
    ίʔυΛ࢖༻͢Δࡍ
    ʹ࢖༻͢ΔϝϞϦɻ


    ීஈ͸ҙࣝ͢Δ͜ͱ
    ͸͋·Γແ͍ɻ

    View Slide

  9. ελοΫͱώʔϓ
    Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ
    ελοΫ
    ࢀরܕͷΫϥεͳͲͷதͰ

    એݴ͞Ε͍ͯͳ͍஋ܕͷม਺


    ߏ଄ମɺྻڍܕ


    ώʔϓϝϞϦ಺ͷΦϒδΣΫτͷΞυϨε


    stackallocͰ֬อͨ͠഑ྻ
    ࢀরܕͷม਺ (഑ྻɺΫϥεɺσϦήʔ
    τɺΦϒδΣΫτɺจࣈྻ)


    ϘοΫεԽ͞Εͨ஋ܕΦϒδΣΫτ


    ϥϜμࣜΛؚΉແ໊ؔ਺಺ͷΩϟϓνϟ͞
    Εͨม਺


    staticม਺
    ώʔϓ
    (Ϛωʔδυώʔϓ)
    ։ൃऀ͕ओʹ৮Δͷ͸ελοΫͱώʔϓɻͦΕͧΕओʹ࣍ͷσʔλΛ֨ೲ͢Δɻ

    View Slide

  10. ελοΫͷϝϦοτɾσϝϦοτ
    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

    View Slide

  11. ॊೈੑ͕ߴ͘ɺඞཁͳ෼Λਵ࣌֬อՄೳɻ


    GCʹΑͬͯࣗಈ؅ཧ͞ΕΔͨΊɺϝϞϦ
    ͷഁଛ΍ΤϥʔΛ࠷খݶʹ཈͑ΒΕΔɻ


    GCଆͰ͸࢖༻ࡁΈϝϞϦͷ੔ཧ੔಴·Ͱ
    ͸ߦͬͯ͘Εͳ͍ͨΊɺஅยԽ͕ى͖Δɻ


    ϝϞϦ಺σʔλ΁ͷΞΫηε͸௿଎ɻ
    ώʔϓ
    (Ϛωʔδυώʔϓ)
    ώʔϓͷϝϦοτɾσϝϦοτ
    Unity͕؅ཧͯ͠ΔϝϞϦʹ͍ͭͯ
    ελοΫͱώʔϓ
    ΫϥεA
    ΦϒδΣΫτB
    ഑ྻD
    จࣈྻE
    ϝϞϦஅยԽྫ
    จࣈྻ(ղ์ࡁΈ)
    ഑ྻ(ղ์ࡁΈ)
    ΦϒδΣΫτF(ղ์ࡁΈ)
    ΦϒδΣΫτF(ղ์ࡁΈ)
    ΦϒδΣΫτF ҎԼͷαΠζͷ


    σʔλΛ֨ೲՄೳ

    View Slide

  12. جຊͷϝϞϦϨΠΞ΢τ

    View Slide

  13. Φϑηοτ
    جຊͷϝϞϦϨΠΞ΢τ
    ࢀরܕͷม਺ (഑ྻɺΫϥεɺσϦήʔ
    τɺΦϒδΣΫτɺจࣈྻ)


    ϘοΫεԽ͞Εͨ஋ܕΦϒδΣΫτ


    ϥϜμࣜΛؚΉແ໊ؔ਺಺ͷΩϟϓνϟ͞
    Εͨม਺


    staticม਺
    ώʔϓ
    (Ϛωʔδυώʔϓ)
    Ϋϥε༻ͷϝϞϦ͸ώʔϓ্ʹ֬อ͞ΕΔɻ

    View Slide

  14. Φϑηοτ
    جຊͷϝϞϦϨΠΞ΢τ
    intܕͷΫϥεม਺܈Λఆٛ͠ɺΠϯελϯεԽͨ͠৔߹ʢϝϞϦϨΠΞ΢τॱং͸Ұ୴ߟྀ͠ͳ͍ʣ
    public class Hoge


    {


    public int a;


    public int b;


    public int c;


    }
    ΫϥεHogeͷ


    Πϯελϯε
    int c;
    int b;
    int a;
    +0x08
    +0x04
    +0x00
    ઌ಄ΞυϨε͔Βͷ


    ڑ཭ʢΦϑηοτʣ

    View Slide

  15. ܧঝ࣌ͷΦϑηοτ
    جຊͷϝϞϦϨΠΞ΢τ
    ୯७ͳܧঝΛߦͬͨΫϥε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(࠷ॳ͸ઌ಄Λࢦ͢)

    View Slide

  16. جຊͷϝϞϦϨΠΞ΢τ
    ΫϥεCͷΦϒδΣΫτ͔ΒΫϥεBͰ࣮૷͍ͯ͠ΔHogeB()Λݺͼग़͢ࡍʹ͸ɺ


    thisϙΠϯλΛBͷΦϒδΣΫτ෦෼΁Ҡಈͤͯ͞ɺΫϥεBͷϙΠϯλΛಘΔඞཁ͕͋Δɻ


    ͦ͜ͰɺΫϥεC͕࣋ͭΫϥεB༻ͷΦϑηοτΛࢀরͯ͠ɺϙΠϯλΛͣΒ͢ɻ
    ΫϥεCͷΦϒδΣΫτ
    ΫϥεCͷ৘ใ
    ΫϥεBͷ৘ใ
    ΫϥεAͷ৘ใ
    this
    +
    ΫϥεB༻ͷΦϑηοτ
    ΫϥεCͷઌ಄ΞυϨε
    void Main()


    {


    var C = new C();


    c.HogeB();


    }


    ܧঝ࣌ͷΦϑηοτ

    View Slide

  17. vtableʹ͍ͭͯ

    View Slide

  18. ֓ཁ
    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

    View Slide

  19. 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ʹ͍ͭͯ

    View Slide

  20. σϝϦοτ
    Ծ૝ؔ਺อ࣋ΫϥεͷΠϯελϯε͸


    vtable΁ΞΫηε͢Δ༻ͷϙΠϯλ͕


    ҉໧Ͱઌ಄ʹ௥Ճ͞Εɺ


    গ͚ͩ͠αΠζ͕େ͖͘ͳΔɻ
    ΠϯελϯεαΠζͷ૿Ճ
    Ծ૝ؔ਺ͷݺͼग़͠͸vtableܦ༝ͰߦΘΕ
    ΔͨΊɺ͔ᷮʹύϑΥʔϚϯεϩε͕ى͜
    Δɻ͜Ε͸ඇৗʹখ͍͞΋ͷͰ͸͋Δ͕ɺ

    1ϑϨʔϜʹԿઍճ΋ݺͼग़͢ܗʹͳΔͱɺ
    ͙͢ʹΦʔόʔϔου͕ੵΈॏͳΔɻ
    ύϑΥʔϚϯεϩε
    Ծ૝ؔ਺ͷ࢖༻ʹΑͬͯύϑΥʔϚ
    ϯε͕ଛͳΘΕͯ΋ɺͦΕ͕ݪҼͩ
    ͱಥ͖ࢭΊΔͷ͸೉͍͠ɻ


    ࠷ॳ͔ΒϦεΫΛ೦಄ʹஔ͍ͯ࢖͏
    ඞཁ͕͋Δɻ
    ϓϩϑΝΠϦϯάͷ೉қ౓
    vtableʹ͍ͭͯ

    View Slide

  21. ࢀߟࢿྉ
    C++ͰֶͿʂϝϞϦϨΠΞ΢τͱvtableͷ͢ʍΊ ʙಈతϙϦϞϑΟζϜΛ࣮ݱ͢Δ࢓૊Έʙ


    Unity ύϑΥʔϚϯενϡʔχϯά όΠϒϧ


    Memory Management in Unity


    Unity 2021 LTSͰϝϞϦͷ࢖͍ํΛΧελϚΠζ͢Δ


    Unity ͷϝϞϦʢެࣜϦϑΝϨϯεʣ


    ʲUnityʳUnsafeUtilityʹ͍ͭͯవΊͯΈΔ


    UnityͷGC͸ͲΜͳ࣮૷ʹͳ͍ͬͯΔͷ͔


    VIRTUAL, NEW AND OVERRIDE IN C#


    [ࡶه]ଟॏܧঝͰ͖ͳ͍ཧ༝


    ήʔϜΤϯδϯΞʔΩςΫνϟ ୈ3൛

    View Slide

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

    View Slide