Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Отладка программы во время работы с 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]

Писать лог сложнее. Лог подробнее.


Наверх

Титульная страница Поиск, карта сайта Написать письмо