Форум: "Игры";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизОтладка программы во время работы с DirectX Найти похожие ветки
← →
Zergling © (2003-10-07 12:29) [0]День добрый, гаспода и дамы! Вопрос в следующем. Как можно удобно отлаживать программу во время работы с DirectX. Программа работает в полноэкранном режиме. Напимер у меня вылетает программа на некой строчке и среду разработки мне соотвественно не видно (по Alt+Tab не катит). Пока обхожусь ведением простенького лога ошибок. Как мне увидеть/определить где вылетела программка. Поделитесь опытом. Заранее спасибо за помошь.
← →
pasha_676 © (2003-10-07 12:35) [1]Писать лог сложнее. Лог подробнее.
← →
cyborg © (2003-10-07 12:36) [2]Запускай программу не из Дельфи, а скомпиленную. При ошибке тебе сообщат адрес этой самой ошибки, затем ставьшб точку прерывания в саомо начале работы программы, когда вообще ничего не делается, т.е. до инициализации DirectX. В меню Search-FindError- введи адрес ошибки и попадёшь на ту строчку.
← →
cyborg © (2003-10-07 12:37) [3]елки, буквы опечатались :)
← →
cyborg © (2003-10-07 13:07) [4]Совет, убери из проекта модуль Classes, пока он тебе вообще не нужен, только ради стринглиста, вот тебе мой модуль для ведения логов:
unit GameLogger;
interface
//Ведение лог-файла
uses
SysUtils;
procedure LogError( ErrorMessage : string; Location : string ); //Вывод в файл ошибки
procedure LogWarning( WarningMessage : string; Location : string );//Вывод в файл предупреждения
procedure LogStatus( StatusMessage : string; Location : string ); //Вывод в файл статуса программы
Var
IPFile : Text;
implementation
var
LogFile : Text; //Указатель на файл
procedure LogError(ErrorMessage, Location: string);
begin
WriteLn(LogFile,"ОШИБКА: [ " + TimeToStr(Time) + " ] Сообщение: -="+ErrorMessage+"=- "+ Location);
Flush(LogFile);
end;
procedure LogStatus(StatusMessage, Location: string);
begin
WriteLn(LogFile,"СТАТУС: [ " + TimeToStr(Time) + " ] Сообщение: -="+StatusMessage+"=- "+ Location);
Flush(LogFile);
end;
procedure LogWarning(WarningMessage, Location: string);
begin
WriteLn(LogFile,"ВНИМАНИЕ: [ " + TimeToStr(Time) + " ] Сообщение: -="+WarningMessage+"=- "+ Location);
Flush(LogFile);
end;
initialization
begin
AssignFile(LogFile,"LogFile.txt");
Rewrite(LogFile);
LogStatus( "Старт программы", "Initialization GameLogger unit" );
end;
finalization
begin
LogStatus( "Завершение программы", "Finalization GameLogger unit" );
Flush(LogFile);
CloseFile(LogFile);
end;
end.
← →
cyborg © (2003-10-07 13:10) [5]Var
IPFile : Text;
тут не нужно
← →
Zergling © (2003-10-07 13:11) [6]cyborg ©
Спасибо. Будет время поэксперементирую :)
← →
NailMan © (2003-10-07 13:14) [7]Я для отлова багов юзаю оконный режим и не маюсь насчет alt+tab ж-)
Естественно рядовому юзверю этот режим уже будет недоступен(есть некая сильная защита) и ему доступно тольно FullScreen.
Собсно лог у меня тоже ведется - подробнейший(если включен DEV_MODE) или не очень. В подробный лог заносится какие текстуры грузятся, какие объекты создаются(тип объекта, координаты etc)+ много чего еще второстепенного, которое позволяет отловить какой-то баг. Каждая операция D3D сопровождается записью статуса SUCCESS.
Вот пример моего лога запущенного на машине которая у меня на работе(видяха встроенная i815) лог прервался на какой-то ошибке(видимо из-за этого кривого железа) и теперь можно будет чё-то понять:
http://nailman.narod.ru/Zakroma/utlogging.log
Так что советую делать возможность и оконного режима благо разница при создании окна минимальна, вот даже прототип функции создания окна:
Procedure CreateMainWindow(FullScreen:Boolean);
begin
with WndClass do begin // Window parameters
style := CS_VREDRAW or CS_HREDRAW;
lpfnWndProc := @WndProc;
cbClsExtra := 0;
cbWndExtra := 0;
WndClass.hInstance := HInstance;
hIcon := LoadIcon(HInstance, IDI_APPLICATION);
hCursor := LoadCursor(HInstance, IDC_ARROW);
hbrBackground := GetStockObject(BLACK_BRUSH);
lpszMenuName := nil;
lpszClassName:= @AppName;
end;
RegisterClass(WndClass);
If FullScreen then
Handle:=CreateWindowEx(WS_EX_TOPMOST, @AppName, "Universal Traveller: Space Pyrate", WS_POPUP, 0, 0,
ScreenWidth,ScreenHeight, 0, 0, HInstance, nil)
else
Handle:=CreateWindow(@AppName,"Universal Traveller: Space Pyrate",CW_USEDEFAULT, 0, 0, ScreenWidth, ScreenHeight, 0, 0, HInstance, nil);
end;
Ну и добавить указания WINDOWED в D3DPresentParam`s.
← →
Zergling © (2003-10-07 13:26) [8]NailMan © (07.10.03 13:14) [7]
Тоже попробуем.
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c