Суббота
27.04.2024
00:59
Поиск
Вход на сайт
Логин:
Пароль:
Мини-чат
Друзья сайта

Проект "Ангор"

[ Обновленные темы · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Модератор форума: Gexon, angor, bindlestiff  
Ангорум » Проект "Ангор" - общий раздел » Обсуждаем новые и старые версии Ангора » Версия от 17 июля 2009 (релиз)
Версия от 17 июля 2009
angorДата: Воскресенье, 19.07.2009, 00:19 | Сообщение # 16
Admin
Группа: Папа енот
Сообщений: 27
Статус: Offline

- не знаю, откуда такое берется... у меня нет такого.

чтоб отображало, перезалил на наш сайт. в раздел фотоальбом

 
wolfRAMMДата: Воскресенье, 19.07.2009, 00:33 | Сообщение # 17
Ангор
Группа: Убитый енот
Сообщений: 34
Статус: Offline
Quote (Gexon)
подозреваю что это модуль GUI. смотрел, дык там никак ресурсы не освобождаются... как руками дописать не знаю.... исходник прилагаю

Дружище, подозреваю что проблема все-таки в твоем коде, а не в стороннем движке ;)
Quote (Gexon)
for I := 0 to GUI.Count do GUI.List[i].Free;

а теперь посмотри как это делаеться в procedure CGUIEngine.DelElement;
Begin
Del( Element.ID );
End;
Code
procedure CSpriteEngine.Del( ID : Integer );
   var
     i : Integer;
Begin
if Count = 0 Then exit;
DEC( Count );
i := List[ ID ].ID;
List[ ID ].Freeing;
List[ ID ].Destroy;
for i := ID to Count - 1 do
   begin
     List[ i ]    := List[ i + 1 ];
     List[ i ].ID := List[ i ].ID - 1;
   end;

for i := 0 to Count - 1 do
   DrawList[ i ] := List[ i ].ID;
End;

Тоисть как минимум вызываеться деструктор CSprite.
Попробуй for I := 0 to GUI.Count - 1 do GUI.DelElement(List[i])

Кстати странный этот движок. По идее лист должен был очищаться и при простом GUI.Free - а такого деструктора я в исходниках не вижу...

Сообщение отредактировал wolfRAMM - Воскресенье, 19.07.2009, 00:47
 
GexonДата: Воскресенье, 19.07.2009, 00:36 | Сообщение # 18
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
В самом начале, когда я еще ничего не использовал из модуля GUI Омеги, а просто добавлял его в проект, оно уже жрало память и не освобождало его.

я с помощью инструкции:

Code
for I := 0 to GUI.Count do GUI.List[i].Free;

освобождаю все что использовал, а память все равно уходит куда-то...

---------------
что это за GUI элемент, и откуда он взялся....

 
wolfRAMMДата: Воскресенье, 19.07.2009, 03:03 | Сообщение # 19
Ангор
Группа: Убитый енот
Сообщений: 34
Статус: Offline
Quote (Gexon)
В самом начале, когда я еще ничего не использовал из модуля GUI Омеги, а просто добавлял его в проект, оно уже жрало память и не освобождало его.

А может дело в
Code
initialization
   GUI          := CGUIEngine.Create;
   GlobalParent := CGUIElement.Create;
   GlobalParent.Enabled := FALSE;
   GlobalParent.Visible := FALSE;
   GlobalParent.X := 0;
   GlobalParent.Y := 0;
end.

Ты освобождаешь GlobalParent?

П.с. конечно вместо uGUIEngine.pas ты бы лучше опубликовал окресности "for I := 0 to GUI.Count...."

 
GexonДата: Воскресенье, 19.07.2009, 03:33 | Сообщение # 20
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
uGUIEngine.pas - это не мной написано.
прилагается к Омеге
 
wolfRAMMДата: Воскресенье, 19.07.2009, 11:09 | Сообщение # 21
Ангор
Группа: Убитый енот
Сообщений: 34
Статус: Offline
Да знаю я )) Я это понял, когда не нашел в нем той строки, где ты очищаешь. Так что сразу скачал сдк и исходники омеги. Еще сайт ихний не так просто найти - гугл битые ссылки выдает.
Так что там с курсором и с этим глюком - ты пробовал то что я советовал?
 
GexonДата: Воскресенье, 19.07.2009, 15:42 | Сообщение # 22
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
по курсору:
сделал как ты подсказал...
только не понятно немного,

1.

Code
msg = 0x0020
не принимает сравнение. поставил число 32.
2. не пойму что передавать в процедуру SetCursor(); если ничего не передавать, то не компилится. вобщем отправил 0 smile

результат, нулевой, мышка все таже, часик.

"прилагаю исходник"

Прикрепления: Angor.dpr (2.6 Kb)
 
GexonДата: Воскресенье, 19.07.2009, 16:20 | Сообщение # 23
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
Quote (wolfRAMM)
П.с. конечно вместо uGUIEngine.pas ты бы лучше опубликовал окресности "for I := 0 to GUI.Count...."

прикладываю)

--------------------
я поизголялся немного, и подправил Омегу

тоже прилагаю

Прикрепления: uGame.pas (34.1 Kb) · OMEGA.pas (50.6 Kb)
 
wolfRAMMДата: Воскресенье, 19.07.2009, 19:50 | Сообщение # 24
Ангор
Группа: Убитый енот
Сообщений: 34
Статус: Offline
Передавать нужно hInstance и hCursor. IDC_ARROW ето 0.
Code
SetCursor(hInstance, LoadCursor(hInstance,0)

Вообще убери ту проверку, пускай всегда выполняеться (для пробы). Если нормально будет, тогда можно еще сделать подобно этому
Code

var
      CursorIsSet : bool;
function SetCursorArrow( hWnd : HWND; Msg : UINT; wParam : WPARAM; lParam : LPARAM ): LRESULT; stdcall;
var
     prevCursor: Long;
begin
      if CursorIsSet = false then     
     begin
      prevCursor = SetClassLong(hWnd, -12, LoadCursor(hInstance,0)); //вместо hInstance вроде можно 0
      CursorIsSet := true;
                            //здесь вызови меседжбокс какой-нить с prevCursor - это предыдущий курсор
     end     
end;

Добавлено (19.07.2009, 18:36)
---------------------------------------------
и когда екстернал будешь обьявлять, там походу нужно будет name 'SetClassLongA' или SetClassLongW, и так же с LoadCursorA/W (это анси/юникод версии)

Добавлено (19.07.2009, 19:50)
---------------------------------------------
Насчет лрезалт, это не просто лонг.
typedef LONG_PTR LRESULT;
typedef _W64 long lONG_PTR, *PLONG_PTR;
Тоисть 4 байта на 32-битных машинах, и 8 на 64-битных.

По поводу утечек памяти. Ну да, все сходиться: 8 кнопок + GlobalParent. Советую из файла uGUIEngine.pas перенести инициализацию в ф-цию NewGame в uGame, и в EndGame добавить очистуку (GlobalParent.Free GUI.Free), ну и поправить цикл на for I := 0 to GUI.Count - 1 do GUI.DelElement(List[i])

Сообщение отредактировал wolfRAMM - Воскресенье, 19.07.2009, 20:51
 
GexonДата: Воскресенье, 19.07.2009, 21:31 | Сообщение # 25
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
WinAPI не моя стихия smile
 
GexonДата: Воскресенье, 19.07.2009, 21:37 | Сообщение # 26
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
не понял, как в функцию где описан тока один параметр
Code
function SetCursor(hCURSOR: Cardinal): Cardinal; stdcall; external 'user32.dll' name 'SetCursor';
можно затромбовать нолик и еще одну функцию?
Code
SetCursor(hInstance, LoadCursor(hInstance,0))
.

вобщем компилятор отругал меня и я оставил так:

Code
  if Msg = 32 then SetCursor(0); // в ответ на глобальное сообщение от системы, про курсор, говорим есму ставить курсор 0, т.е. стрелка IDC_ARROW

ща с утечками попробую разобраться

 
wolfRAMMДата: Воскресенье, 19.07.2009, 21:43 | Сообщение # 27
Ангор
Группа: Убитый енот
Сообщений: 34
Статус: Offline
тю, пользуй http://msdn.microsoft.com + http://www.rsdn.ru и все будет cool

Добавлено (19.07.2009, 21:43)
---------------------------------------------

Quote (wolfRAMM)
не понял, как в функцию где описан тока один параметр

аа, это моя ошибка - перепутал с лоадкурсор)
Тогда просто SetCursor(LoadCursor(hInstance,0)). Лоадкурсор возвратит HCURSOR, просто чтобы промежуточную переменную не задействовать.
 
GexonДата: Воскресенье, 19.07.2009, 21:59 | Сообщение # 28
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
хе-хе, веселее и веселее становится biggrin

Quote
1.Советую из файла uGUIEngine.pas перенести инициализацию в ф-цию NewGame в uGame,
2. и в EndGame добавить очистуку (GlobalParent.Free GUI.Free),
3. ну и поправить цикл на for I := 0 to GUI.Count - 1 do GUI.DelElement(List[i])

по 1 и 2, после того ка я перенес инициализацию и добавил освобождение ресурса GlobalParent, вышло следующее

3. правил, ниче не изменилось. вернул как было.

п.с.
вернул все как было

 
wolfRAMMДата: Воскресенье, 19.07.2009, 22:19 | Сообщение # 29
Ангор
Группа: Убитый енот
Сообщений: 34
Статус: Offline
ну так это же шаг вперед - раньше было же еще small block leaks (CGUIElement x1), тоисть проблем поменьше - зачем назад вернул?
по 3 пункту думаю тебя делфи обманывает - на итерации i=count в List создаеться новый елемент, и тут же освобождаеться )) Просто не нужная операция.

Добавлено (19.07.2009, 22:19)
---------------------------------------------
А эту проверка утечек, она чьего авторства?

 
GexonДата: Воскресенье, 19.07.2009, 22:24 | Сообщение # 30
Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
ReportMemoryLeaksOnShutdown - system.pas
----------------------

в uGUIEngine.pas создал секцию
finalization
и туда написал GlobalParent.Free
------------------------

for I := 0 to GUI.Count do GUI.List[i].Free;
//for I := 0 to GUI.Count - 1 do GUI.DelElement(GUI.List[i]); - эта инструкция дает косяки на указатель какой-то, и показывает процедуру нажатия мыши


------

 
Ангорум » Проект "Ангор" - общий раздел » Обсуждаем новые и старые версии Ангора » Версия от 17 июля 2009 (релиз)
  • Страница 2 из 5
  • «
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: