![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Feb 2009
Сообщений: 33
|
Помогите кто может, при частом вызове функций Flash из конетейнера течет память - мегабайтам.... думал что то в коде, выключил весь код как в контейнере так и во флэше, все тоже самое, значит дело именно в вызовах ExternalInterface.... не срабатывает GC и все тут, когда вызовов нет или flash работает внутри себя память не течет может кто сталкивался, принимаются самые буйные идеи... (GC насильно запускал разными способами, 0 результата).
нашел одно упоминание о проблеме I'm having trouble with a memory leak in my application. I'm hoping someone out there can help me find a fix or workaround, or tell me what I'm doing wrong.The leak seems to be coming from the flash external interface; specifically, IShockwaveFlash.SetReturnValue(String). My application is written in Visual Basic 2008, connecting to Flash 9.0.124.0 (activex version).I've written a fairly simple flash/VB program pair to illustrate the problem.The SWF contains a button, 2 dynamic text fields, and the ActionScript 2 code below.The VB project contains a Form with a AxShockwaveFlash object and the VB code below.When this program is run, and the button is clicked a lot (10's of thousands of times), the application's memory creeps up and never seems to fall back down. If the string passed to SetReturnValue is longer, memory is consumed faster. But if the call to SetReturnValue is commented-out, the application's memory usage remains stable.If anyone has any suggestions on how to proceed, I'd be grateful.(By the way: I'm using a freeware program called DoItAgain to automate the button pressing.) но идей решения не послеовало... я в общем то уже смирился с тем что течет flash10.ocx и все же.... Adobe Flash CS3, Delphi + flash10.ocx, FlashPlayer 10,0,32,18 Добавлено через 20 минут [IMG]http://pic.************/uploads/091002/C7ZRVSRk1V.jpg[/IMG] вот тут часто вызываются методы флэша без единой строки кода но видно какими объемами течет память. Последний раз редактировалось nick_van_rijn; 02.10.2009 в 15:15. |
|
|||||
|
listener
|
Человек пишет на .NET, вы на дэлфи. Там юзаются какие-то хитрые обертки для плеера, я знаю. Чего там течет-сказать трудно. Сделал свой пример на SetReturnValue и CallFunction.
http://mdm-zinc.narod.ru/pub/res.zip CallFunction вызывается по правой кнопке, SetReturnValue происходит по нажатию на кнопку Button в окне плеера. Посмотрите, сравните. Кода там тоже практически нет. Память подтекает, но чтоб катастрофичемки.. нет, пожалуй. Да, плеер тоже 10, AS2-ролик. |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 33
|
спасибо за пример, действительно по сравнению с моей утечкой, тут можно считать стабильной память,на чем написан код контейнера? среди включенных модулей нет Flash10b.ocx на который я и грешу...
код вызова флэш функции // XMLDoc.XML.Strings - имя метода и его параметры res:=FlashObject.CallFunction(XMLDoc.XML.Strings[1]); procedure TMyFlashGameSea.CallByFlash(ASender : TObject; const ARequest : WideString); var //сюда попадаем когда флэш вызывает метод паскаля //ARequest- xml запрос с именем метода и его параметрами Method : string; iParameters : TVarArray; begin FRetFlash(ARequest, Method, iParameters); //разбираем XML if Method = 'Log' then begin .... Добавлено через 19 минут для флэша так: // делаем доступными для внешнего контейнера функции ExternalInterface.addCallback ("AddWinTableString",AddWinTableString); ExternalInterface.addCallback ("ChangeWinTableSttring",ChangeWinTableString);... тела функций пустые Последний раз редактировалось nick_van_rijn; 02.10.2009 в 17:13. |
|
|||||
|
listener
|
Пример малость подправил, несущественно.
Написан пример на С++ и ATL. Flash10а.ocx и сам мувик сидят в ресурсах, можете посмотреть резхакером. Оттуда и грузятся. По вашему коду сказать мало что могу, дэлфями занимался мало. Попробуйте версию плеера пониже, что ли.. не знаю, чем вам помочь. Видимо, дело таки в обертке. Код С++ HRESULT CFlashEventDispatch::FlashCall_Handler (_bstr_t request)
{
// request не анализирую, ибо пример.
CString msg = "<string>SetReturnValue rules ";
CString t;
static int i = 0;
t.Format(L"%X",i);
m_spPlayer->SetReturnValue(_bstr_t(msg+t+" times!</string>"));
i++;
return S_OK;
}
...
LRESULT CFlashHost::OnRButtonDown(UINT /* uMsg */, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& bHandled)
{
static int i = 0;
CString msg = "<invoke name=\"newfunc\" returntype=\"xml\"><arguments><string>Call Function rules ";
CString t;
t.Format(L"%d",i);
m_spPlayer->CallFunction(_bstr_t(msg+t+" times!</string></arguments></invoke>"));
i++;
return 0;
}
Последний раз редактировалось alexcon314; 02.10.2009 в 17:45. |
|
|||||
|
Modus ponens
|
Я думаю, что эти вещи связаны:
http://bugs.adobe.com/jira/browse/TH-6308 http://bugs.adobe.com/jira/browse/TH-6486 < тут говорится, что вроде как пофиксили... но, судя по коментам - не понятно толком...
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 33
|
[IMG]http://pic.************/uploads/091002/7VSo3Uoa7b.jpg[/IMG]
вот тут все что загружает процесс res [IMG]http://pic.************/uploads/091002/aqzoUWA244.jpg[/IMG] а тут то что загружается у меня |
|
|||||
|
Modus ponens
|
Сорри, очевидно это "внутренний" репорт... просто почему-то JIRA мне показывает: Security Level:Public (All JIRA Users )...
Там говорится про оболочку для плеера в каталисте, но кто-то обмовливлся о том, что флешевый родной код не освобождал строку полученую извне... мне тяжело понять о чем именно речь т.как там используют какие-то юнит тесты, которых у меня нет, да и билдить каталист я все равно не могу... Но даже если это так, то все равно помочь этому делу никак нельзя... ни из плеера ни из кода вне обертки...
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 33
|
я для вызова флэш функции использую CallFunction, и подписаное событие для получения ответа, такое взаимодействие везде описано как штатное,SetReturnValue не использовал.... везде AS3
Добавлено через 15 минут Еще сомнения...ExternalInterface.addCallback для всех функций делаю в конце точки входа, все открываемые функции находятся ниже, не может быть чего плохого? |
|
|||||
|
listener
|
Ну, списки не очень различаются, плеер-то один и тот же...
Цитата:
Цитата:
На выходных попробую потерзать res.exe. Будет что-то интересное, отпишусь. UPD: Сделал пример с AS 3.0. При старте имеем 17'560 Кб. Лики больше и чаще на SetReturnValue, FlashCall тоже течет, но процентов на 70% умереннее, на глаз. После нескольких сотен (350~400)вызовов вперемешку, но с перевесом на SetReturnValue, имеем ~20'250Кб. Однако, в какой-то момент расход скачкообразно уменьшается до ~18'500Кб и после этого лики идут вяло и в большинстве гасятся. С AS 2.0 - роликом на старте имеем 16'480 Кб. Лики идут примерно вровень на обоих вызовах, на ~ 450 вызовах вперемешку расход догнал до ~17'100. Дальнейшие лики почему-то практически не происходят. Исходник поправил так, что CallFunction возвращает результат, происходит это синхронно, так что про события, повторюсь, не понял. HRESULT CFlashEventDispatch::FlashCall (_bstr_t request)
{
//::MessageBox(NULL,request,L"FlashCall request",0);
static int i = 0;
CString msg = "<string>SetReturnValue rules ";
CString t;
t.Format(L"%d",i);
_bstr_t ret = _bstr_t(msg+t+" times!</string>");
HRESULT hr = m_spPlayer->SetReturnValue(ret);
i++;
return S_OK;
}
...
LRESULT CFlashHost::OnRButtonDown(UINT /* uMsg */, WPARAM /* wParam */, LPARAM /* lParam */, BOOL& bHandled)
{
static int i = 0;
CString msg = "<invoke name=\"newfunc\" returntype=\"xml\"><arguments><string>FlashCall rules ";
CString t;
t.Format(L"%d",i);
_bstr_t res = m_spPlayer->CallFunction(_bstr_t(msg+t+" times!</string></arguments></invoke>"));
//::MessageBox(NULL,res,L"CallFunction response",0);
i++;
return 0;
}
res3.zip (c AS 3.0) положил рядом с обновленным res.zip (с мессаджбоксами) на народе там же в pub. Плеер 10а. Последний раз редактировалось alexcon314; 05.10.2009 в 08:40. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:29. |
|
|
« Предыдущая тема | Следующая тема » |
|
|