отображается всплывающее сообщение, что, когда сбой происходит утверждение в masterserver.exe
. Ошибка указывает на ошибку кода, поскольку она проверяет условие во время компиляции, которое, как ожидается, всегда будет истинным во время выполнения, но вместо этого условие было фактически неверным.
В этом случае ошибка произошла в CCRakNetUDT::OnAck()
в ccraknetudt.cpp
на линии 528. Эта линия звонит RakAssert(rtt < 10000000);
, где rtt
является входным параметром для OnAck()
. Утверждение состоит в том, что значение rtt
всегда должно быть меньше 10000000
, но на самом деле этого не было.
void CCRakNetUDT::OnAck(CCTimeType curTime, CCTimeType rtt, bool hasBAndAS, BytesPerMicrosecond _B, BytesPerMicrosecond _AS, double totalUserDataBytesAcked, bool isContinuousSend, DatagramSequenceNumberType sequenceNumber)
{
#if CC_TIME_TYPE_BYTES==4
RakAssert(rtt < 10000);
#else
RakAssert(rtt < 10000000); // <-- line 528
#endif
При компиляции отладочной сборки masterserver.exe
для других, чем Xbox платформ, RakAssert()
карты к assert()
, в противном случае она является не-оп:
RakAssert.h
#include <assert.h>
#include "RakNetDefines.h"
RakNetDefines. h
#ifndef RakAssert
#if defined(_XBOX) || defined(X360)
#else
#if defined(_DEBUG)
#define RakAssert(x) assert(x);
#else
#define RakAssert(x)
#endif
#endif
#endif
За assert()
documentation:
Вычисляет выражение и, когда результат является ложным, печатает диагностическое сообщение и прерывает программу.
...
утверждают макрос обычно используется для определения логических ошибок в процессе разработки программы. Используйте его, чтобы остановить выполнение программы, когда возникли непредвиденные условия, реализовав аргумент выражения для вычисления false, только когда программа работает некорректно. Проверки утверждений можно отключить во время компиляции, определяя макрос NDEBUG
. Вы можете отключить макрос assert без изменения исходных файлов с помощью параметра командной строки /DNDEBUG
. Вы можете отключить макрос assert в исходном коде, используя директиву #define NDEBUG
до того, как <assert.h>
включен.
Утверждающий макрос распечатывает диагностическое сообщение, когда выражение оценивает значение false (0) и вызывает abort
, чтобы завершить выполнение программы. Никакое действие не выполняется, если выражение истинно (отличное от нуля). Диагностическое сообщение включает в себя несостоявшееся выражение, имя исходного файла и номер строки, где утверждение не выполнено.
...
Пункт назначения диагностического сообщения зависит от типа приложения, вызывающего эту процедуру. Консольные приложения всегда получают сообщение через stderr
. В приложении на базе Windows assert
вызывает функцию Windows MessageBox
, чтобы создать окно сообщения, отображающее сообщение вместе с кнопкой OK
. Когда пользователь нажимает OK
, программа прерывается сразу.
Когда приложение связано с отладочной версии библиотек времени выполнения, assert
создает окно сообщения с тремя кнопками: Abort
, Retry
и Ignore
. Если пользователь нажимает Abort
, программа прерывается немедленно. Если пользователь нажимает Retry
, вызывается отладчик, и пользователь может отлаживать программу, если включена отладка «точно в срок» (JIT). Если пользователь нажимает Ignore
, assert
продолжает свое нормальное выполнение: создание окна сообщения с помощью кнопки OK
. Обратите внимание, что нажатие Ignore
, когда существует условие ошибки, может привести к неопределенному поведению.
...
assert
макрос включен в обоих версиях выпуска и отладки библиотек времени выполнения C, когда NDEBUG
не определен. Когда определено значение NDEBUG
, макрос доступен, но не оценивает его аргумент и не имеет эффекта. Когда он включен, макрос assert
вызывает _wassert
для его реализации. Другие макросы утверждения, _ASSERT
, _ASSERTE
и _ASSERT_EXPR
, также доступны, но они только оценивают выражения, переданные им, когда макрос _DEBUG
был определен и когда они находятся в коде, связанном с версией отладки библиотек времени выполнения C.
Итак, если вы хотите отключить эту конкретную всплывающее сообщение об ошибке, вам необходимо либо:
найти причину ошибки и исправить ее (или обратитесь к автору Unity, чтобы исправить это) , так как это ошибка кода.
скомпилировать masterserver.exe
для выпуска вместо отладки, поэтому RakAssert()
не является оператором.
определяет NDEBUG
в исходном коде, в решении проекта, или с помощью переключателя /D
компилятора в командной строке, так assert()
является не оп.
Просто знайте, что отключение утверждения может привести к сбою или неправильному действию приложения, если ошибка повторится.
Поскольку в самом скрипте нет такого приглашения, он должен быть сам мастер-мастер, выполняющий приглашение перед выходом. Есть ли параметр командной строки для отключения приглашения? –
Я загружаю его здесь http: // unity3d.com/master-server и скомпилировать с визуальной студией, тогда я просто запускаю exe с этой партией, не знаю о параметре командной строки – xlee