![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Отладка программы во время работы с DirectX [Delphi, Windows]
Zergling © (2003-10-07 12:29:00)День добрый, гаспода и дамы! Вопрос в следующем. Как можно удобно отлаживать программу во время работы с DirectX. Программа работает в полноэкранном режиме. Напимер у меня вылетает программа на некой строчке и среду разработки мне соотвественно не видно (по Alt+Tab не катит). Пока обхожусь ведением простенького лога ошибок. Как мне увидеть/определить где вылетела программка. Поделитесь опытом. Заранее спасибо за помошь.
Zergling (2003-10-07 13:26:00) [1]NailMan © (07.10.03 13:14) [7]
Тоже попробуем.
NailMan (2003-10-07 13:14:00) [2]Я для отлова багов юзаю оконный режим и не маюсь насчет 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:11:00) [3]cyborg ©
Спасибо. Будет время поэксперементирую :)
cyborg (2003-10-07 13:10:00) [4]Var
IPFile : Text;
тут не нужно
cyborg (2003-10-07 13:07:00) [5]Совет, убери из проекта модуль 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 12:37:00) [6]елки, буквы опечатались :)
cyborg (2003-10-07 12:36:00) [7]Запускай программу не из Дельфи, а скомпиленную. При ошибке тебе сообщат адрес этой самой ошибки, затем ставьшб точку прерывания в саомо начале работы программы, когда вообще ничего не делается, т.е. до инициализации DirectX. В меню Search-FindError- введи адрес ошибки и попадёшь на ту строчку.
pasha_676 (2003-10-07 12:35:00) [8]Писать лог сложнее. Лог подробнее.