﻿1
00:00:04,370 --> 00:00:05,660
‫أهلا ومرحبا.

2
00:00:05,660 --> 00:00:13,910
‫في هذه المحاضرة ، سوف نفهم الخطوات الرئيسية التي ينطوي عليها تجميع ملفات C ++ في Unreal.

3
00:00:13,910 --> 00:00:16,070
‫دعونا نتعمق ونرى كيف تعمل.

4
00:00:16,850 --> 00:00:24,020
‫لذلك سيحين الوقت قريبًا لبدء استخدام التعليمات البرمجية من الخارج ، من الملفات الأخرى ، ونحتاج

5
00:00:24,020 --> 00:00:26,750
‫إلى معرفة كيفية عمل ذلك في C ++.

6
00:00:26,750 --> 00:00:31,220
‫للقيام بذلك ، نحتاج إلى اتخاذ منعطف بسيط وفهم بمزيد من التفصيل ما

7
00:00:31,220 --> 00:00:35,270
‫يحدث عندما نقوم بتجميع كود C ++ الخاص بنا إلى نظام ثنائي.

8
00:00:35,270 --> 00:00:38,690
‫إذن هذه هي خطوات التجميع المستخدمة.

9
00:00:38,690 --> 00:00:44,780
‫نبدأ بالكود الخاص بك ، ملفات C ++ الخاصة بك ، ملفات الرأس الخاصة بك ، كل ذلك في ملفات نصية مختلفة.

10
00:00:44,780 --> 00:00:49,070
‫يتم إدخالها في أداة تسمى Unreal Header Tool.

11
00:00:49,070 --> 00:00:56,270
‫الآن ، هذه الأداة مسؤولة عن أخذ جميع أجزاء بناء الجملة المحددة غير الواقعية واستخدامها

12
00:00:56,270 --> 00:00:58,760
‫لإنشاء المزيد من كود C ++.

13
00:00:58,760 --> 00:01:05,570
‫لذلك دعونا نلقي نظرة على بعض الأمثلة على المكان الذي حصلنا فيه على هذا التركيب النوعي غير الواقعي

14
00:01:05,570 --> 00:01:13,700
‫، هذه الفئة الجديدة بالأحرف الكبيرة التي هي بناء جملة محدد غير واقعي ، وكذلك هو الشيء Crypt Reader API هنا والجسم الذي

15
00:01:13,700 --> 00:01:15,380
‫تم إنشاؤه هناك.

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:55,880
‫بمجرد حصولنا على C ++ الفعلي ، يمكننا بعد ذلك إدخاله في عملية تجميع C ++ قياسية ، والتي تستغرق

26
00:01:55,880 --> 00:01:57,260
‫ثلاث خطوات.

27
00:01:57,260 --> 00:02:04,790
‫الأول هو التعامل مع خطوة المعالجة المسبقة بحيث يمكن أن يلمس هذا فعليًا أيًا من بناء جملة C ++ ويتعامل في الواقع

28
00:02:04,790 --> 00:02:07,610
‫فقط مع الخطوط التي تبدأ بعلامة تجزئة.

29
00:02:07,610 --> 00:02:10,850
‫إذن لدينا عدد قليل من توجيهات المعالجة المسبقة هذه.

30
00:02:10,850 --> 00:02:13,400
‫يتم التعامل مع هذه من قبل المعالج.

31
00:02:14,150 --> 00:02:16,820
‫الخطوة التالية هي ما نسميه بالفعل المترجم.

32
00:02:16,850 --> 00:02:24,680
‫يأخذ رمزًا ويحوله إلى ثنائي قابل للتنفيذ ، لكنه لا يكمل الخطوة تمامًا لأنه يفعل

33
00:02:24,680 --> 00:02:31,790
‫ذلك فقط على C ++ الفردية ، ما يعرف بوحدات الترجمة ، بشكل أساسي ملفات C ++.

34
00:02:31,790 --> 00:02:37,910
‫لذلك يأخذ ملف C ++ ويترجم ذلك إلى ثنائي فردي ، كل ملف C ++ فردي.

35
00:02:37,910 --> 00:02:44,360
‫ثم الخطوة الثالثة هي الرابط ، الذي يجمع كل ذلك معًا ويخرج ملفًا تنفيذيًا يمكننا

36
00:02:44,360 --> 00:02:47,090
‫بالفعل تشغيل ملف تنفيذي واحد.

37
00:02:47,180 --> 00:02:52,970
‫لذلك دعونا نلقي نظرة على خطوات التجميع القياسية هذه بمزيد من التفاصيل مع

38
00:02:52,970 --> 00:02:53,780
‫ملف مثال.

39
00:02:53,840 --> 00:02:55,970
‫تخيلوا أن لدينا لعبة.

40
00:02:56,150 --> 00:03:02,420
‫CP وهي لعبة بسيطة جدًا جدًا لأن كل ما تفعله هو إضافة واحد وواحد معًا ، ولكن لإضافة

41
00:03:02,420 --> 00:03:08,540
‫واحد وواحد معًا يجب استخدام دالة معلنة في ملف مختلف في الرياضيات.

42
00:03:08,780 --> 00:03:10,700
‫ح هكذا تعلن الرياضيات.

43
00:03:10,700 --> 00:03:14,090
‫م ، لكنها لا تحدد في الواقع ما تفعله.

44
00:03:14,090 --> 00:03:16,010
‫لذلك يتم الانتهاء من ذلك في الرياضيات.

45
00:03:16,190 --> 00:03:19,520
‫CP ويمكنك أن ترى أنه تطبيق بسيط للغاية بالفعل.

46
00:03:20,000 --> 00:03:22,700
‫الآن ماذا يحدث في خطوة المعالج المسبق؟

47
00:03:22,700 --> 00:03:28,610
‫حسنًا ، كما قلت ، إنه يتعامل مع أي توجيهات للمعالج المسبق ، وهي الأشياء التي تبدأ بعلامة التجزئة.

48
00:03:28,610 --> 00:03:34,970
‫لذا فإن الهاش يشمل الرياضيات ، والتي تعني في الأساس نسخ كل شيء في الرياضيات إلى هنا.

49
00:03:34,970 --> 00:03:40,700
‫إذن ما يفعله هو أنه يأخذ هذين الملفين ويجمعهما معًا لإنشاء ملف إخراج

50
00:03:40,700 --> 00:03:48,050
‫جديد يسمى Game I تتضمن الألعاب بشكل أساسي ويمكنك أن ترى أنه تم تضمينه في التعريف من Master

51
00:03:48,050 --> 00:03:52,730
‫H واستبداله بتوجيه المعالج المسبق للتجزئة.

52
00:03:52,730 --> 00:04:03,180
‫حتى الآن ، حصلت Game II على تعريف لعملية ADD ثم قمنا بتشغيل المعالج الأولي على الرياضيات DHCP.

53
00:04:03,200 --> 00:04:07,760
‫ولكن نظرًا لعدم وجود أي توجيهات للمعالج المسبق ، لم يتم تغيير أي شيء بشكل أساسي هناك.

54
00:04:08,060 --> 00:04:12,890
‫الخطوة التالية هي على الأرجح أن يكون التجميع هو الخطوة الأكثر

55
00:04:12,890 --> 00:04:21,350
‫أهمية وتعقيدًا ، لأن ما يفعله هو أنه يأخذ C ++ في كل ملف فردي ويحوله إلى ثنائي ، لكنه ليس ثنائيًا كاملاً

56
00:04:21,350 --> 00:04:28,820
‫لأنه على سبيل المثال ، لعبتي ليست في الواقع تعرف كيفية تنفيذ AD ، فهي تعرف فقط شكل وظيفة الإضافة

57
00:04:28,820 --> 00:04:30,620
‫هذه.

58
00:04:30,620 --> 00:04:34,940
‫لذلك يجب ملء ذلك لاحقًا ويتم ملؤه بواسطة الرابط.

59
00:04:34,940 --> 00:04:41,150
‫لذلك سيأخذ الرابط الثنائي الذي تم إنشاؤه لملف كائن اللعبة والثنائي الذي تم إنشاؤه

60
00:04:41,150 --> 00:04:44,810
‫للملف الرئيسي ويجمعهما معًا لإنشاء لعبة.

61
00:04:45,020 --> 00:04:52,010
‫XY الذي يجمع بين الثنائي وأخيرًا هو ملف تنفيذي كامل يمكننا تشغيله بالفعل لأنه

62
00:04:52,010 --> 00:04:55,280
‫يحتوي على تعريف لكل ما يحتاجه.

63
00:04:55,280 --> 00:04:58,730
‫الآن ، لماذا لدينا مثل هذه العملية المعقدة؟

64
00:04:58,730 --> 00:05:03,860
‫الفكرة هنا هي أنها تسرع وقت التجميع لأنني إذا قمت بإجراء تغيير فقط.

65
00:05:04,310 --> 00:05:06,470
‫لعبة DHCP.

66
00:05:06,710 --> 00:05:10,340
‫لا أحتاج في الواقع إلى تشغيل عملية التجميع بأكملها.

67
00:05:10,340 --> 00:05:16,730
‫كل ما علي فعله هو تشغيل البتات التي تتضمن لعبة DHCP ، لذلك كنت أقوم بتشغيل المعالج الأولي على CP فقط

68
00:05:16,760 --> 00:05:23,660
‫، ثم أقوم بتشغيل المحول البرمجي فقط على اللعبة إلى I ومن ثم يمكنني إعادة استخدام ملف obj للرياضيات من قبل.

69
00:05:23,660 --> 00:05:26,960
‫لست بحاجة إلى إعادة تجميعها لأنه لم يتغير شيء في ذلك.

70
00:05:26,960 --> 00:05:33,590
‫وبالمثل ، إذا قمت بتغيير math dot CP فقط ، فلن أضطر إلى إعادة تجميع ملف obj للعبة ، وهذا هو سبب كون

71
00:05:33,590 --> 00:05:37,640
‫هذه العملية أكثر فاعلية ولماذا نقوم بها في المقام الأول.

72
00:05:37,640 --> 00:05:44,630
‫لذا أود أن نجري تجربة صغيرة ونحاول معرفة سبب تضمين تحريك H إلى الداخل

73
00:05:44,630 --> 00:05:46,280
‫ونقل ملف CP؟

74
00:05:46,280 --> 00:05:47,750
‫ما هو سبب ذلك؟

75
00:05:47,750 --> 00:05:51,770
‫لماذا لا يمكننا فقط تجميع ملف C ++ دون تضمين نقله؟

76
00:05:51,770 --> 00:05:56,660
‫H لذا فإن التجربة التي سنقوم بها هي أننا سنقوم بالتعليق على سطر تضمين التجزئة.

77
00:05:56,660 --> 00:06:02,000
‫لذا ، فإن استخدام الشرطة المائلة للأمام مزدوجة لإدخال تعليق أمام هذا السطر ، مما

78
00:06:02,000 --> 00:06:07,340
‫سيجعله يتم تجريده من قبل المعالج بدلاً من المعالج المسبق الذي يستبدله بمحتويات

79
00:06:07,340 --> 00:06:08,060
‫الملف.

80
00:06:08,510 --> 00:06:15,050
‫سنقوم بعد ذلك بإعادة التحويل البرمجي وأود منك إلقاء نظرة على رسائل الخطأ التي تظهر

81
00:06:15,050 --> 00:06:21,110
‫ومعرفة ما تقوله لمعرفة ما إذا كان بإمكانك محاولة وفهم سبب تضمين هذه الخطوة.

82
00:06:21,260 --> 00:06:23,450
‫أوقف الفيديو واذهب.

83
00:06:26,590 --> 00:06:27,030
‫تمام.

84
00:06:27,040 --> 00:06:28,000
‫مرحبًا بعودتك.

85
00:06:28,030 --> 00:06:33,280
‫لذلك دعونا نضع شرطة مائلة مزدوجة في بداية هذا السطر ، مما يجعلها في الأساس لاغية

86
00:06:33,280 --> 00:06:33,870
‫وباطلة.

87
00:06:33,880 --> 00:06:40,450
‫ثم سنقوم بعمل بديل تحكم f 11 وسنلقي نظرة على ناتج البرمجة الحية.

88
00:06:40,450 --> 00:06:44,680
‫انظروا ، لقد حصلنا على بعض الأخطاء على الفور ، في وقت مبكر جدًا.

89
00:06:44,680 --> 00:06:51,160
‫وما يقوله هو أنك لا تحرك فئة أو مجال أسماء وهناك بعض الأشياء الأخرى هنا.

90
00:06:51,160 --> 00:06:56,050
‫إنه يقول أن المكون التكنولوجي الأساسي لم يتم الإعلان عنه أن super ليس فئة أو أن

91
00:06:56,050 --> 00:06:58,360
‫مالك مساحة الاسم هو معرف غير معروف.

92
00:06:58,360 --> 00:07:03,940
‫وبشكل أساسي ما يقوله هذا هو أنك تحدثت عنك هنا ، لكنك لم تحدده في أي مكان ،

93
00:07:03,940 --> 00:07:05,920
‫ولم تعلن عنه في أي مكان.

94
00:07:05,920 --> 00:07:07,240
‫لذا لا أعلم.

95
00:07:07,240 --> 00:07:11,560
‫مترجم C ++ يقول ، لا أعرف ما هذا.

96
00:07:11,560 --> 00:07:18,250
‫هذا هو سبب وجود التجزئة ، بما في ذلك المحرك H لأن المحرك H يعلن الفئة.

97
00:07:18,250 --> 00:07:25,780
‫تقول أن محرك U عبارة عن فئة وهي مشتقة من قيامك بتشغيل مكون ولديه هذه الأساليب ، وما إلى ذلك.

98
00:07:25,780 --> 00:07:28,480
‫إنه يعلن ما يعنيه أن تكون تلك الطبقة.

99
00:07:28,480 --> 00:07:32,440
‫لذلك بدون هذا الإعلان ، لا يمكن لمترجم C ++ المتابعة.

100
00:07:32,440 --> 00:07:36,160
‫ولهذا السبب نحتاج إلى تضمين ملف الرأس هذا.

101
00:07:36,760 --> 00:07:37,240
‫أشياء عظيمة.

102
00:07:37,240 --> 00:07:44,920
‫لذلك نأمل أن تفهم الآن بشكل أفضل قليلاً العملية التي ينطوي عليها تجميع C ++

103
00:07:44,920 --> 00:07:47,890
‫وخاصة تجميع C ++ في Unreal.

104
00:07:47,920 --> 00:07:49,810
‫سأراك في المحاضرة القادمة.

