﻿1
00:00:04,370 --> 00:00:05,660
‫สวัสดีและยินดีต้อนรับ.

2
00:00:05,660 --> 00:00:13,250
‫ในการบรรยายนี้ เราจะทำความเข้าใจขั้นตอนหลักที่เกี่ยวข้องกับการคอมไพล์ไฟล์ C++ ใน

3
00:00:13,250 --> 00:00:13,910
‫Unreal

4
00:00:13,910 --> 00:00:16,070
‫มาดูวิธีการทำงานกันเลย

5
00:00:16,850 --> 00:00:24,020
‫ดังนั้น อีกไม่นานจะถึงเวลาที่เราจะเริ่มต้นใช้โค้ดจากภายนอก จากไฟล์อื่น และเราต้องเรียนรู้วิธีการทำงานของโค้ดใน

6
00:00:24,020 --> 00:00:26,750
‫C++

7
00:00:26,750 --> 00:00:31,220
‫ในการทำเช่นนั้น เราต้องใช้ทางเบี่ยงเล็กน้อยและทำความเข้าใจในรายละเอียดเพิ่มเติมว่าเกิดอะไรขึ้นเมื่อเราคอมไพล์โค้ด

8
00:00:31,220 --> 00:00:35,270
‫C++ เป็นไบนารี

9
00:00:35,270 --> 00:00:38,690
‫นี่คือขั้นตอนการคอมไพล์ที่ใช้

10
00:00:38,690 --> 00:00:44,780
‫เราเริ่มต้นด้วยโค้ดของคุณ ไฟล์ C++ ไฟล์ส่วนหัว ทั้งหมดในไฟล์ข้อความต่างๆ

11
00:00:44,780 --> 00:00:49,070
‫สิ่งเหล่านี้ถูกป้อนเข้าไปในเครื่องมือที่เรียกว่า Unreal Header Tool

12
00:00:49,070 --> 00:00:56,270
‫ตอนนี้ เครื่องมือนี้มีหน้าที่รับส่วนไวยากรณ์ที่ไม่จริงทั้งหมดและใช้เพื่อสร้างโค้ด

13
00:00:56,270 --> 00:00:58,760
‫C++ เพิ่มเติม

14
00:00:58,760 --> 00:01:05,570
‫ลองมาดูตัวอย่างที่เรามีไวยากรณ์เฉพาะที่ไม่จริงนี้ คลาสใหม่นี้เป็นตัวพิมพ์ใหญ่ที่มีรูปแบบเฉพาะที่ไม่จริง

15
00:01:05,570 --> 00:01:15,380
‫เช่นเดียวกับ Crypt Reader API ที่นี่และเนื้อหาที่สร้างขึ้นที่นั่น

16
00:01:15,410 --> 00:01:21,830
‫และโดยพื้นฐานแล้ว สิ่งที่เกิดขึ้นที่นี่คือเครื่องมือส่วนหัวที่ไม่จริง จะเห็นส่วนต่างๆ ของไวยากรณ์เหล่านี้ในโค้ดของคุณและไปได้เลย

17
00:01:21,830 --> 00:01:24,500
‫ฉันต้องทำงานของฉัน

18
00:01:24,500 --> 00:01:27,020
‫ฉันต้องเข้าไปข้างใน ฉันต้องเพิ่มอะไรหลายๆ อย่าง

19
00:01:27,050 --> 00:01:33,800
‫มันจะแทนที่เนื้อหาที่คุณสร้างขึ้นด้วยรหัสจำนวนมากที่ทำให้ชีวิตของเราง่ายขึ้นเมื่อใช้

20
00:01:33,800 --> 00:01:34,670
‫Unreal

21
00:01:35,090 --> 00:01:38,300
‫นอกจากนี้ยังทำสิ่งต่างๆ เช่น คุณสมบัติ U และฟังก์ชันใหม่

22
00:01:38,300 --> 00:01:43,580
‫มันเพิ่มทุกสิ่งที่จำเป็นเพื่อให้สามารถสื่อสารกับโลกพิมพ์เขียว

23
00:01:43,580 --> 00:01:45,020
‫นั่นคือขั้นตอนแรก

24
00:01:45,020 --> 00:01:49,250
‫มันแปลงสิ่งที่ไม่จริงทั้งหมดเป็น C ++ จริง

25
00:01:49,490 --> 00:01:57,260
‫เมื่อเราได้ C++ จริงแล้ว เราก็สามารถป้อนลงในกระบวนการคอมไพล์ C++ มาตรฐานได้ ซึ่งใช้เวลาสามขั้นตอน

26
00:01:57,260 --> 00:02:07,610
‫อย่างแรกคือจัดการกับขั้นตอนก่อนการประมวลผลเพื่อให้สามารถสัมผัสไวยากรณ์ C ++ ใดก็ได้และเกี่ยวข้องกับบรรทัดที่ขึ้นต้นด้วยแฮชเท่านั้น

27
00:02:07,610 --> 00:02:10,850
‫ดังนั้นเราจึงมีคำสั่งก่อนการประมวลผลบางส่วนเหล่านี้

28
00:02:10,850 --> 00:02:13,400
‫สิ่งเหล่านี้ได้รับการจัดการโดยตัวประมวลผลล่วงหน้า

29
00:02:14,150 --> 00:02:16,820
‫ขั้นตอนต่อไปคือสิ่งที่เราเรียกว่าคอมไพเลอร์

30
00:02:16,850 --> 00:02:24,680
‫มันใช้รหัสและแปลงเป็นไบนารีที่ปฏิบัติการได้ แต่มันยังไม่สมบูรณ์ตามขั้นตอนเพราะมันทำกับ

31
00:02:24,680 --> 00:02:31,790
‫C++ แต่ละตัวเท่านั้น สิ่งที่เรียกว่าหน่วยการแปล โดยทั่วไปคือไฟล์ C++

32
00:02:31,790 --> 00:02:37,910
‫ดังนั้นจึงใช้ไฟล์ C++ และแปลเป็นไบนารีทีละไฟล์ แต่ละไฟล์ C++

33
00:02:37,910 --> 00:02:47,090
‫จากนั้นขั้นตอนที่สามคือตัวเชื่อมโยง ซึ่งนำสิ่งเหล่านั้นมารวมกันและส่งออกไฟล์ปฏิบัติการที่เราสามารถเรียกใช้โปรแกรมเรียกทำงานเดียวได้จริง

34
00:02:47,180 --> 00:02:53,780
‫ลองมาดูขั้นตอนการคอมไพล์มาตรฐานเหล่านี้ในรายละเอียดเพิ่มเติมเล็กน้อยด้วยไฟล์ตัวอย่าง

35
00:02:53,840 --> 00:02:55,970
‫ลองนึกภาพว่าเรามีเกม

36
00:02:56,150 --> 00:03:08,540
‫CP และเป็นเกมที่ง่ายมาก ๆ เพราะทั้งหมดที่ทำคือเพิ่มหนึ่งและหนึ่งเข้าด้วยกัน แต่การเพิ่มหนึ่งและหนึ่งเข้าด้วยกันคือต้องใช้ฟังก์ชันที่ประกาศไว้ในไฟล์อื่นในวิชาคณิตศาสตร์

37
00:03:08,780 --> 00:03:10,700
‫H ดังนั้นคณิตศาสตร์จึงประกาศ

38
00:03:10,700 --> 00:03:14,090
‫AD แต่จริง ๆ แล้วมันไม่ได้กำหนดสิ่งที่มันทำ

39
00:03:14,090 --> 00:03:16,010
‫นั่นก็จบไปแล้วในวิชาคณิตศาสตร์

40
00:03:16,190 --> 00:03:19,520
‫CP และคุณจะเห็นว่ามันเป็นการใช้งานที่ง่ายมากจริงๆ

41
00:03:20,000 --> 00:03:22,700
‫เกิดอะไรขึ้นที่ขั้นตอนพรีโปรเซสเซอร์?

42
00:03:22,700 --> 00:03:28,610
‫อย่างที่ฉันบอกไป มันเกี่ยวข้องกับคำสั่งของตัวประมวลผลล่วงหน้า ซึ่งเป็นสิ่งที่ขึ้นต้นด้วยแฮช

43
00:03:28,610 --> 00:03:34,970
‫ดังนั้นแฮชจึงรวมเลขคณิตไว้ด้วย ซึ่งโดยพื้นฐานแล้วหมายถึงแค่คัดลอกทุกอย่างในวิชาคณิตศาสตร์มาไว้ที่นี่

44
00:03:34,970 --> 00:03:40,700
‫ดังนั้นสิ่งที่ทำคือใช้สองไฟล์นี้และรวมเข้าด้วยกันเพื่อสร้างไฟล์เอาท์พุตใหม่ที่เรียกว่า

45
00:03:40,700 --> 00:03:48,050
‫Game I โดยพื้นฐานแล้วเกมรวมถึงและคุณจะเห็นว่าได้รวมคำจำกัดความจาก Master H และแทนที่คำสั่ง

46
00:03:48,050 --> 00:03:52,730
‫hash preprocessor

47
00:03:52,730 --> 00:04:03,180
‫ดังนั้นตอนนี้ Game II จึงมีคำจำกัดความสำหรับการดำเนินการ ADD จากนั้นเราเรียกใช้ตัวประมวลผลล่วงหน้าใน DHCP ทางคณิตศาสตร์

48
00:04:03,200 --> 00:04:07,760
‫แต่เนื่องจากไม่มีคำสั่งของตัวประมวลผลล่วงหน้า โดยพื้นฐานแล้วจึงไม่มีอะไรเปลี่ยนแปลงที่นั่น

49
00:04:08,060 --> 00:04:12,890
‫ขั้นตอนต่อไปคือการคอมไพล์น่าจะเป็นขั้นตอนที่สำคัญและซับซ้อนที่สุด

50
00:04:12,890 --> 00:04:21,350
‫เพราะสิ่งที่ทำคือใช้ C++ นั้นในแต่ละไฟล์และแปลงเป็นไบนารี่ แต่มันไม่ใช่ไบนารีที่สมบูรณ์เพราะเช่น

51
00:04:21,350 --> 00:04:30,620
‫เกมของฉันไม่จริง รู้วิธีใช้งาน AD เพียงแค่รู้รูปร่างของฟังก์ชันเพิ่มนั้น

52
00:04:30,620 --> 00:04:34,940
‫ดังนั้นจำเป็นต้องกรอกข้อมูลในภายหลังและตัวเชื่อมโยงจะกรอกข้อมูล

53
00:04:34,940 --> 00:04:44,810
‫ดังนั้นตัวเชื่อมโยงจะนำไบนารีที่สร้างขึ้นสำหรับไฟล์ obj ของเกมและไบนารีที่สร้างขึ้นสำหรับไฟล์หลักและนำมารวมกันเพื่อสร้างเกม

54
00:04:45,020 --> 00:04:55,280
‫XY ซึ่งรวมไบนารีสำหรับทั้งคู่ และสุดท้ายเป็นไฟล์เรียกทำงานที่สมบูรณ์ซึ่งเราสามารถเรียกใช้ได้จริง เพราะมันมีคำจำกัดความสำหรับทุกสิ่งที่ต้องการ

55
00:04:55,280 --> 00:04:58,730
‫ทำไมเราถึงมีกระบวนการที่ซับซ้อนเช่นนี้?

56
00:04:58,730 --> 00:05:03,860
‫แนวคิดในที่นี้คือ มันทำให้เวลาในการรวบรวมของเราเร็วขึ้น เพราะถ้าฉันทำการเปลี่ยนแปลงเพียงอย่างเดียว

57
00:05:04,310 --> 00:05:06,470
‫เพื่อเล่นเกม DHCP

58
00:05:06,710 --> 00:05:10,340
‫ฉันไม่จำเป็นต้องรันกระบวนการคอมไพล์ทั้งหมด

59
00:05:10,340 --> 00:05:16,730
‫ทั้งหมดที่ฉันต้องทำคือเรียกใช้บิตที่เกี่ยวข้องกับเกม DHCP ดังนั้นฉันจะเรียกใช้ตัวประมวลผลล่วงหน้าบน

60
00:05:16,760 --> 00:05:23,660
‫CP เท่านั้น จากนั้นฉันจะเรียกใช้คอมไพเลอร์ในเกมกับ I เท่านั้น จากนั้นฉันจะนำไฟล์คณิตศาสตร์ obj กลับมาใช้ใหม่ได้

61
00:05:23,660 --> 00:05:26,960
‫ฉันไม่จำเป็นต้องคอมไพล์ใหม่เพราะไม่มีอะไรเปลี่ยนแปลงในนั้น

62
00:05:26,960 --> 00:05:37,640
‫ในทำนองเดียวกัน ถ้าฉันเปลี่ยนแค่ dot CP ทางคณิตศาสตร์ ฉันจะไม่ต้องคอมไพล์ไฟล์ obj ของเกมอีกครั้ง ซึ่งเป็นสาเหตุที่ทำให้กระบวนการนี้มีประสิทธิภาพมากขึ้นและทำไมเราถึงทำอย่างนั้นตั้งแต่แรก

63
00:05:37,640 --> 00:05:44,630
‫เลยอยากให้เราทำการทดลองเล็กๆ น้อยๆ แล้วลองคิดดูว่าเหตุใดเราจึงรวมการย้าย H เข้าและย้ายไฟล์

64
00:05:44,630 --> 00:05:46,280
‫CP

65
00:05:46,280 --> 00:05:47,750
‫อะไรคือสาเหตุของมัน?

66
00:05:47,750 --> 00:05:51,770
‫ทำไมเราไม่สามารถรวบรวมไฟล์ C ++ โดยไม่ต้องย้าย?

67
00:05:51,770 --> 00:05:56,660
‫H การทดลองที่เราจะทำคือเราจะแสดงความคิดเห็นเกี่ยวกับบรรทัดรวมแฮช

68
00:05:56,660 --> 00:06:02,000
‫ดังนั้นการใช้เครื่องหมายทับสองครั้งเพื่อแสดงความคิดเห็นที่ด้านหน้าของบรรทัดนั้น ซึ่งโดยพื้นฐานแล้วจะทำให้ตัวประมวลผลล่วงหน้าหลุดออกมา

69
00:06:02,000 --> 00:06:08,060
‫แทนที่จะให้ตัวประมวลผลล่วงหน้าแทนที่ด้วยเนื้อหาของไฟล์

70
00:06:08,510 --> 00:06:15,050
‫จากนั้นเราจะคอมไพล์ใหม่ และฉันต้องการให้คุณดูข้อความแสดงข้อผิดพลาดที่ออกมาและดูว่ามีข้อความว่าอย่างไร

71
00:06:15,050 --> 00:06:21,110
‫เพื่อดูว่าคุณสามารถลองและทำความเข้าใจว่าเรากำลังรวมการเคลื่อนไหวนี้ไว้เพื่ออะไร

72
00:06:21,260 --> 00:06:23,450
‫หยุดวิดีโอชั่วคราวและไปกันเลย

73
00:06:26,590 --> 00:06:27,030
‫ตกลง.

74
00:06:27,040 --> 00:06:28,000
‫ยินดีต้อนรับกลับ.

75
00:06:28,030 --> 00:06:33,870
‫ลองใส่เครื่องหมายทับสองครั้งที่จุดเริ่มต้นของบรรทัดนี้ ซึ่งโดยทั่วไปจะทำให้เป็นโมฆะและเป็นโมฆะ

76
00:06:33,880 --> 00:06:40,450
‫จากนั้นเราจะทำการควบคุม alt f 11 และเราจะดูที่ผลลัพธ์ของ live coding

77
00:06:40,450 --> 00:06:44,680
‫ดูสิ เรามีข้อผิดพลาดเกิดขึ้นตั้งแต่เนิ่นๆ

78
00:06:44,680 --> 00:06:51,160
‫และสิ่งที่กำลังพูดก็คือคุณเป็นผู้เสนอญัตติไม่ใช่คลาสหรือเนมสเปซ และยังมีสิ่งอื่น ๆ อยู่ด้านล่าง

79
00:06:51,160 --> 00:06:58,360
‫มันบอกว่าองค์ประกอบเทคโนโลยีหลักไม่ได้รับการประกาศว่า super ไม่ใช่คลาสหรือเจ้าของเนมสเปซเป็นตัวระบุที่ไม่รู้จัก

80
00:06:58,360 --> 00:07:03,940
‫และโดยพื้นฐานแล้ว ที่พูดนี้คือคุณได้พูดถึงคุณที่นี่ แต่คุณไม่ได้นิยามมันไว้ที่ไหน

81
00:07:03,940 --> 00:07:05,920
‫คุณไม่ได้ประกาศมันที่ไหนเลย

82
00:07:05,920 --> 00:07:07,240
‫ฉันก็เลยไม่รู้

83
00:07:07,240 --> 00:07:11,560
‫คอมไพเลอร์ C++ บอกว่า ฉันไม่รู้ว่านี่คืออะไร

84
00:07:11,560 --> 00:07:18,250
‫นั่นคือเหตุผลที่เราเป็นแฮช รวมถึงผู้เสนอญัตติ H เนื่องจากผู้เสนอญัตติ H ประกาศคลาส

85
00:07:18,250 --> 00:07:25,780
‫มันบอกว่าผู้เสนอญัตติ U เป็นคลาสและเกิดขึ้นจากคุณทำหน้าที่ส่วนประกอบและมีวิธีเหล่านี้ ฯลฯ

86
00:07:25,780 --> 00:07:28,480
‫เป็นการประกาศว่าการเป็นคลาสนั้นหมายความว่าอย่างไร

87
00:07:28,480 --> 00:07:32,440
‫ดังนั้นหากไม่มีการประกาศนั้น คอมไพเลอร์ C++ ก็ไม่สามารถดำเนินการต่อได้

88
00:07:32,440 --> 00:07:36,160
‫และนั่นเป็นเหตุผลที่เราต้องรวมไฟล์ส่วนหัวนั้นไว้ด้วย

89
00:07:36,760 --> 00:07:37,240
‫สิ่งที่ดี

90
00:07:37,240 --> 00:07:44,920
‫หวังว่าตอนนี้คุณจะเข้าใจกระบวนการที่เกี่ยวข้องกับการรวบรวม C++ และโดยเฉพาะอย่างยิ่งการรวบรวม

91
00:07:44,920 --> 00:07:47,890
‫C++ ใน Unreal ดีขึ้นเล็กน้อย

92
00:07:47,920 --> 00:07:49,810
‫แล้วพบกันใหม่ในบทเรียนหน้าครับ

