﻿1
00:00:04,350 --> 00:00:05,430
‫Cześć i witaj.

2
00:00:05,430 --> 00:00:12,630
‫Na tym wykładzie nauczymy się, w jaki sposób możemy uzyskać wskaźnik do aktu posiadania komponentów.

3
00:00:12,840 --> 00:00:16,680
‫Dowiemy się, czym jest wskaźnik, jakie adresy znajdują się w pamięci

4
00:00:16,680 --> 00:00:19,560
‫i wydrukujemy je również w naszych komunikatach dziennika.

5
00:00:19,710 --> 00:00:20,370
‫Zanurzmy się.

6
00:00:21,150 --> 00:00:27,570
‫Poświęćmy więc chwilę, aby zrozumieć podstawową koncepcję tego, co dzieje się ogólnie w programowaniu

7
00:00:27,570 --> 00:00:29,100
‫o adresach zmiennych.

8
00:00:29,100 --> 00:00:30,750
‫Co to jest adres zmiennej?

9
00:00:30,750 --> 00:00:41,280
‫Cóż, przechowujemy wszystkie nasze zmienne w pamięci, ponieważ na twoim komputerze znajdują się układy pamięci RAM, a zmienne wymagają pamięci

10
00:00:41,280 --> 00:00:43,890
‫do przechowywania swoich danych.

11
00:00:43,890 --> 00:00:51,790
‫Tak więc liczba zmiennoprzecinkowa wymaga albo 32 bitów danych, albo 64, jeśli jest podwójną liczbą całkowitą, wymaga pewnej

12
00:00:51,790 --> 00:00:52,680
‫ilości pamięci.

13
00:00:52,680 --> 00:00:58,080
‫Ponadto im większe masz struktury lub im większe masz klasy, na przykład aktorzy mogą

14
00:00:58,080 --> 00:01:03,960
‫być bardzo duże i obejmować wiele danych, mogą wymagać nawet kilku kilobajtów pamięci na aktora, takie rzeczy.

15
00:01:04,620 --> 00:01:12,270
‫Cóż, ta pamięć musi żyć gdzieś na tym wielkim polu pustych danych, które są twoimi bankami pamięci.

16
00:01:12,750 --> 00:01:16,290
‫A ta lokalizacja jest znana jako adres.

17
00:01:16,440 --> 00:01:18,180
‫Jak to działa w praktyce?

18
00:01:18,540 --> 00:01:21,840
‫Cóż, wyobraź sobie, że mamy to duże pole zer i jedynek.

19
00:01:21,840 --> 00:01:24,900
‫To są dane twojego barana.

20
00:01:25,410 --> 00:01:32,550
‫Cóż, zmienna, zmienna aktora o nazwie mój aktor, musi mieć określoną lokalizację w tej pamięci,

21
00:01:32,550 --> 00:01:36,900
‫która jest przydzielona do przechowywania danych w aktorze.

22
00:01:37,260 --> 00:01:42,030
‫Tak więc ta czerwona sekcja pamięci może być miejscem, w którym

23
00:01:42,420 --> 00:01:50,580
‫przechowujemy dane dla tego konkretnego aktora, i ma ona adres zapisany w postaci binarnej lub szesnastkowej, który zasadniczo jest tylko lokalizacją.

24
00:01:50,580 --> 00:01:57,780
‫Jeśli zaczniesz odliczać wszystkie bajty, wszystkie jedynki i zera, w rzeczywistości nie liczymy poszczególnych zer

25
00:01:57,780 --> 00:01:59,160
‫i jedynek.

26
00:01:59,160 --> 00:02:03,300
‫Liczymy w krokach po osiem, ale to nie jest zbyt ważne.

27
00:02:03,300 --> 00:02:04,170
‫Liczymy bajty.

28
00:02:04,680 --> 00:02:07,770
‫To jest zasadniczo adres, od którego zaczynamy.

29
00:02:08,780 --> 00:02:10,880
‫Mówiąc o naszym aktorze.

30
00:02:11,090 --> 00:02:14,150
‫A potem każdy typ ma określony rozmiar.

31
00:02:14,150 --> 00:02:17,960
‫Wiemy więc, że aktor potrzebowałby tylu bajtów danych.

32
00:02:17,960 --> 00:02:22,940
‫To mówi nam, gdzie znaleźć dane o naszym konkretnym aktorze.

33
00:02:23,450 --> 00:02:24,830
‫Więc dlaczego jest to ważne?

34
00:02:24,860 --> 00:02:29,360
‫Cóż, spójrzmy na sytuację, w której moglibyśmy chcieć zrobić ujęcie.

35
00:02:29,720 --> 00:02:30,650
‫Dwóch aktorów.

36
00:02:30,650 --> 00:02:34,070
‫Mamy tylko dwie zmienne, które odwołują się do tych samych danych.

37
00:02:34,640 --> 00:02:38,200
‫Cóż, w naiwnym przypadku po prostu byśmy to skopiowali.

38
00:02:38,200 --> 00:02:46,820
‫Mamy więc kawałek pamięci przydzielony do zmiennej mój aktor przez inny kawałek pamięci przydzielony do pustej zmiennej

39
00:02:46,820 --> 00:02:52,040
‫zwanej twój aktor, do której jeszcze niczego nie przypisaliśmy.

40
00:02:52,640 --> 00:02:59,000
‫A potem to, co chcemy zrobić, ponieważ chcemy, aby zawierały te same dane, to po prostu przypisać jedno do

41
00:02:59,000 --> 00:02:59,450
‫drugiego.

42
00:02:59,720 --> 00:03:07,010
‫I to zasadniczo powoduje, że po prostu robimy kopię wszystkich bitów danych, które były w moim aktorze i umieszczamy je we

43
00:03:07,010 --> 00:03:10,190
‫wszystkich bitach, które składają się na twojego aktora.

44
00:03:10,820 --> 00:03:17,930
‫Może to być dość kosztowna procedura, ponieważ procesor musi przejść i ocenić każdy element pamięci w

45
00:03:17,930 --> 00:03:22,550
‫oryginale i umieścić go w nowej lokalizacji, co zajmuje czas.

46
00:03:22,670 --> 00:03:25,750
‫Teraz można to obejść za pomocą czegoś zwanego wskaźnikiem.

47
00:03:25,760 --> 00:03:33,470
‫Więc tutaj, zamiast przechowywać całość Mojego aktora, mamy zmienną o nazwie mój aktor lub

48
00:03:33,470 --> 00:03:38,770
‫aktor wskaźnik aktora, który nie przechowuje całego aktora.

49
00:03:38,780 --> 00:03:42,100
‫Po prostu przechowuje adres, pod którym można znaleźć akt.

50
00:03:42,110 --> 00:03:46,520
‫Widać więc, że faktycznie zużywa dużo mniej pamięci do przechowywania adresu.

51
00:03:46,520 --> 00:03:53,930
‫A potem robimy z twoim aktorem, przechowujemy adres mojego aktora, więc kończy się to wskazaniem

52
00:03:54,260 --> 00:03:58,880
‫oryginalnego aktora, a nie kopiowaniem danych, stąd wskaźnik nazwy.

53
00:03:59,360 --> 00:04:01,820
‫To nie jest rzeczywista składnia w C++.

54
00:04:01,820 --> 00:04:04,130
‫W C++ składnia jest znacznie bardziej skondensowana.

55
00:04:04,640 --> 00:04:09,610
‫Mówimy, że coś jest wskaźnikiem, umieszczając gwiazdkę za typem.

56
00:04:09,620 --> 00:04:17,930
‫Tak więc gwiazda aktora oznacza, że jest to wskaźnik aktora, a aby uzyskać adres zmiennej, używamy znaku &, którego

57
00:04:17,930 --> 00:04:19,670
‫nie będziemy używać.

58
00:04:19,670 --> 00:04:24,680
‫Korzystaj jeszcze z tego adresu, ponieważ w nierealnym jest wiele funkcji, które zwracają

59
00:04:24,680 --> 00:04:25,190
‫wskaźniki.

60
00:04:25,190 --> 00:04:30,860
‫Więc musimy tylko wiedzieć, jak wykorzystać te punkty, zamiast tworzyć je na razie.

61
00:04:31,730 --> 00:04:40,060
‫Tak więc jedną z takich funkcji, która pozwala nam uzyskać dostęp do innych obiektów w naszej scenie, jest włączenie.

62
00:04:40,070 --> 00:04:46,310
‫Dlaczego więc ma to zastosowanie, gdy mamy komponent, który jest własnością aktora?

63
00:04:46,490 --> 00:04:53,600
‫Więc jeśli chcemy, aby ten komponent komunikował się z naszym aktorem, aby uzyskać swoją lokalizację, ustawić swoją lokalizację i robić

64
00:04:53,600 --> 00:04:58,370
‫takie rzeczy, to musimy być w stanie uzyskać wskaźnik do tego aktora.

65
00:04:58,370 --> 00:04:59,780
‫Nie chcemy robić kopii tego.

66
00:05:00,020 --> 00:05:03,290
‫W rzeczywistości nie chcemy powiedzieć kopii tego, ponieważ chcemy zmienić aktora.

67
00:05:03,290 --> 00:05:06,950
‫Jeśli wprowadzimy zmianę w kopii, nie pojawiłaby się ona na scenie.

68
00:05:07,430 --> 00:05:13,640
‫Więc musimy być w stanie przechowywać zmienną, która jest wskaźnikiem do aktora.

69
00:05:14,330 --> 00:05:19,580
‫Sposób, w jaki to robimy, jak właśnie widzieliśmy na slajdach, to mieć typ aktora.

70
00:05:19,760 --> 00:05:25,940
‫Ale potem umieszczamy gwiazdkę na końcu, która mówi nam, że nie jest tu przechowywany

71
00:05:25,940 --> 00:05:28,670
‫aktor, to tylko adres zapisanego aktora.

72
00:05:29,240 --> 00:05:36,530
‫Więc bierzemy aktora i nazywamy tego właściciela, a potem ustawiamy to jako równe

73
00:05:36,530 --> 00:05:39,080
‫wynikowi wywołania weź właściciela.

74
00:05:39,080 --> 00:05:47,010
‫Pobierz właściciela jest funkcją składnika aktora, która pozwala uzyskać wskaźnik właściciela, uzyskać wskaźnik aktora,

75
00:05:47,030 --> 00:05:53,480
‫który wskazuje na właściciela, wstawić średnik na końcu tej linii.

76
00:05:53,720 --> 00:06:00,740
‫Mamy tu zmienną przechowującą adres aktora, który jest właścicielem tego konkretnego

77
00:06:00,740 --> 00:06:01,400
‫komponentu.

78
00:06:01,760 --> 00:06:07,550
‫Więc chciałbym wyzwać cię, abyś coś zrobił, drukując adres tej zmiennej.

79
00:06:07,550 --> 00:06:12,530
‫Więc użyj zmiennej aktor i użyj procentu, który formatujesz.

80
00:06:12,590 --> 00:06:14,690
‫Określ koniec dzienników.

81
00:06:14,690 --> 00:06:19,490
‫Tak więc procent oznacza zasadniczo, że używasz liczby całkowitej bez znaku.

82
00:06:19,490 --> 00:06:24,980
‫Oznacza to liczbę całkowitą, która nie może być ujemna, co ma sens, ponieważ adresy nie mogą być

83
00:06:25,790 --> 00:06:32,060
‫ujemne, gdy mówimy o tym, gdzie znaleźć pamięć, a następnie dowiedzieć się, co to wydrukuje, idź grać, zobacz komunikat dziennika,

84
00:06:32,060 --> 00:06:33,710
‫zobacz co to się drukuje.

85
00:06:34,190 --> 00:06:37,760
‫Czy zmienia się to między różnymi grami, jeśli przestaniesz grać i zaczniesz grać ponownie?

86
00:06:38,090 --> 00:06:41,720
‫A co jeśli w filmie jest wielu aktorów?

87
00:06:41,900 --> 00:06:45,650
‫Czy w konsoli wydrukowanych jest wiele różnych adresów?

88
00:06:45,650 --> 00:06:48,380
‫Wstrzymaj wideo i przeprowadź małe śledztwo.

89
00:06:51,940 --> 00:06:52,360
‫Dobra.

90
00:06:52,360 --> 00:06:53,050
‫Witamy spowrotem.

91
00:06:53,500 --> 00:07:03,370
‫Więc przejdziemy do tego innego dziennika i powiemy przenoszący, własny adres, procent dwukropka.

92
00:07:03,400 --> 00:07:07,270
‫Wiesz, właśnie tam będzie to punkt wartościowy.

93
00:07:07,990 --> 00:07:10,150
‫A potem wstawimy właściwy wskaźnik.

94
00:07:10,150 --> 00:07:12,160
‫Więc będziemy mieć tutaj właściciela.

95
00:07:12,940 --> 00:07:16,120
‫Więc wydrukuje adres właściciela.

96
00:07:16,540 --> 00:07:18,970
‫Przejdźmy do nierzeczywistości.

97
00:07:19,180 --> 00:07:21,670
‫Uderza kontrola alt f 11.

98
00:07:21,940 --> 00:07:24,550
‫A kiedy zakończy się kompilacja, włącz odtwarzanie.

99
00:07:24,550 --> 00:07:29,680
‫Widzimy, że komunikat dziennika przenosi adres właściciela i daje nam bardzo

100
00:07:29,680 --> 00:07:32,050
‫dużą liczbę dla tego adresu.

101
00:07:32,440 --> 00:07:36,250
‫Co się stanie, jeśli przestanę grać i zagram jeszcze raz tylko na sekundę?

102
00:07:36,490 --> 00:07:42,700
‫Widać, że adres jest zupełnie inny, a to dlatego, że za każdym razem,

103
00:07:43,180 --> 00:07:51,250
‫gdy zaczynamy grać, Unreal tworzy zupełnie nowy zestaw aktorów na scenie, w zasadzie gotowych do gry, zaczynając od

104
00:07:51,250 --> 00:07:51,810
‫zera.

105
00:07:51,820 --> 00:07:57,160
‫Dlatego za każdym razem, gdy wejdziemy w grę, widzimy nowe adresy.

106
00:07:57,190 --> 00:08:04,900
‫Co się stanie, jeśli na przykład wejdę do tego filaru i dodałem ruch, komponent do filaru, a następnie wcisnę odtwarzanie

107
00:08:04,900 --> 00:08:07,990
‫i przewiniemy na sam dół moich dzienników.

108
00:08:07,990 --> 00:08:15,220
‫Możesz zobaczyć, że każdy zaznacza dwa różne adresy, które są tutaj drukowane, ponieważ są dwaj

109
00:08:15,220 --> 00:08:20,680
‫różni aktorzy, którzy są przechowywani w dwóch różnych lokalizacjach w pamięci.

110
00:08:21,010 --> 00:08:25,930
‫Więc to są te dwa adresy i widać, że w rzeczywistości jest

111
00:08:25,930 --> 00:08:31,660
‫sporo megabajtów różnicy między tymi dwoma adresami, co po prostu mówi ci, ile informacji jest przechowywanych

112
00:08:31,870 --> 00:08:38,040
‫w pamięci przez Unreal, a także dlaczego ważne jest, aby być wydajnym bez tworzenia za dużo kopii.

113
00:08:38,350 --> 00:08:39,490
‫To tyle na ten wykład.

114
00:08:39,760 --> 00:08:40,840
‫Do zobaczenia.

115
00:08:40,840 --> 00:08:43,330
‫Następnym będzie robienie ciekawszych rzeczy ze wskaźnikami.

