﻿1
00:00:04,350 --> 00:00:05,430
‫Ciao e Benvenuto.

2
00:00:05,430 --> 00:00:12,630
‫In questa lezione impareremo come ottenere un'indicazione sull'atto di possedere un componente.

3
00:00:12,840 --> 00:00:16,680
‫Scopriremo cos'è un puntatore, quali indirizzi sono in memoria e li

4
00:00:16,680 --> 00:00:19,560
‫stamperemo anche nei nostri messaggi di registro.

5
00:00:19,710 --> 00:00:20,370
‫Immergiamoci.

6
00:00:21,150 --> 00:00:27,570
‫Quindi prendiamoci un secondo per capire un concetto fondamentale di cosa sta succedendo nella programmazione in generale

7
00:00:27,570 --> 00:00:29,100
‫sugli indirizzi delle variabili.

8
00:00:29,100 --> 00:00:30,750
‫Che cos'è un indirizzo di una variabile?

9
00:00:30,750 --> 00:00:41,280
‫Bene, memorizziamo tutte le nostre variabili in memoria in quanto ci sono chip ram sul tuo computer e le variabili richiedono memoria

10
00:00:41,280 --> 00:00:43,890
‫per archiviare i loro dati.

11
00:00:43,890 --> 00:00:51,790
‫Quindi un numero in virgola mobile richiede 32 bit di dati o 64, se è un intero doppio, richiede una certa quantità

12
00:00:51,790 --> 00:00:52,680
‫di memoria.

13
00:00:52,680 --> 00:00:58,080
‫Inoltre, più grandi sono le strutture che hai o più grandi sono le classi che hai, ad esempio gli

14
00:00:58,080 --> 00:01:03,600
‫attori possono essere molto grandi e comprendere molti dati potrebbero richiedere anche pochi kilobyte di memoria per attore, cose del

15
00:01:03,600 --> 00:01:03,960
‫genere.

16
00:01:04,620 --> 00:01:12,270
‫Bene, quella memoria deve vivere da qualche parte in questo grande campo di dati vuoti che sono i tuoi banchi di memoria.

17
00:01:12,750 --> 00:01:16,290
‫E quella posizione è conosciuta come un indirizzo.

18
00:01:16,440 --> 00:01:18,180
‫Quindi come funziona in pratica?

19
00:01:18,540 --> 00:01:21,840
‫Bene, immagina di avere questo grande campo di zeri e uno.

20
00:01:21,840 --> 00:01:24,900
‫Questi sono i dati sulla tua ram.

21
00:01:25,410 --> 00:01:32,550
‫Bene, allora la variabile, una variabile attore chiamata il mio attore, deve avere una certa posizione all'interno di

22
00:01:32,550 --> 00:01:36,900
‫quella memoria che è allocata per memorizzare i dati nell'attore.

23
00:01:37,260 --> 00:01:42,030
‫Quindi questa sezione rossa della memoria potrebbe essere il punto in cui

24
00:01:42,420 --> 00:01:50,580
‫memorizziamo i dati per questo particolare attore e ha un indirizzo solitamente indicato in binario o esadecimale che è essenzialmente solo la posizione.

25
00:01:50,580 --> 00:01:57,780
‫Se inizi a contare tutti i byte, tutti gli uno e gli zeri qui, infatti, in realtà non contiamo i singoli

26
00:01:57,780 --> 00:01:59,160
‫uno e zeri.

27
00:01:59,160 --> 00:02:03,300
‫Contiamo a passi da otto, ma non è troppo importante.

28
00:02:03,300 --> 00:02:04,170
‫Contiamo i byte.

29
00:02:04,680 --> 00:02:07,770
‫Questo è essenzialmente l'indirizzo da cui iniziamo.

30
00:02:08,780 --> 00:02:10,880
‫Parliamo del nostro attore.

31
00:02:11,090 --> 00:02:14,150
‫E poi ogni tipo ha una certa dimensione.

32
00:02:14,150 --> 00:02:17,960
‫Quindi sappiamo che l'attore richiederebbe così tanti byte di dati.

33
00:02:17,960 --> 00:02:22,940
‫E quindi questo ci dice dove trovare i dati sul nostro particolare attore.

34
00:02:23,450 --> 00:02:24,830
‫Quindi perchè è importante?

35
00:02:24,860 --> 00:02:29,360
‫Bene, diamo un'occhiata alla situazione in cui potremmo voler fare una prova.

36
00:02:29,720 --> 00:02:30,650
‫Due attori.

37
00:02:30,650 --> 00:02:34,070
‫Abbiamo solo due variabili che fanno riferimento agli stessi dati.

38
00:02:34,640 --> 00:02:38,200
‫Bene, nel caso ingenuo, dovremmo semplicemente copiare questo.

39
00:02:38,200 --> 00:02:46,820
‫Quindi abbiamo un pezzo di memoria che è allocato alla variabile my attore da un altro pezzo di memoria che è allocato a

40
00:02:46,820 --> 00:02:52,040
‫una variabile vuota chiamata tuo attore, a cui non abbiamo ancora assegnato nulla.

41
00:02:52,640 --> 00:02:59,000
‫E poi quello che vogliamo fare perché vogliamo che contengano gli stessi dati, è semplicemente assegnarli l'uno

42
00:02:59,000 --> 00:02:59,450
‫all'altro.

43
00:02:59,720 --> 00:03:07,010
‫E questo si traduce essenzialmente in noi che facciamo una copia di tutti i bit di dati che erano nel mio attore e li

44
00:03:07,010 --> 00:03:10,190
‫mettiamo in tutti i bit che compongono il tuo attore.

45
00:03:10,820 --> 00:03:17,930
‫Quindi questa può essere una procedura abbastanza costosa perché la tua CPU deve esaminare e valutare ogni pezzo di

46
00:03:17,930 --> 00:03:22,550
‫memoria nell'originale e metterlo nella nuova posizione, il che richiede tempo.

47
00:03:22,670 --> 00:03:25,750
‫Ora c'è un modo per aggirare questo usando qualcosa chiamato puntatore.

48
00:03:25,760 --> 00:03:33,470
‫Quindi qui, invece di memorizzare l'intero My Actor, abbiamo una variabile chiamata my attore o

49
00:03:33,470 --> 00:03:38,770
‫attore un puntatore attore che non memorizza l'intero attore.

50
00:03:38,780 --> 00:03:42,100
‫Memorizza solo l'indirizzo dove puoi trovare un atto.

51
00:03:42,110 --> 00:03:46,520
‫Quindi puoi vedere che in realtà utilizza molta meno memoria per memorizzare un indirizzo.

52
00:03:46,520 --> 00:03:53,930
‫E poi quello che facciamo è nel tuo attore, memorizziamo l'indirizzo del mio attore, quindi finisce per puntare all'attore originale

53
00:03:54,260 --> 00:03:58,880
‫piuttosto che copiare i dati, da cui il puntatore del nome.

54
00:03:59,360 --> 00:04:01,820
‫Ora questa non è la sintassi effettiva in C++.

55
00:04:01,820 --> 00:04:04,130
‫In C++, la sintassi è molto più condensata.

56
00:04:04,640 --> 00:04:09,610
‫Diciamo che qualcosa è un puntatore mettendo una stella dopo il tipo.

57
00:04:09,620 --> 00:04:17,930
‫Quindi una star dell'attore significa che questo è un puntatore dell'attore e per ottenere l'indirizzo di una variabile, usiamo una e

58
00:04:17,930 --> 00:04:19,670
‫commerciale che non useremo.

59
00:04:19,670 --> 00:04:24,680
‫Fai ancora molto uso di questo indirizzo perché ci sono molte funzioni in unreal che restituiscono

60
00:04:24,680 --> 00:04:25,190
‫puntatori.

61
00:04:25,190 --> 00:04:30,860
‫Quindi dobbiamo solo sapere come utilizzare quei punti piuttosto che crearli per il momento.

62
00:04:31,730 --> 00:04:40,060
‫Quindi una di queste funzioni che ci consente di accedere ad altri oggetti nella nostra scena è ottenere ona.

63
00:04:40,070 --> 00:04:46,310
‫Allora perché questo si applica quando abbiamo un componente di proprietà di un attore?

64
00:04:46,490 --> 00:04:53,600
‫Quindi, se volevamo che questo componente parlasse con il nostro attore, per ottenere la sua posizione, per impostare la sua posizione e fare

65
00:04:53,600 --> 00:04:58,370
‫cose del genere, allora dobbiamo essere in grado di ottenere un suggerimento per quell'attore.

66
00:04:58,370 --> 00:04:59,780
‫Non vogliamo prenderne una copia.

67
00:05:00,020 --> 00:05:03,290
‫In effetti, non vogliamo dirne una copia perché vogliamo cambiare l'attore.

68
00:05:03,290 --> 00:05:06,950
‫Se stiamo apportando una modifica a una copia, in realtà non verrebbe visualizzata nella scena.

69
00:05:07,430 --> 00:05:13,640
‫Quindi dobbiamo essere in grado di memorizzare una variabile che sia un puntatore a un attore.

70
00:05:14,330 --> 00:05:19,580
‫Il modo in cui lo facciamo, come abbiamo appena visto nelle diapositive, è avere un tipo di attore.

71
00:05:19,760 --> 00:05:25,940
‫Ma poi mettiamo una stella alla fine che ci dice che questo non è un attore che viene archiviato qui, questo

72
00:05:25,940 --> 00:05:28,670
‫è solo l'indirizzo di un attore che viene archiviato.

73
00:05:29,240 --> 00:05:36,530
‫Quindi prendiamo l'attore e chiameremo questo proprietario, quindi lo imposteremo uguale al risultato

74
00:05:36,530 --> 00:05:39,080
‫della chiamata get owner.

75
00:05:39,080 --> 00:05:47,010
‫Quindi ottenere proprietario è una funzione di un componente attore che ti consente di ottenere un puntatore proprietario, ottenere un

76
00:05:47,030 --> 00:05:53,480
‫puntatore attore che punta al proprietario, mettere un punto e virgola alla fine di quella riga.

77
00:05:53,720 --> 00:06:00,740
‫E quello che abbiamo qui è una variabile che memorizza l'indirizzo di un attore che possiede questo particolare

78
00:06:00,740 --> 00:06:01,400
‫componente.

79
00:06:01,760 --> 00:06:07,550
‫Quindi vorrei sfidarti a fare qualcosa stampando l'indirizzo di questa variabile.

80
00:06:07,550 --> 00:06:12,530
‫Quindi usa la variabile attore e usa la percentuale che formatti.

81
00:06:12,590 --> 00:06:14,690
‫Specificare la fine dei log.

82
00:06:14,690 --> 00:06:19,490
‫Quindi percento significa essenzialmente che stai usando un numero intero senza segno.

83
00:06:19,490 --> 00:06:24,980
‫Ciò significa un numero intero che non può essere negativo, il che ha senso perché gli indirizzi non

84
00:06:25,790 --> 00:06:32,060
‫possono essere negativi quando parliamo di dove trovare la memoria e poi scopri cosa stampa, vai a giocare, guarda il messaggio di

85
00:06:32,060 --> 00:06:33,710
‫registro, guarda cosa si stampa.

86
00:06:34,190 --> 00:06:37,760
‫Cambia tra le diverse riproduzioni se smetti di giocare e ricominci a giocare?

87
00:06:38,090 --> 00:06:41,720
‫E se il film fosse su più attori?

88
00:06:41,900 --> 00:06:45,650
‫Nella console sono stampati più indirizzi diversi?

89
00:06:45,650 --> 00:06:48,380
‫Metti in pausa il video e fai una piccola indagine.

90
00:06:51,940 --> 00:06:52,360
‫Bene.

91
00:06:52,360 --> 00:06:53,050
‫Ben tornato.

92
00:06:53,500 --> 00:07:03,370
‫Quindi andremo su quest'altro registro e diremo traslocatore, proprio indirizzo, due punti percentuali.

93
00:07:03,400 --> 00:07:07,270
‫Sai, è qui che metterà il punto di valore.

94
00:07:07,990 --> 00:07:10,150
‫E poi metteremo il puntatore vero e proprio.

95
00:07:10,150 --> 00:07:12,160
‫Quindi avremo il proprietario qui dentro.

96
00:07:12,940 --> 00:07:16,120
‫Quindi stamperà l'indirizzo del proprietario.

97
00:07:16,540 --> 00:07:18,970
‫Entriamo nell'irreale.

98
00:07:19,180 --> 00:07:21,670
‫Colpi control alt f 11.

99
00:07:21,940 --> 00:07:24,550
‫E quando finisce di compilare, premiamo play.

100
00:07:24,550 --> 00:07:29,680
‫E quello che stiamo vedendo è che il messaggio di registro sposta l'indirizzo del proprietario sta arrivando e ci sta

101
00:07:29,680 --> 00:07:32,050
‫dando un numero molto grande per questo indirizzo.

102
00:07:32,440 --> 00:07:36,250
‫Cosa succede se smetto di giocare e gioco di nuovo solo per un secondo?

103
00:07:36,490 --> 00:07:42,700
‫Puoi vedere che l'indirizzo è sostanzialmente diverso e questo perché ogni volta che

104
00:07:43,180 --> 00:07:51,250
‫colpiamo play, Unreal crea un set completamente nuovo di attori nella scena, praticamente pronti per recitare, partendo da

105
00:07:51,250 --> 00:07:51,810
‫zero.

106
00:07:51,820 --> 00:07:57,160
‫Ecco perché vediamo nuove posizioni di indirizzi ogni volta che premiamo Play.

107
00:07:57,190 --> 00:08:04,900
‫Cosa succede se vado su questo pilastro, ad esempio, e aggiungo una mossa, anche un componente al pilastro, e premiamo play e scorriamo

108
00:08:04,900 --> 00:08:07,990
‫verso il basso fino alla fine dei miei registri.

109
00:08:07,990 --> 00:08:15,220
‫Puoi vedere che in ogni segno di spunta vengono stampati due indirizzi diversi qui perché ci sono

110
00:08:15,220 --> 00:08:20,680
‫due attori diversi che sono memorizzati in due posizioni diverse nella memoria.

111
00:08:21,010 --> 00:08:25,930
‫Quindi questi sono i due indirizzi e puoi vedere che in realtà ci

112
00:08:25,930 --> 00:08:31,660
‫sono alcuni megabyte di differenza tra questi due indirizzi, il che ti dice solo quante informazioni

113
00:08:31,870 --> 00:08:38,040
‫vengono archiviate in memoria da Unreal e anche perché è importante essere efficienti nel non fare troppe copie.

114
00:08:38,350 --> 00:08:39,490
‫Questo è tutto per questa lezione.

115
00:08:39,760 --> 00:08:40,840
‫Ci vediamo dentro.

116
00:08:40,840 --> 00:08:43,330
‫Il prossimo farà cose più divertenti con i puntatori.

