Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 12.05.2017, 16:45
Egstond вне форума Посмотреть профиль Отправить личное сообщение для Egstond Найти все сообщения от Egstond
  № 1  
Ответить с цитированием
Egstond

Регистрация: Mar 2016
Сообщений: 52
По умолчанию Как вытащить ссылку ?

Всем доброго времени суток!
Вкратце ситуация такая, есть класс - библиотека(условно), есть класс которому нужно получить из библиотеки ссылку на звук(Sound) чтобы у себя его проиграть.

Сейчас я делаю это так,
Код AS1/AS2:
//Это класс библиотеки
var SOURСE_MUSIC:Vector.<Sound>(10);
 
public function get_mus(N:int,S:Vector.<Sound>):void
{
S.push(SOURСE_MUSIC[N]);
}
//----
Ну и из класса клиента достаю(передав новенький вектор параметром), и все норм, все работает, но насколько это эффективно? Есть ли другие оптимальные решения ? Не будет ли утечек памяти если таким способом выгружать постоянно и много всего ?

Меня смущает то что если не использовать вектор, а просто передавать Sound и приравнивать его "=" к исходным данным, то он тупо не достается, достается только вектор и только в который записали командой push, почему так ?

Ниже приведен не рабочий вариант
Код AS1/AS2:
public function get_mus(N:int,S:Sound):void
{
S=SOURСE_MUSIC[N];
}
Такой Sound S на другом конце просто null


Последний раз редактировалось Egstond; 12.05.2017 в 16:57.
Старый 12.05.2017, 16:58
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 2  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
зачем второй вектор? зачем первый? почему забор по индексу? откуда в векторе звуки?
совершенно не понятно зачем выбран такой извращенный способ. если передаете вместо вектора sound то он внутри функции и не будет присвоен.
задача функции возвращать этот звук, это она делать и должна.
Код AS3:
var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))
}

Старый 12.05.2017, 17:02
Egstond вне форума Посмотреть профиль Отправить личное сообщение для Egstond Найти все сообщения от Egstond
  № 3  
Ответить с цитированием
Egstond

Регистрация: Mar 2016
Сообщений: 52
Цитата:
зачем второй вектор?
без вектора S не могу никак по другому вытащить ссылку.
Цитата:
зачем первый?
Звуки в библиотеке хранятся в векторе, это просто стоит воспринять как данное. Они точно верно загружены, вопрос только с вытаскиванием ссылки.
Цитата:
зачем забор по индексу?
достать нужно 1 ссылку, поэтому и индекс
Цитата:
откуда в векторе звуки?
Я просто опустил эту часть кода когда в вектор заливаются звуки, так как с этой частью проблем нет, проблема - вытащить 1 из звуков и передать дальше, причем оптимально, без загрузки памяти

Добавлено через 19 минут

Код AS1/AS2:
var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))
Что-то мне подсказывает что каждый раз пересоздавать объект оператором new и через функцию возвращать весь, это как минимум не более оптимально чем написал я. У меня хотя бы getDifinitionByName для 1 элемента используется 1 раз при загрузке, тут каждый раз при обращении..
Других варианты есть у кого нибудь ?

Добавлено через 58 минут
Еще раз сформулирую проблему. Объект звука нужно создать 1 раз, а дальше только распоряжаться ссылками на него.
Вот такой вариант прокатит ? функция будет возвращать лишь ссылку, или где то по ходу ее выполнения все равно будет происходить копирование самих данных звука ?
Код AS1/AS2:
public function get_mus(N:int):Sound
{
return(SOURСE_MUSIC[N]);
}


Последний раз редактировалось Egstond; 12.05.2017 в 18:02.
Старый 12.05.2017, 18:19
faraday вне форума Посмотреть профиль Отправить личное сообщение для faraday Найти все сообщения от faraday
  № 4  
Ответить с цитированием
faraday
 
Аватар для faraday

Регистрация: Apr 2009
Сообщений: 409
в моем варианте звук создается только один раз, а потом возвращает его. смысл вообще этой функции? почему просто не обращаться к индексу вектора если знаете что точно лежит звук?

Старый 12.05.2017, 18:30
Egstond вне форума Посмотреть профиль Отправить личное сообщение для Egstond Найти все сообщения от Egstond
  № 5  
Ответить с цитированием
Egstond

Регистрация: Mar 2016
Сообщений: 52
Цитата:
в моем варианте звук создается только один раз, а потом возвращает его. смысл вообще этой функции? почему просто не обращаться к индексу вектора если знаете что точно лежит звук?
Тут библиотека одна, а кому из нее данные нужны - много. При чем данные бывают одни и те же, но нужны они разным классам программы.

Функция с возвращаемым типом Sound будет ссылку возвращать, или копию объекта ?

Старый 12.05.2017, 18:35
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 6  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,918
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Код AS3:
public function get_mus(N:int):Sound
{
return(SOURСE_MUSIC[N]);
}
Так придётся сразу инициализировать при загрузке все звуки
Код AS3:
var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))
}
Так они будут создаваться при вызове.
В AS3 нет оператора копирования для классов. Они всегда передаются только по ссылке. Исключением являются только примитивные типы данных.
__________________
There is no thing in this world that is not simple.

Старый 12.05.2017, 18:52
Egstond вне форума Посмотреть профиль Отправить личное сообщение для Egstond Найти все сообщения от Egstond
  № 7  
Ответить с цитированием
Egstond

Регистрация: Mar 2016
Сообщений: 52
ок, всем спасибо

Старый 12.05.2017, 20:16
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от ZackMercury Посмотреть сообщение
Код AS3:
var cache:Object={}; 
public function get_mus(id:String):Sound{
return cache[id]||(cache[id]=new getDifinitionByName(id))
}
Так они будут создаваться при вызове.
Функция называется getDefinitionByName(). При этом id должен в точности соответствовать названию класса звука. Так, в качестве дополнения
__________________
Ко мне можно и нужно обращаться на ты)

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:06.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 13:06.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.