Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Вниз

Вылет   Найти похожие ветки 

 
cyborg   (2003-05-14 11:36) [0]

Проблема, незнаю как вылечить.

По таймеру обрабатываются объекты, а в главном цикле программы идёт рендеринг, так вот, по моим полуподтверждённым подозрениям вылетает, когда рендеринг в обработке и в этот момент по таймеру начинается обработка всех объектов в игре. У меня при обработке по таймеру устанавливается флаг, что идёт обработка, по концу обработки он сбрасывается, при начле рендеринга если установлен флаг что объекты обрабатываются, то не рендерится ничего, но могут возникать ситуации, когда рендеринг проверил флаг, флаг указывает, что можно рендерить и в процессе рендеринга по таймеру начинают обрабатываться объекты и , думаю, в одном из таких моментов вылетает, возможно код обработки изменяет объект, создаёт или его удаляет, а рендеринг как раз попадает на этот объект. Сделать флаг рендеринга не могу, так, как таймер должен стабильно обрабатывать свои 25 проходов в секунду.

Ваши мнения как сделать и исправить?


 
cyborg   (2003-05-14 17:54) [1]

Сейчас уже на 98% уверен, что глюк из за неведания двух процессов, процесс рендеринга незнает когда процесс обработки влезет в данные объектов. Когда ставлю малое число просчётов в секунду, то ошибка обращения к памяти освобождённого объекта появляется в начале процедуры вывода спрайта, если поставить большее число расчётов/с, то ошибка может появиться и в середине и в конце процедуры вывода. Т.е. больше шансов, что объект будет удалён (освобождена память) во время его вывода на экран. Вот такая байда. Чего делать незнаю. :(


 
neuro   (2003-05-14 19:00) [2]

А собственно почему не можешь сделать флаг рендеринга? Если он установлен, то пусть себе таймер работает, а ты жди пока отрендериться и уже потом удаляй все. Кстати, а почему два процесса? Если такая жесткая линейная зависимость, то лучше сделать это в одном флаконе -- рендерить сразу и строго после обработки объектов.

Или попробуй останавливать рендеринг, если таймер срабатывает..


 
cyborg   (2003-05-14 19:38) [3]

Сейчас объясню.
Обработка анимации и движений объектов, поиск пути и пр. делаются по таймеру, 25 раз в секунду. А рендерится всё это дело уже в главном цикле программы постоянно, какая бы ни была скорость рендеринга игра будет идти с одинаковой скоростью 25 кадров.
Когда идёт обработка объектов, устанавливается флаг, что идёт обработка объектов :), функция рендеринга смотрит, если объекты не обрабатываются, то можно выводить на экран. Если сделать флаг рендеринга и проверять по нему можно ли обрабатывать объекты, то уже не будет 25 кадров обработки, будет меньше, скорость игры соответственно будет разная.


 
neuro   (2003-05-14 19:48) [4]

гмм..имхо, такое либо невозможно, либо возможно лишь для некоторого фиксированного времени (т.е. максимального времени нужного ДАННОЙ видюхе на отрисовку изображения). Попробуй объектов поменьше юзать..

Есть маза такая: перед каждым изменением множества объектов сделать его копию. И рендерить уже оттуда. И пока флаг рендеринга (который все-таки надо сделать) стоит, список этот (дополнительный) не менять.Тогда будет запаздывание на пару кадров, но уверенность, что все объекты есть. Но это компромисс, так как за два тика таймера можно не успеть все отрендерить.И тогда запаздывание расти будет.

Можно поиграться еще с запоминанием списка измененных объектов.

Но вообще тебе скорее к "параллельным" программистам.


 
cyborg   (2003-05-14 20:04) [5]

В общем хрень такая:

Вот начало функции вывода спрайта:

Function ShowSpriteFast(Var Sprite : PSprite; ScreenCoord : boolean = false; Monster : boolean = true) : Cardinal;
Var
SrcRect : TRect;
X,Y : LongInt;
begin
Result:=0;
if (Sprite=nil) or (ProcessSprites) then exit;
if (Sprite^.Surface=Nil) then exit;

X:=Sprite^.X;
Y:=Sprite^.Y;


как видно вначале идёт проверка на существование спрайта if (Sprite=nil) и после поисков данного глюка включил ещё проверку в отрисовке каждого спрайта на то можно его трогать или он в процессе обработки or (ProcessSprites).

Вот вроде всё нормально, и спрайт не nil и рисовать можно и бац, на следующей строке спрайт уже удалён :) if (Sprite^.Surface=Nil) вызывает ацес виолатион, т.е. этот спрайт в процедурах обработки объектов удалён, память освобождена и обнулён указатель. Может и не в этом месте появиться, а например на X:=Sprite^.X; или ещё дальше, один раз вышло когда я уже делаю его FDDSBuffer.BltFast


 
neuro   (2003-05-14 20:54) [6]

А ты перед каждой операцией поставь if Sprite <> nil then
Вообще перед каждой. Будет тормозно конечно, зато не должно глючить.
Или попробуй так:
if sprite<>nil then <тут полностью копируем sprite в spriteNew> и ( жаль нету метода у процесса такого: process.ifMemoryStateChanged =) А ты перед каждой операцией поставь if Sprite <> nil then
Вообще перед каждой. Будет тормозно конечно, зато не должно глючить.
Или попробуй так:
if sprite<>nil then <тут полностью копируем sprite в spriteNew> и дальше обрабатываем spriteNew. Типа так. Только надо именно копировать спрайт, а не указатель на него =).

(жаль нету метода у процесса такого: process.ifMemoryStateChanged =))


 
neuro   (2003-05-14 20:57) [7]

А вообще можно ли интересно винде сказать, что такие-то участки памяти заблокированы и если например какой-то участок заблокирован, то все обращения к нему обламывать без exception"а. Типа механизм "к вам можно?"


 
cyborg   (2003-05-15 00:24) [8]

Так я эту проблему не решил :(. От копирования данных отказался, из за тормознутости и заведомым провалом данного предприятия, если за одно сравнение успевает объект удалить, то что будет с копированием этого объекта.

Эх, придётся фиксированные FPS делать, 33 кадра, сначала считает, потом выводит на экран, в этом есть большой плюс, ресурсы системы от такого режима отдыхают ~10-15%% СPU всего занято.


 
neuro   (2003-05-15 09:42) [9]

А чтой-то ты на 25 кадре так заморочился? =)

диверсию готовишь? =)))



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2003.11.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
7-56923
Ihor Osov'yak
2003-09-08 12:20
2003.11.17
COM, ActiveX и записи в реестре..


4-56954
Dark Elf
2003-09-22 12:55
2003.11.17
Открытие Help-файла


3-56459
DimChan
2003-10-29 09:12
2003.11.17
AccessViolation


14-56917
}|{yk
2003-10-24 16:53
2003.11.17
Как размножаются кроты?


6-56793
Vint45
2003-09-20 13:33
2003.11.17
Переменные окружения и CGI





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский