﻿1
00:00:04,290 --> 00:00:05,490
‫Xin chào và chào mừng.

2
00:00:05,490 --> 00:00:12,810
‫Trong bài giảng này, chúng ta sẽ học cách chúng ta có thể lấy một con trỏ đến tác nhân sở hữu của một thành phần.

3
00:00:12,810 --> 00:00:16,740
‫Chúng ta sẽ tìm hiểu con trỏ là gì, địa chỉ nào nằm trong bộ nhớ và chúng ta

4
00:00:16,740 --> 00:00:19,740
‫cũng sẽ in chúng ra thành các thông điệp nhật ký của chúng ta.

5
00:00:19,740 --> 00:00:20,640
‫Hãy đi sâu vào.

6
00:00:21,090 --> 00:00:27,660
‫Vì vậy, hãy dành một chút thời gian để hiểu khái niệm cốt lõi về những gì đang diễn ra trong lập trình nói

7
00:00:27,660 --> 00:00:29,130
‫chung về địa chỉ biến.

8
00:00:29,130 --> 00:00:30,810
‫Địa chỉ của một biến là gì?

9
00:00:30,810 --> 00:00:42,030
‫Chà, chúng tôi lưu trữ tất cả các biến của chúng tôi trong bộ nhớ trong chip ram này trên máy tính của bạn và các biến yêu cầu bộ nhớ để lưu

10
00:00:42,030 --> 00:00:43,920
‫trữ dữ liệu của chúng.

11
00:00:43,920 --> 00:00:51,840
‫Vì vậy, một số dấu phẩy động yêu cầu 32 bit dữ liệu hoặc 64, nếu là số nguyên kép, yêu cầu một lượng bộ nhớ

12
00:00:51,840 --> 00:00:52,740
‫nhất định.

13
00:00:52,740 --> 00:00:58,440
‫Ngoài ra, cấu trúc bạn có càng lớn hoặc các lớp bạn có càng lớn, chẳng hạn như các tác nhân có thể rất lớn

14
00:00:58,440 --> 00:01:04,230
‫và bao gồm nhiều dữ liệu có thể yêu cầu thậm chí vài kilobyte bộ nhớ cho mỗi tác nhân, những thứ tương tự như vậy.

15
00:01:04,590 --> 00:01:12,510
‫Chà, bộ nhớ đó phải tồn tại ở đâu đó trên một vùng dữ liệu trống rộng lớn là ngân hàng bộ nhớ của bạn.

16
00:01:12,660 --> 00:01:16,410
‫Và vị trí đó được biết đến như một địa chỉ.

17
00:01:16,410 --> 00:01:18,420
‫Vậy điều này hoạt động như thế nào trong thực tế?

18
00:01:18,420 --> 00:01:21,870
‫Hãy tưởng tượng chúng ta có một trường lớn gồm các số không và các số một.

19
00:01:21,870 --> 00:01:25,140
‫Đó là dữ liệu trên ram của bạn.

20
00:01:25,320 --> 00:01:32,580
‫Vậy thì biến và một biến tác nhân được gọi là Diễn viên của tôi cần phải có một vị trí nhất định trong

21
00:01:32,580 --> 00:01:37,110
‫bộ nhớ đó được cấp phát để lưu trữ dữ liệu trong tác nhân.

22
00:01:37,110 --> 00:01:42,300
‫Vì vậy, phần bộ nhớ màu đỏ này có thể là nơi chúng tôi lưu trữ dữ liệu

23
00:01:42,300 --> 00:01:50,610
‫cho một tác nhân cụ thể này và nó có địa chỉ thường được biểu thị bằng nhị phân hoặc thập lục phân, về cơ bản chỉ là vị trí.

24
00:01:50,610 --> 00:01:57,840
‫Nếu bạn bắt đầu đếm tất cả các byte, tất cả các byte và số không ở đây, thì trên thực tế, chúng tôi không thực sự đếm từng

25
00:01:57,840 --> 00:01:59,220
‫số một và số không.

26
00:01:59,220 --> 00:02:03,360
‫Chúng tôi tính theo tám bước, nhưng điều đó không quá quan trọng.

27
00:02:03,360 --> 00:02:04,410
‫Chúng tôi đếm từng byte.

28
00:02:04,620 --> 00:02:08,070
‫Đó thực chất là địa chỉ nơi chúng ta bắt đầu.

29
00:02:08,810 --> 00:02:14,180
‫Nói về diễn viên của chúng tôi, và sau đó mỗi loại có một kích thước nhất định.

30
00:02:14,180 --> 00:02:18,020
‫Vì vậy, chúng tôi biết rằng tác nhân sẽ yêu cầu rất nhiều byte dữ liệu.

31
00:02:18,020 --> 00:02:23,240
‫Và điều đó cho chúng ta biết nơi tìm dữ liệu về tác nhân cụ thể của chúng ta.

32
00:02:23,360 --> 00:02:24,880
‫Vì vậy, tại sao điều này lại quan trọng?

33
00:02:24,890 --> 00:02:30,680
‫Chà, chúng ta hãy xem xét tình huống mà chúng ta có thể muốn tìm diễn viên.

34
00:02:30,680 --> 00:02:34,340
‫Chúng tôi muốn có hai biến tham chiếu cùng một dữ liệu.

35
00:02:34,520 --> 00:02:38,240
‫Chà, trong trường hợp ngây thơ, chúng tôi chỉ cần sao chép điều này.

36
00:02:38,240 --> 00:02:44,360
‫Vì vậy, chúng tôi có một phần bộ nhớ được phân bổ cho biến tác nhân của tôi.

37
00:02:44,510 --> 00:02:50,030
‫Chúng tôi có một phần bộ nhớ khác được phân bổ cho một biến trống có tên là Your Actor, mà chúng

38
00:02:50,030 --> 00:02:52,280
‫tôi chưa gán bất cứ thứ gì cho.

39
00:02:52,550 --> 00:02:59,060
‫Và sau đó những gì chúng ta muốn làm vì chúng ta muốn chúng chứa cùng một dữ liệu, là chúng ta chỉ định cái này cho

40
00:02:59,060 --> 00:02:59,690
‫cái kia.

41
00:02:59,690 --> 00:03:07,070
‫Và điều đó về cơ bản dẫn đến việc chúng tôi chỉ tạo một bản sao của tất cả các bit dữ liệu có trong tác nhân của tôi và

42
00:03:07,070 --> 00:03:10,400
‫đưa chúng vào tất cả các bit tạo nên tác nhân của bạn.

43
00:03:10,730 --> 00:03:17,990
‫Vì vậy, đây có thể là một thủ tục khá tốn kém vì CPU của bạn phải xem xét và đánh giá từng phần bộ

44
00:03:17,990 --> 00:03:22,680
‫nhớ trong bản gốc và đặt nó vào vị trí mới, điều này mất thời gian.

45
00:03:22,700 --> 00:03:25,760
‫Bây giờ có một cách để giải quyết vấn đề này bằng cách sử dụng một thứ gọi là con trỏ.

46
00:03:25,760 --> 00:03:33,530
‫Vì vậy, ở đây, thay vì lưu trữ toàn bộ Diễn viên của tôi, chúng ta có một biến được gọi là diễn viên của

47
00:03:33,530 --> 00:03:38,840
‫tôi hoặc một diễn viên, một con trỏ diễn viên không lưu trữ toàn bộ diễn viên.

48
00:03:38,840 --> 00:03:42,170
‫Nó chỉ lưu trữ địa chỉ nơi bạn có thể tìm thấy một hành động.

49
00:03:42,170 --> 00:03:46,580
‫Vì vậy, bạn có thể thấy thực sự sử dụng ít bộ nhớ hơn rất nhiều để lưu trữ một địa chỉ.

50
00:03:46,580 --> 00:03:54,140
‫Và sau đó những gì chúng tôi làm là vào diễn viên của bạn, chúng tôi lưu trữ địa chỉ của diễn viên của tôi, vì vậy nó

51
00:03:54,140 --> 00:03:59,090
‫sẽ trỏ đến diễn viên gốc thay vì sao chép dữ liệu, do đó là con trỏ tên.

52
00:03:59,240 --> 00:04:01,880
‫Bây giờ đây không phải là cú pháp thực tế trong C ++.

53
00:04:01,880 --> 00:04:04,430
‫Trong C ++, cú pháp cô đọng hơn nhiều.

54
00:04:04,640 --> 00:04:09,650
‫Chúng tôi nói rằng một cái gì đó là một con trỏ bằng cách đặt một ngôi sao sau loại.

55
00:04:09,650 --> 00:04:17,660
‫Vì vậy, ngôi sao diễn viên có nghĩa là đây là một con trỏ tác nhân và để lấy địa chỉ của một biến, chúng tôi sử dụng

56
00:04:17,660 --> 00:04:22,310
‫dấu và chúng tôi sẽ không sử dụng nhiều địa chỉ này bởi vì có rất

57
00:04:22,310 --> 00:04:25,250
‫nhiều chức năng không thực tế con trỏ trả về.

58
00:04:25,250 --> 00:04:31,160
‫Vì vậy, chúng ta chỉ cần biết cách sử dụng những con trỏ đó hơn là tạo ra chúng trong thời gian này.

59
00:04:31,640 --> 00:04:40,070
‫Vì vậy, một chức năng như vậy cho phép chúng ta truy cập vào các đối tượng khác trong cảnh của chúng ta là get owner.

60
00:04:40,070 --> 00:04:46,460
‫Vậy tại sao điều này lại áp dụng khi chúng ta có một thành phần, nó thuộc sở hữu của một tác nhân.

61
00:04:46,460 --> 00:04:53,690
‫Vì vậy, nếu chúng tôi muốn thành phần này nói chuyện với tác nhân của chúng tôi, để lấy vị trí của nó, đặt vị trí của nó

62
00:04:53,690 --> 00:04:58,400
‫và thực hiện những việc như vậy, thì chúng tôi cần có thể trỏ đến tác nhân đó.

63
00:04:58,400 --> 00:05:00,040
‫Chúng tôi không muốn lấy một bản sao của nó.

64
00:05:00,050 --> 00:05:03,350
‫Trên thực tế, chúng tôi không muốn sao chép nó vì chúng tôi muốn thay đổi diễn viên.

65
00:05:03,350 --> 00:05:07,160
‫Nếu chúng tôi thực hiện thay đổi đối với một bản sao, nó sẽ không thực sự xuất hiện trong cảnh.

66
00:05:07,280 --> 00:05:13,850
‫Vì vậy, chúng ta cần có thể lưu trữ một biến là một con trỏ đến một tác nhân.

67
00:05:14,330 --> 00:05:19,760
‫Cách chúng tôi làm điều này, như chúng tôi vừa thấy trong các trang trình bày, là có loại diễn viên A.

68
00:05:19,760 --> 00:05:25,970
‫Nhưng sau đó chúng tôi đặt một ngôi sao ở cuối cho chúng tôi biết đây không phải là một diễn viên đang được lưu trữ ở đây,

69
00:05:25,970 --> 00:05:28,880
‫đây chỉ là địa chỉ của một diễn viên đang được lưu trữ.

70
00:05:29,150 --> 00:05:36,800
‫Vì vậy, chúng tôi lấy diễn viên và chúng tôi sẽ gọi chủ sở hữu này và sau đó chúng tôi sẽ đặt điều đó bằng với kết

71
00:05:36,800 --> 00:05:39,140
‫quả của việc gọi nhận chủ sở hữu.

72
00:05:39,140 --> 00:05:46,970
‫Vì vậy, get chủ sở hữu là một chức năng của một thành phần tác nhân cho phép bạn nhận được một con trỏ chủ sở hữu.

73
00:05:46,970 --> 00:05:53,690
‫Lấy một con trỏ diễn viên chỉ vào chủ sở hữu, đặt dấu chấm phẩy ở cuối dòng đó.

74
00:05:53,690 --> 00:06:00,800
‫Và những gì chúng ta có ở đây là một biến lưu trữ địa chỉ của tác nhân sở hữu thành phần cụ

75
00:06:00,800 --> 00:06:01,670
‫thể này.

76
00:06:01,670 --> 00:06:07,580
‫Vì vậy, tôi muốn thách bạn làm điều gì đó bằng cách in địa chỉ của biến này.

77
00:06:07,580 --> 00:06:14,690
‫Vì vậy, hãy sử dụng biến tác nhân và sử dụng phần trăm bạn định dạng, chỉ định nó trong nhật ký.

78
00:06:14,690 --> 00:06:19,550
‫Vì vậy, phần trăm về cơ bản có nghĩa là bạn đang sử dụng một số nguyên không dấu.

79
00:06:19,550 --> 00:06:25,250
‫Điều đó có nghĩa là một số nguyên không thể âm, điều này có ý nghĩa bởi vì các địa chỉ không thể

80
00:06:25,730 --> 00:06:31,790
‫âm khi chúng ta đang nói về nơi tìm bộ nhớ và sau đó tìm ra nó in gì, đi và chơi, xem thông báo

81
00:06:31,820 --> 00:06:33,980
‫nhật ký, xem những gì nó in ra.

82
00:06:34,250 --> 00:06:38,000
‫Nó có thay đổi giữa các lần chơi khác nhau nếu bạn ngừng chơi và bắt đầu chơi lại không?

83
00:06:38,000 --> 00:06:41,900
‫Và điều gì xảy ra nếu người di chuyển có trên nhiều tác nhân?

84
00:06:41,900 --> 00:06:45,680
‫Có nhiều địa chỉ khác nhau được in ra trong bảng điều khiển không?

85
00:06:45,710 --> 00:06:48,620
‫Tạm dừng video và có một cuộc điều tra nhỏ.

86
00:06:52,030 --> 00:06:52,390
‫Được chứ.

87
00:06:52,390 --> 00:06:53,410
‫Chào mừng trở lại.

88
00:06:53,440 --> 00:07:03,460
‫Vì vậy, chúng ta sẽ xem xét nhật ký Yule này và chúng ta sẽ nói chủ sở hữu động cơ, địa chỉ, phần trăm dấu hai

89
00:07:03,490 --> 00:07:04,380
‫chấm, bạn.

90
00:07:04,510 --> 00:07:07,540
‫Vì vậy, đó là nơi nó sẽ đặt giá trị con trỏ.

91
00:07:07,930 --> 00:07:10,210
‫Và sau đó chúng ta sẽ đặt con trỏ thực tế.

92
00:07:10,210 --> 00:07:12,430
‫Vì vậy, chúng tôi sẽ có chủ sở hữu trong đây.

93
00:07:12,940 --> 00:07:16,360
‫Vì vậy, nó sẽ in ra địa chỉ của chủ sở hữu.

94
00:07:16,450 --> 00:07:19,150
‫Hãy đi vào không thực.

95
00:07:19,180 --> 00:07:21,910
‫Nhấn điều khiển thay thế f 11.

96
00:07:21,910 --> 00:07:24,610
‫Và khi quá trình biên dịch hoàn tất, hãy bắt đầu chơi.

97
00:07:24,610 --> 00:07:29,740
‫Và những gì chúng ta đang thấy là địa chỉ của chủ sở hữu trình di chuyển thông báo nhật ký đang được chuyển đến và nó thực sự

98
00:07:29,740 --> 00:07:32,300
‫mang lại cho chúng ta một con số rất lớn cho địa chỉ này.

99
00:07:32,320 --> 00:07:36,460
‫Điều gì sẽ xảy ra nếu tôi ngừng chơi và chơi lại chỉ trong một giây?

100
00:07:36,460 --> 00:07:42,250
‫Bạn có thể thấy địa chỉ khá khác biệt đáng kể, và đó là bởi vì mỗi khi

101
00:07:42,250 --> 00:07:51,130
‫chúng tôi bắt đầu phát, Unreal đang tạo ra một nhóm diễn viên hoàn toàn mới trong cảnh, về cơ bản đã sẵn sàng để chơi, bắt đầu lại

102
00:07:51,130 --> 00:07:51,850
‫từ đầu.

103
00:07:51,850 --> 00:07:57,220
‫Vì vậy, đó là lý do tại sao chúng tôi thấy các vị trí địa chỉ mới mỗi khi chúng tôi chơi.

104
00:07:57,220 --> 00:08:05,320
‫Ví dụ: điều gì sẽ xảy ra nếu tôi đến trụ này và thêm thành phần động lực vào trụ, chúng tôi nhấn phát

105
00:08:05,320 --> 00:08:08,020
‫và cuộn xuống cuối nhật ký của mình.

106
00:08:08,020 --> 00:08:15,310
‫Bạn có thể thấy rằng mỗi đánh dấu có hai địa chỉ khác nhau được in ra ở đây vì có hai

107
00:08:15,310 --> 00:08:20,890
‫tác nhân khác nhau được lưu trữ ở hai vị trí khác nhau trong bộ nhớ.

108
00:08:20,890 --> 00:08:25,990
‫Vì vậy, đây là hai địa chỉ và bạn có thể thấy thực sự có một vài MB

109
00:08:25,990 --> 00:08:31,810
‫sự khác biệt giữa hai địa chỉ này, điều này chỉ cho bạn biết lượng thông tin đang được Unreal lưu trữ

110
00:08:31,810 --> 00:08:38,290
‫trong bộ nhớ và cũng là lý do tại sao điều quan trọng là phải hiệu quả với việc không tạo quá nhiều bản sao.

111
00:08:38,290 --> 00:08:39,700
‫Đó là nó cho bài giảng này.

112
00:08:39,700 --> 00:08:43,570
‫Tôi sẽ gặp bạn trong phần tiếp theo, nơi chúng ta sẽ làm những điều thú vị hơn với con trỏ.

