Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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
4-1075554927
alex732
2004-01-31 16:15
2004.04.11
Нажать кнопку мыши в окне чужого приложения


3-1079461757
ginger
2004-03-16 21:29
2004.04.11
Quick Report для базы Unicode


1-1080126192
lena19
2004-03-24 14:03
2004.04.11
DELPHI8 NET


1-1082451436
Alexander_Marchenko
2004-04-20 12:57
2004.04.11
TreeView


3-1081458389
Igoryok
2004-04-09 01:06
2004.04.11
Как вызвать функцию из Access





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский