استعلامات الأداء من جانب الخادم
يعد أداء العرض الجيد على الخادم أمرا بالغ الأهمية لمعدلات إطارات مستقرة وتجربة مستخدم جيدة. من المهم مراقبة خصائص الأداء على الخادم بعناية وتحسينها عند الضرورة. يمكن الاستعلام عن بيانات الأداء من خلال وظائف API المخصصة.
الأكثر تأثيرا على أداء العرض هو بيانات إدخال النموذج. يمكنك تعديل بيانات الإدخال كما هو موضح في تكوين تحويل النموذج.
قد يكون أداء التطبيق من جانب العميل عنق الزجاجة أيضا. للحصول على تحليل متعمق للأداء من جانب العميل ، يوصى بإجراء تحليل performance trace.
المخطط الزمني للعميل/الخادم
قبل الخوض في التفاصيل المتعلقة بقيم الكمون المختلفة ، من المفيد إلقاء نظرة على نقاط المزامنة بين العميل والخادم على المخطط الزمني:

يوضح الرسم التوضيحي كيفية:
- يبدأ العميل تقدير الوضع بمعدل إطارات ثابت يبلغ 60 هرتز (كل 16.6 مللي ثانية)
- ثم يبدأ الخادم في العرض ، استنادا إلى الوضع
- يرسل الخادم صورة الفيديو المشفرة مرة أخرى
- يقوم العميل بفك تشفير الصورة ، ويقوم ببعض أعمال وحدة المعالجة المركزية ووحدة معالجة الرسومات فوقها ثم يعرض الصورة
استعلامات إحصائيات الإطار
توفر إحصائيات الإطار بعض المعلومات عالية المستوى للإطار الأخير، مثل زمن الاستجابة. يتم قياس البيانات المقدمة في FrameStatistics الهيكل على جانب العميل ، وبالتالي فإن واجهة برمجة التطبيقات هي مكالمة متزامنة:
void QueryFrameData(RenderingSession session)
{
FrameStatistics frameStatistics;
if (session.GraphicsBinding.GetLastFrameStatistics(out frameStatistics) == Result.Success)
{
// do something with the result
}
}
void QueryFrameData(ApiHandle<RenderingSession> session)
{
FrameStatistics frameStatistics;
if (session->GetGraphicsBinding()->GetLastFrameStatistics(&frameStatistics) == Result::Success)
{
// do something with the result
}
}
يحتوي الكائن المسترد FrameStatistics على الأعضاء التاليين:
| عضو | التوضيح |
|---|---|
| زمن الوصول PoseToReceive | زمن الوصول من تقدير وضع الكاميرا على الجهاز العميل حتى يكون إطار الخادم لهذه الوضعية متاحا بالكامل لتطبيق العميل. تتضمن هذه القيمة الشبكة ذهابا وإيابا ووقت عرض الخادم وفك تشفير الفيديو وتعويض الاهتزاز. انظر الفاصل الزمني 1 في الرسم التوضيحي أعلاه. |
| زمن الاستجابةالاستقبالإلى الحاضر | زمن الوصول من توفر إطار بعيد مستلم حتى يقوم تطبيق العميل باستدعاء PresentFrame على وحدة المعالجة المركزية. انظر الفاصل الزمني 2 في الرسم التوضيحي أعلاه. |
| الكمونPresentToDisplay | الكمون من تقديم إطار على وحدة المعالجة المركزية حتى تضيء الشاشة. تتضمن هذه القيمة وقت وحدة معالجة الرسومات العميلة، وأي تخزين مؤقت للإطار يتم إجراؤه بواسطة نظام التشغيل، وإعادة عرض الأجهزة، ووقت فحص الشاشة المعتمد على الجهاز. انظر الفاصل الزمني 3 في الرسم التوضيحي أعلاه. |
| الوقتمنذالأخيرالحاضر | الوقت بين المكالمات اللاحقة إلى PresentFrame على وحدة المعالجة المركزية. تشير القيم الأكبر من مدة العرض (على سبيل المثال 16.6 مللي ثانية على جهاز عميل 60 هرتز) إلى المشكلات الناجمة عن عدم إنهاء تطبيق العميل لعبء عمل وحدة المعالجة المركزية في الوقت المناسب. |
| فيديوالإطاراتالمستلمة | عدد الإطارات المستلمة من الخادم في الثانية الأخيرة. |
| فيديوالإطاراتإعادة الاستخدامالعد | عدد الإطارات المستلمة في الثانية الأخيرة التي تم استخدامها على الجهاز أكثر من مرة. تشير القيم غير الصفرية إلى أنه كان لا بد من إعادة استخدام الإطارات وإعادة إسقاطها إما بسبب توتر الشبكة أو وقت عرض الخادم المفرط. |
| فيديوالإطاراتتخطي | عدد الإطارات المستلمة في الثانية الأخيرة التي تم فك تشفيرها، ولكن لم يتم عرضها على الشاشة بسبب وصول إطار أحدث. تشير القيم غير الصفرية إلى أن اهتزاز الشبكة تسبب في تأخير إطارات متعددة ثم وصولها إلى الجهاز العميل معا في تتابع. |
| فيديوالإطاراتتم التخلص منها | يشبه إلى حد كبير VideoFramesSkipped ، ولكن سبب التخلص منه هو أن الإطار جاء متأخرا جدا بحيث لا يمكن حتى ربطه بأي وضع معلق بعد الآن. إذا حدث هذا التجاهل ، فهناك بعض الخلاف الشديد على الشبكة. |
| فيديوالإطارميندلتا | الحد الأدنى من الوقت بين إطارين متتاليين يصلان خلال الثانية الأخيرة. جنبا إلى جنب مع VideoFrameMaxDelta ، يعطي هذا النطاق مؤشرا على التوتر الناجم إما عن الشبكة أو برنامج ترميز الفيديو. |
| فيديوفريمماكس دلتا | الحد الأقصى للوقت بين إطارين متتاليين يصلان خلال الثانية الأخيرة. جنبا إلى جنب مع VideoFrameMinDelta ، يعطي هذا النطاق مؤشرا على التوتر الناجم إما عن الشبكة أو برنامج ترميز الفيديو. |
عادة ما يكون مجموع جميع قيم الكمون أكبر بكثير من وقت الإطار المتاح عند 60 هرتز. لا بأس بذلك، لأن إطارات متعددة في حالة طيران بالتوازي، ويتم بدء طلبات الإطارات الجديدة بمعدل الإطارات المطلوب، كما هو موضح في الرسم التوضيحي. ومع ذلك ، إذا أصبح زمن الوصول كبيرا جدا ، فإنه يؤثر على جودة إعادة الإسقاط في المرحلة المتأخرة ، وقد يعرض التجربة الشاملة للخطر.
VideoFramesReceivedVideoFramesDiscarded، VideoFrameReusedCountويمكن استخدامها لقياس أداء الشبكة والخادم. يمكن أن يشير الجمع بين القيمة المنخفضة VideoFramesReceived والقيمة العالية VideoFrameReusedCount إلى ازدحام الشبكة أو ضعف أداء الخادم. تشير القيمة العالية VideoFramesDiscarded أيضا إلى ازدحام الشبكة.
أخيرا ،TimeSinceLastPresent، VideoFrameMinDeltaوإعطاء فكرة عن تباين إطارات الفيديو الواردة والمكالمات VideoFrameMaxDelta المحلية الحالية. التباين العالي يعني معدل الإطارات غير المستقر.
لا تعطي أي من القيم المذكورة أعلاه مؤشرا واضحا على زمن انتقال الشبكة النقي (الأسهم الحمراء في الرسم التوضيحي) ، لأن الوقت الدقيق الذي ينشغل فيه الخادم بالعرض يحتاج إلى طرحه من قيمة LatencyPoseToReceiveذهابا وإيابا . الجزء من جانب الخادم من زمن الوصول الإجمالي هو المعلومات غير المتوفرة للعميل. ومع ذلك، تشرح الفقرة التالية كيفية تقريب هذه القيمة من خلال إدخال إضافي من الخادم وعرضها من خلال القيمة NetworkLatency .
استفسارات تقييم الأداء
توفر استعلامات تقييم الأداء معلومات أكثر تعمقا حول عبء عمل وحدة المعالجة المركزية ووحدة معالجة الرسومات على الخادم. نظرا لأن البيانات مطلوبة من الخادم ، فإن الاستعلام عن لقطة أداء يتبع نمط عدم المزامنة المعتاد:
async void QueryPerformanceAssessment(RenderingSession session)
{
try
{
PerformanceAssessment result = await session.Connection.QueryServerPerformanceAssessmentAsync();
// do something with result...
}
catch (RRException ex)
{
}
}
void QueryPerformanceAssessment(ApiHandle<RenderingSession> session)
{
session->Connection()->QueryServerPerformanceAssessmentAsync([](Status status, PerformanceAssessment result) {
if (status == Status::OK)
{
// do something with result...
}
});
}
على عكس الكائن FrameStatistics ، يحتوي الكائن على معلومات من جانب الخادم PerformanceAssessment :
| عضو | التوضيح |
|---|---|
| TimeCPU | متوسط وقت وحدة المعالجة المركزية للخادم لكل إطار بالمللي ثانية |
| TimeGPU | متوسط وقت وحدة معالجة الرسومات للخادم لكل إطار بالمللي ثانية |
| استخداموحدة المعالجة المركزية | إجمالي استخدام وحدة المعالجة المركزية للخادم في النسبة المئوية |
| استخدامGPU | إجمالي استخدام وحدة معالجة الرسومات للخادم في النسبة المئوية |
| الذاكرةوحدة المعالجة المركزية | إجمالي استخدام الذاكرة الرئيسية للخادم في النسبة المئوية |
| الذاكرةGPU | إجمالي استخدام ذاكرة الفيديو المخصصة في النسبة المئوية لوحدة معالجة الرسومات الخاصة بالخادم |
| زمن انتقال الشبكة | المتوسط التقريبي لزمن انتقال الشبكة ذهابا وإيابا بالمللي ثانية. في الرسم التوضيحي أعلاه، تتوافق هذه القيمة مع مجموع الأسهم الحمراء. يتم حساب القيمة عن طريق طرح وقت تقديم الخادم الفعلي من LatencyPoseToReceive قيمة FrameStatistics. على الرغم من أن هذا التقريب غير دقيق ، إلا أنه يعطي بعض المؤشرات على زمن انتقال الشبكة ، معزولا عن قيم الكمون المحسوبة على العميل. |
| مضلعات مقدمة | عدد المثلثات المقدمة في إطار واحد. يتضمن هذا الرقم أيضا المثلثات التي يتم إعدامها لاحقا أثناء العرض. وهذا يعني أن هذا الرقم لا يختلف كثيرا عبر مواضع الكاميرا المختلفة ، ولكن الأداء يمكن أن يختلف اختلافا كبيرا ، اعتمادا على معدل إعدام المثلث. |
لمساعدتك في تقييم القيم ، يأتي كل جزء مع تصنيف جودة مثل رائع أو جيدأو متوسط أو سيء. يوفر مقياس التقييم هذا مؤشرا تقريبيا على صحة الخادم ، ولكن لا ينبغي اعتباره مطلقا. على سبيل المثال، افترض أنك ترى درجة "متوسطة" لوقت وحدة معالجة الرسومات. يعتبر متوسطا لأنه يقترب من الحد الأقصى لميزانية الإطار الزمني الإجمالية. ومع ذلك ، في حالتك ، قد تكون قيمة جيدة مع ذلك ، لأنك تقدم نموذجا معقدا.
إخراج تصحيح أخطاء الإحصاءات
الفئة ServiceStatistics عبارة عن فئة C # تلتف حول كل من إحصائيات الإطار واستعلامات تقييم الأداء وتوفر وظائف ملائمة لإرجاع الإحصاءات كقيم مجمعة أو كسلسلة تم إنشاؤها مسبقا. التعليمة البرمجية التالية هي أسهل طريقة لإظهار الإحصائيات من جانب الخادم في تطبيق العميل.
ServiceStatistics _stats = null;
void OnConnect()
{
_stats = new ServiceStatistics();
}
void OnDisconnect()
{
_stats = null;
}
void Update()
{
if (_stats != null)
{
// update once a frame to retrieve new information and build average values
_stats.Update(Service.CurrentActiveSession);
// retrieve a string with relevant stats information
InfoLabel.text = _stats.GetStatsString();
}
}
تقوم التعليمة البرمجية أعلاه بتعبئة التسمية النصية بالنص التالي:

تقوم GetStatsString واجهة برمجة التطبيقات بتنسيق سلسلة من جميع القيم، ولكن يمكن أيضا الاستعلام عن كل قيمة واحدة برمجيا من المثيل ServiceStatistics .
هناك أيضا متغيرات من الأعضاء ، والتي تجمع القيم بمرور الوقت. راجع الأعضاء الذين لديهم لاحقة *Avg، *Maxأو *Total. يشير العضو FramesUsedForAverage إلى عدد الإطارات التي تم استخدامها لهذا التجميع.
مستندات API.
- C# RenderingConnection.QueryServerPerformanceAssessmentAsync()
- C++ RenderingConnection::QueryServerPerformanceAssessmentAsync()