|
Проект "Ангор"
Версия от 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. не принимает сравнение. поставил число 32. 2. не пойму что передавать в процедуру SetCursor(); если ничего не передавать, то не компилится. вобщем отправил 0 результат, нулевой, мышка все таже, часик. "прилагаю исходник"
|
|
| |
Gexon | Дата: Воскресенье, 19.07.2009, 16:20 | Сообщение # 23 |
 Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
| Quote (wolfRAMM) П.с. конечно вместо uGUIEngine.pas ты бы лучше опубликовал окресности "for I := 0 to GUI.Count...." прикладываю) -------------------- я поизголялся немного, и подправил Омегу тоже прилагаю
|
|
| |
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 не моя стихия
|
|
| |
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 и все будет  Добавлено (19.07.2009, 21:43) ---------------------------------------------
Quote (wolfRAMM) не понял, как в функцию где описан тока один параметр аа, это моя ошибка - перепутал с лоадкурсор) Тогда просто SetCursor(LoadCursor(hInstance,0)). Лоадкурсор возвратит HCURSOR, просто чтобы промежуточную переменную не задействовать.
|
|
| |
Gexon | Дата: Воскресенье, 19.07.2009, 21:59 | Сообщение # 28 |
 Оракул
Группа: Старший енот
Сообщений: 543
Статус: Offline
| хе-хе, веселее и веселее становится 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]); - эта инструкция дает косяки на указатель какой-то, и показывает процедуру нажатия мыши ------ 
|
|
| |
|