‫Cześć i witaj.
‫Na tym wykładzie nauczymy się, w jaki sposób możemy uzyskać wskaźnik do aktu posiadania komponentów.
‫Dowiemy się, czym jest wskaźnik, jakie adresy znajdują się w pamięci
‫i wydrukujemy je również w naszych komunikatach dziennika.
‫Zanurzmy się.
‫Poświęćmy więc chwilę, aby zrozumieć podstawową koncepcję tego, co dzieje się ogólnie w programowaniu
‫o adresach zmiennych.
‫Co to jest adres zmiennej?
‫Cóż, przechowujemy wszystkie nasze zmienne w pamięci, ponieważ na twoim komputerze znajdują się układy pamięci RAM, a zmienne wymagają pamięci
‫do przechowywania swoich danych.
‫Tak więc liczba zmiennoprzecinkowa wymaga albo 32 bitów danych, albo 64, jeśli jest podwójną liczbą całkowitą, wymaga pewnej
‫ilości pamięci.
‫Ponadto im większe masz struktury lub im większe masz klasy, na przykład aktorzy mogą
‫być bardzo duże i obejmować wiele danych, mogą wymagać nawet kilku kilobajtów pamięci na aktora, takie rzeczy.
‫Cóż, ta pamięć musi żyć gdzieś na tym wielkim polu pustych danych, które są twoimi bankami pamięci.
‫A ta lokalizacja jest znana jako adres.
‫Jak to działa w praktyce?
‫Cóż, wyobraź sobie, że mamy to duże pole zer i jedynek.
‫To są dane twojego barana.
‫Cóż, zmienna, zmienna aktora o nazwie mój aktor, musi mieć określoną lokalizację w tej pamięci,
‫która jest przydzielona do przechowywania danych w aktorze.
‫Tak więc ta czerwona sekcja pamięci może być miejscem, w którym
‫przechowujemy dane dla tego konkretnego aktora, i ma ona adres zapisany w postaci binarnej lub szesnastkowej, który zasadniczo jest tylko lokalizacją.
‫Jeśli zaczniesz odliczać wszystkie bajty, wszystkie jedynki i zera, w rzeczywistości nie liczymy poszczególnych zer
‫i jedynek.
‫Liczymy w krokach po osiem, ale to nie jest zbyt ważne.
‫Liczymy bajty.
‫To jest zasadniczo adres, od którego zaczynamy.
‫Mówiąc o naszym aktorze.
‫A potem każdy typ ma określony rozmiar.
‫Wiemy więc, że aktor potrzebowałby tylu bajtów danych.
‫To mówi nam, gdzie znaleźć dane o naszym konkretnym aktorze.
‫Więc dlaczego jest to ważne?
‫Cóż, spójrzmy na sytuację, w której moglibyśmy chcieć zrobić ujęcie.
‫Dwóch aktorów.
‫Mamy tylko dwie zmienne, które odwołują się do tych samych danych.
‫Cóż, w naiwnym przypadku po prostu byśmy to skopiowali.
‫Mamy więc kawałek pamięci przydzielony do zmiennej mój aktor przez inny kawałek pamięci przydzielony do pustej zmiennej
‫zwanej twój aktor, do której jeszcze niczego nie przypisaliśmy.
‫A potem to, co chcemy zrobić, ponieważ chcemy, aby zawierały te same dane, to po prostu przypisać jedno do
‫drugiego.
‫I to zasadniczo powoduje, że po prostu robimy kopię wszystkich bitów danych, które były w moim aktorze i umieszczamy je we
‫wszystkich bitach, które składają się na twojego aktora.
‫Może to być dość kosztowna procedura, ponieważ procesor musi przejść i ocenić każdy element pamięci w
‫oryginale i umieścić go w nowej lokalizacji, co zajmuje czas.
‫Teraz można to obejść za pomocą czegoś zwanego wskaźnikiem.
‫Więc tutaj, zamiast przechowywać całość Mojego aktora, mamy zmienną o nazwie mój aktor lub
‫aktor wskaźnik aktora, który nie przechowuje całego aktora.
‫Po prostu przechowuje adres, pod którym można znaleźć akt.
‫Widać więc, że faktycznie zużywa dużo mniej pamięci do przechowywania adresu.
‫A potem robimy z twoim aktorem, przechowujemy adres mojego aktora, więc kończy się to wskazaniem
‫oryginalnego aktora, a nie kopiowaniem danych, stąd wskaźnik nazwy.
‫To nie jest rzeczywista składnia w C++.
‫W C++ składnia jest znacznie bardziej skondensowana.
‫Mówimy, że coś jest wskaźnikiem, umieszczając gwiazdkę za typem.
‫Tak więc gwiazda aktora oznacza, że jest to wskaźnik aktora, a aby uzyskać adres zmiennej, używamy znaku &, którego
‫nie będziemy używać.
‫Korzystaj jeszcze z tego adresu, ponieważ w nierealnym jest wiele funkcji, które zwracają
‫wskaźniki.
‫Więc musimy tylko wiedzieć, jak wykorzystać te punkty, zamiast tworzyć je na razie.
‫Tak więc jedną z takich funkcji, która pozwala nam uzyskać dostęp do innych obiektów w naszej scenie, jest włączenie.
‫Dlaczego więc ma to zastosowanie, gdy mamy komponent, który jest własnością aktora?
‫Więc jeśli chcemy, aby ten komponent komunikował się z naszym aktorem, aby uzyskać swoją lokalizację, ustawić swoją lokalizację i robić
‫takie rzeczy, to musimy być w stanie uzyskać wskaźnik do tego aktora.
‫Nie chcemy robić kopii tego.
‫W rzeczywistości nie chcemy powiedzieć kopii tego, ponieważ chcemy zmienić aktora.
‫Jeśli wprowadzimy zmianę w kopii, nie pojawiłaby się ona na scenie.
‫Więc musimy być w stanie przechowywać zmienną, która jest wskaźnikiem do aktora.
‫Sposób, w jaki to robimy, jak właśnie widzieliśmy na slajdach, to mieć typ aktora.
‫Ale potem umieszczamy gwiazdkę na końcu, która mówi nam, że nie jest tu przechowywany
‫aktor, to tylko adres zapisanego aktora.
‫Więc bierzemy aktora i nazywamy tego właściciela, a potem ustawiamy to jako równe
‫wynikowi wywołania weź właściciela.
‫Pobierz właściciela jest funkcją składnika aktora, która pozwala uzyskać wskaźnik właściciela, uzyskać wskaźnik aktora,
‫który wskazuje na właściciela, wstawić średnik na końcu tej linii.
‫Mamy tu zmienną przechowującą adres aktora, który jest właścicielem tego konkretnego
‫komponentu.
‫Więc chciałbym wyzwać cię, abyś coś zrobił, drukując adres tej zmiennej.
‫Więc użyj zmiennej aktor i użyj procentu, który formatujesz.
‫Określ koniec dzienników.
‫Tak więc procent oznacza zasadniczo, że używasz liczby całkowitej bez znaku.
‫Oznacza to liczbę całkowitą, która nie może być ujemna, co ma sens, ponieważ adresy nie mogą być
‫ujemne, gdy mówimy o tym, gdzie znaleźć pamięć, a następnie dowiedzieć się, co to wydrukuje, idź grać, zobacz komunikat dziennika,
‫zobacz co to się drukuje.
‫Czy zmienia się to między różnymi grami, jeśli przestaniesz grać i zaczniesz grać ponownie?
‫A co jeśli w filmie jest wielu aktorów?
‫Czy w konsoli wydrukowanych jest wiele różnych adresów?
‫Wstrzymaj wideo i przeprowadź małe śledztwo.
‫Dobra.
‫Witamy spowrotem.
‫Więc przejdziemy do tego innego dziennika i powiemy przenoszący, własny adres, procent dwukropka.
‫Wiesz, właśnie tam będzie to punkt wartościowy.
‫A potem wstawimy właściwy wskaźnik.
‫Więc będziemy mieć tutaj właściciela.
‫Więc wydrukuje adres właściciela.
‫Przejdźmy do nierzeczywistości.
‫Uderza kontrola alt f 11.
‫A kiedy zakończy się kompilacja, włącz odtwarzanie.
‫Widzimy, że komunikat dziennika przenosi adres właściciela i daje nam bardzo
‫dużą liczbę dla tego adresu.
‫Co się stanie, jeśli przestanę grać i zagram jeszcze raz tylko na sekundę?
‫Widać, że adres jest zupełnie inny, a to dlatego, że za każdym razem,
‫gdy zaczynamy grać, Unreal tworzy zupełnie nowy zestaw aktorów na scenie, w zasadzie gotowych do gry, zaczynając od
‫zera.
‫Dlatego za każdym razem, gdy wejdziemy w grę, widzimy nowe adresy.
‫Co się stanie, jeśli na przykład wejdę do tego filaru i dodałem ruch, komponent do filaru, a następnie wcisnę odtwarzanie
‫i przewiniemy na sam dół moich dzienników.
‫Możesz zobaczyć, że każdy zaznacza dwa różne adresy, które są tutaj drukowane, ponieważ są dwaj
‫różni aktorzy, którzy są przechowywani w dwóch różnych lokalizacjach w pamięci.
‫Więc to są te dwa adresy i widać, że w rzeczywistości jest
‫sporo megabajtów różnicy między tymi dwoma adresami, co po prostu mówi ci, ile informacji jest przechowywanych
‫w pamięci przez Unreal, a także dlaczego ważne jest, aby być wydajnym bez tworzenia za dużo kopii.
‫To tyle na ten wykład.
‫Do zobaczenia.
‫Następnym będzie robienie ciekawszych rzeczy ze wskaźnikami.