﻿1
00:00:04,370 --> 00:00:05,630
‫Cześć i witaj.

2
00:00:05,630 --> 00:00:13,730
‫Na tym wykładzie zrozumiemy główne kroki związane z kompilacją plików C++ w Unreal.

3
00:00:13,940 --> 00:00:15,770
‫Zanurzmy się i zobaczmy, jak działają.

4
00:00:16,910 --> 00:00:23,990
‫Niedługo więc nadejdzie czas, abyśmy zaczęli używać kodu z zewnątrz, z innych plików, i musimy nauczyć

5
00:00:23,990 --> 00:00:26,720
‫się, jak to działa w C++.

6
00:00:26,720 --> 00:00:31,190
‫Aby to zrobić, musimy zboczyć z drogi i bardziej szczegółowo zrozumieć, co

7
00:00:31,190 --> 00:00:35,240
‫się dzieje, gdy kompilujemy nasz kod C++ do pliku binarnego.

8
00:00:35,240 --> 00:00:38,390
‫Oto kroki kompilacji, które są używane.

9
00:00:38,750 --> 00:00:44,450
‫Zaczynamy od twojego kodu, twoich plików C++, twojej głowy plików, wszystko w różnych plikach tekstowych.

10
00:00:44,900 --> 00:00:49,010
‫Są one podawane do narzędzia o nazwie Unreal Handed Tool.

11
00:00:49,010 --> 00:00:56,210
‫Teraz to narzędzie jest odpowiedzialne za pobranie wszystkich nierealnych, określonych fragmentów składni i użycie ich do

12
00:00:56,210 --> 00:00:58,490
‫wygenerowania większej ilości kodu C++.

13
00:00:58,910 --> 00:01:05,480
‫Przyjrzyjmy się więc kilku przykładom, w których mamy tę nierzeczywistą, specyficzną składnię, tę

14
00:01:05,540 --> 00:01:13,640
‫nową klasę pisaną wielkimi literami, która jest nierzeczywistą specyficzną składnią, podobnie jak tutaj API Crypt Reader, a

15
00:01:13,640 --> 00:01:15,170
‫tam wygenerowane ciało.

16
00:01:15,530 --> 00:01:21,770
‫I zasadniczo to, co się tutaj dzieje, to nierealne narzędzie do nagłówków, które zobaczy te różne fragmenty składni w twoim kodzie

17
00:01:21,770 --> 00:01:24,470
‫i uruchomi się, okej, muszę wykonać swoją pracę.

18
00:01:24,470 --> 00:01:26,810
‫Muszę tam wejść, muszę dodać kilka rzeczy.

19
00:01:27,080 --> 00:01:33,710
‫Zastąpi Twoje wygenerowane ciało pakietem kodu, który ułatwi nam życie podczas korzystania z

20
00:01:33,710 --> 00:01:34,460
‫Unreal.

21
00:01:35,060 --> 00:01:38,240
‫Wykonuje również takie rzeczy, jak właściwości U i funkcje U.

22
00:01:38,240 --> 00:01:43,340
‫Dodaje wszystko, czego potrzebuje, aby mógł komunikować się ze światem planu.

23
00:01:43,730 --> 00:01:44,960
‫Więc to jest pierwszy krok.

24
00:01:44,960 --> 00:01:49,010
‫Konwertuje wszystkie swoje nierealne, specyficzne rzeczy do rzeczywistego C++.

25
00:01:49,580 --> 00:01:55,820
‫Gdy mamy już właściwy C++, możemy wprowadzić go do standardowego procesu kompilacji C++, który składa się

26
00:01:55,820 --> 00:01:56,990
‫z trzech kroków.

27
00:01:57,380 --> 00:02:04,370
‫Pierwszym z nich jest zajęcie się etapem przetwarzania wstępnego, więc w rzeczywistości dotknie to dowolnej składni C++ i w rzeczywistości

28
00:02:04,640 --> 00:02:07,580
‫dotyczy tylko wierszy zaczynających się od skrótu.

29
00:02:07,580 --> 00:02:10,610
‫Mamy więc kilka z tych dyrektyw przetwarzania wstępnego.

30
00:02:10,940 --> 00:02:13,220
‫Zajmuje się nimi preprocesor.

31
00:02:14,120 --> 00:02:16,610
‫Następnym krokiem jest to, co nazywamy kompilatorem.

32
00:02:16,880 --> 00:02:24,620
‫Pobiera kod i konwertuje go na wykonywalny plik binarny, ale nie kończy tego kroku, ponieważ robi

33
00:02:24,620 --> 00:02:31,640
‫to tylko na poszczególnych C++, tak zwanych jednostkach tłumaczeniowych, w zasadzie plikach C++.

34
00:02:31,880 --> 00:02:37,670
‫Więc bierze plik C++ i tłumaczy go na binarny indywidualnie, każdy pojedynczy plik C++.

35
00:02:38,000 --> 00:02:44,300
‫A trzecim krokiem jest linker, który łączy to wszystko i wyświetla plik wykonywalny, który możemy

36
00:02:44,300 --> 00:02:46,850
‫uruchomić jako jeden plik wykonywalny.

37
00:02:47,330 --> 00:02:53,540
‫Przyjrzyjmy się więc bardziej szczegółowo tym standardowym krokom kompilacji z przykładowym plikiem.

38
00:02:53,990 --> 00:03:00,200
‫Więc wyobraź sobie, że mieliśmy grę dot CP i jest to bardzo, bardzo prosta gra, ponieważ wszystko, co robi, to dodawanie jednego

39
00:03:00,200 --> 00:03:01,160
‫i jednego razem.

40
00:03:01,640 --> 00:03:07,790
‫Ale żeby dodać jeden i jeden razem, musi użyć funkcji, która jest zadeklarowana w innym pliku w

41
00:03:07,790 --> 00:03:08,630
‫matematyce drugiej.

42
00:03:08,690 --> 00:03:13,850
‫H Tak więc matematyka deklaruje ad, ale tak naprawdę nie definiuje tego, co robi.

43
00:03:14,240 --> 00:03:16,790
‫Tak więc jest to skończone w kroku z kropką matematyczną.

44
00:03:16,790 --> 00:03:19,250
‫Jak widać, jest to bardzo prosta implementacja.

45
00:03:20,090 --> 00:03:22,640
‫Co się dzieje na etapie wstępnego przetwarzania?

46
00:03:22,640 --> 00:03:28,040
‫Cóż, jak powiedziałem, zajmuje się wszystkimi dyrektywami preprocesora, które zaczynają się od

47
00:03:28,040 --> 00:03:28,610
‫skrótu.

48
00:03:28,610 --> 00:03:34,700
‫Więc hash zawiera matematykę, co w zasadzie oznacza, że po prostu skopiuj tutaj wszystko z Mistrza H.

49
00:03:35,120 --> 00:03:40,640
‫Więc to, co robi, to bierze te dwa pliki i łączy je ze sobą, aby utworzyć

50
00:03:40,640 --> 00:03:46,190
‫nowy plik wyjściowy o nazwie game dot, który w zasadzie mam dołączyć i widać, że jest on dołączony.

51
00:03:46,490 --> 00:03:52,700
‫Definicja z masturbacji zastąpiła dyrektywę dotyczącą preprocesora haszującego.

52
00:03:52,700 --> 00:04:02,540
‫Więc teraz gra kropka II ma definicję operacji dodawania, a następnie uruchamiamy preprocesor na CVP z matematycznymi

53
00:04:02,540 --> 00:04:03,170
‫kropkami.

54
00:04:03,170 --> 00:04:07,490
‫Ale ponieważ nie ma żadnych dyrektyw preprocesora, w zasadzie nic się tam nie zmienia.

55
00:04:08,150 --> 00:04:12,830
‫Następnym krokiem jest to, że kompilacja jest prawdopodobnie najważniejszym i najbardziej

56
00:04:12,830 --> 00:04:21,290
‫skomplikowanym krokiem, ponieważ zajmuje się tym C++ w każdym pojedynczym pliku i konwertuje go na binarny, ale nie jest to kompletny

57
00:04:21,290 --> 00:04:28,610
‫binarny, ponieważ na przykład moja gra tak naprawdę nie wie, jak zaimplementować i po prostu zna kształt

58
00:04:28,850 --> 00:04:30,350
‫tej funkcji dodawania.

59
00:04:30,770 --> 00:04:34,940
‫Więc to musi być wypełnione później i to jest wypełniane przez linker.

60
00:04:34,970 --> 00:04:40,880
‫Tak więc link weźmie plik binarny, utworzy go dla pliku obj z kropką gry i

61
00:04:40,880 --> 00:04:47,060
‫plik binarny utworzony dla pliku metody i połączy je, aby stworzyć grę kropka xy, która łączy

62
00:04:47,360 --> 00:04:54,410
‫binarny dla obu i ostatecznie jest kompletnym plikiem wykonywalnym, który my może faktycznie działać, ponieważ zawiera definicję wszystkiego, czego

63
00:04:54,410 --> 00:04:55,040
‫potrzebuje.

64
00:04:55,340 --> 00:04:58,460
‫Dlaczego mamy tak skomplikowany proces?

65
00:04:58,820 --> 00:05:02,060
‫Pomysł polega na tym, że przyspiesza to czas kompilacji.

66
00:05:02,060 --> 00:05:03,850
‫Bo gdybym tylko zrobił łańcuch.

67
00:05:04,340 --> 00:05:06,230
‫Do gry kropka spać.

68
00:05:06,770 --> 00:05:10,290
‫Właściwie nie muszę uruchamiać całego procesu kompilacji.

69
00:05:10,310 --> 00:05:16,610
‫Wszystko, co muszę zrobić, to uruchomić bity związane z grą dot CBP, więc uruchomiłbym preprocesor tylko na CP.

70
00:05:16,790 --> 00:05:19,280
‫Wtedy uruchomiłbym kompilator tylko w grze do I.

71
00:05:19,280 --> 00:05:23,510
‫A potem mogę ponownie wykorzystać wcześniejszy plik matematyczny dot obj.

72
00:05:23,690 --> 00:05:26,810
‫Nie muszę go ponownie kompilować, ponieważ nic się w tym nie zmieniło.

73
00:05:27,080 --> 00:05:33,170
‫Podobnie, gdybym zmienił tylko matematyczne kropki CP, nie musiałbym przekompilowywać gry do pliku OBJ, dlatego jest

74
00:05:33,170 --> 00:05:37,370
‫to wydajniejszy proces i dlatego w pierwszej kolejności to robimy.

75
00:05:37,730 --> 00:05:44,330
‫Więc chciałbym, żebyśmy zrobili mały eksperyment i spróbowali dowiedzieć się, dlaczego dołączyliśmy przesuń kropkę i przenieś jej

76
00:05:44,330 --> 00:05:46,070
‫plik CP z kropkami?

77
00:05:46,370 --> 00:05:47,690
‫Jaki jest tego powód?

78
00:05:47,700 --> 00:05:52,040
‫Dlaczego nie możemy po prostu skompilować pliku C++ bez dołączenia move dot h.

79
00:05:52,340 --> 00:05:56,540
‫Tak więc eksperyment, który zamierzamy przeprowadzić, polega na skomentowaniu linii włączania hash.

80
00:05:56,690 --> 00:06:01,940
‫Tak więc użycie podwójnego ukośnika, aby dodać komentarz przed tą linią, co

81
00:06:01,940 --> 00:06:07,280
‫w zasadzie sprawi, że zostanie on usunięty przez preprocesor zamiast zastępowania go zawartością

82
00:06:07,280 --> 00:06:07,880
‫pliku.

83
00:06:08,570 --> 00:06:15,020
‫Następnie dokonamy ponownej kompilacji i chciałbym, abyś spojrzał na pojawiające się komunikaty o błędach i zobaczył,

84
00:06:15,020 --> 00:06:20,870
‫co jest napisane, aby zobaczyć, czy możesz spróbować zrozumieć, po co uwzględniamy to przeniesienie.

85
00:06:21,350 --> 00:06:23,210
‫Wstrzymaj wideo i spróbuj.

86
00:06:26,500 --> 00:06:26,980
‫Dobra.

87
00:06:26,980 --> 00:06:27,760
‫Witamy spowrotem.

88
00:06:28,150 --> 00:06:33,220
‫Umieśćmy więc podwójny ukośnik na początku tej linii, co w zasadzie czyni ją nieważną i

89
00:06:33,220 --> 00:06:33,580
‫nieważną.

90
00:06:34,030 --> 00:06:40,300
‫A potem zrobimy kontrolkę alt f 11 i przyjrzymy się wynikom kodowania na żywo.

91
00:06:40,480 --> 00:06:44,650
‫Więc spójrz, od razu mamy kilka błędów, bardzo, bardzo wcześnie.

92
00:06:44,650 --> 00:06:51,070
‫Mówi to, że przenoszenie nie jest klasą ani przestrzenią nazw, a jest tu kilka innych rzeczy.

93
00:06:51,070 --> 00:06:56,650
‫Oznacza to, że główny składnik techniczny został uznany za super w klasie lub właściciel przestrzeni nazw

94
00:06:56,650 --> 00:06:58,090
‫jest nieznanym identyfikatorem.

95
00:06:58,510 --> 00:07:03,880
‫I zasadniczo to oznacza, że mówiłeś tutaj o swoim poruszycielu, ale i tak tego nie

96
00:07:03,880 --> 00:07:05,860
‫zdefiniowałeś, nigdzie tego nie zadeklarowałeś.

97
00:07:05,860 --> 00:07:07,150
‫Więc nie wiem.

98
00:07:07,180 --> 00:07:11,290
‫Kompilator C++ mówi, nie wiem co to jest.

99
00:07:11,680 --> 00:07:18,160
‫Więc dlatego mamy hash, w tym mover dot h, ponieważ move it lub H deklaruje klasę.

100
00:07:18,160 --> 00:07:25,720
‫Mówi, że U mover jest klasą i wywodzi się z działania komponentu i ma te metody itp.

101
00:07:25,720 --> 00:07:28,270
‫deklaruje, co to znaczy być tą klasą.

102
00:07:28,630 --> 00:07:35,260
‫Więc bez tej deklaracji kompilator C++ nie może kontynuować i dlatego musimy dołączyć ten plik

103
00:07:35,260 --> 00:07:35,920
‫nagłówkowy.

104
00:07:36,760 --> 00:07:37,180
‫Świetna sprawa.

105
00:07:37,180 --> 00:07:44,860
‫Miejmy więc nadzieję, że teraz rozumiesz nieco lepiej proces związany z kompilacją C++, a

106
00:07:44,860 --> 00:07:47,650
‫zwłaszcza kompilacją C++ w Unreal.

107
00:07:47,920 --> 00:07:49,570
‫Do zobaczenia na następnym wykładzie.

