forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

h1dd3n 01.05.2015 18:28

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от ILonion (Сообщение 295448)
У меня ситуация, когда одномерный массив постоянного размера очень часто создается и удаляется (эмпирически). Как я понял в c# лучше всего не удалять, а переиспользовать. Значит мне необходимо его очищать. Вопрос: каким макаром это делать максимально быстро? Array.Clear()? или при каждом новом заходе new? (если второе, то что происходит с предыдущим массивом? он становится бессылочным и его будет ждать GC?);

А что значит часто создается и удаляется? Тебе этот массив нужен как временная вспомогательная структура ? Или как например список игроков ?

ILonion 01.05.2015 22:24

Ответ: Вопросы от новичка
 
У меня одномерным массивом описана трехмерная матрица положений объектов в 3д пространстве (кубик рубика). Достаточно большая - 14^3.
При определенных условиях часть массива (плоскость элементов, т.е. 14^2) срезается с "одной стороны" и добавляется с "другой", по разным осям (как торт отрезать). Все "среднее" содержимое тоже как бы "сдвигается", поэтому, в работе весь массив 14^3.
в блитце реализовывал чере bbBank. там копировал массив во времянку, потом разом удалял (freebank) весь оригинальный массив, пересоздавал на лету, и заливал (copybank) с нужным смещением "плоскости" , из массива времянки.

EvilOkta 03.05.2015 00:26

Ответ: Вопросы от новичка
 
вопрос на базовую логику действия программы, надеюсь просветите.
Предположим я создаю экземпляр класса через определенный ранее конструктор
PHP код:

Primer = new PrimerClass(1,2,3); 

затем я снова создаю экземпляр класса абсолютно по такому же принципу и в тот же объект (правильно называю надеюсь?)
PHP код:

Primer = new PrimerClass(4,5,6); 

Что случится с первым экземпляром класса? Логика подсказывает что сущность будет уничтожена, но интересует все-таки мнение экспертов, что с ней происходит? Она просто замещается вторым экземпляром или их становится две?

Igor 03.05.2015 00:37

Ответ: Вопросы от новичка
 
Если ссылка на первый объект есть где-нибудь ещё (например, до создания второго экземпляра была строчка PrimerOld = Primer), то он не удалится.
Если ссылки на него не будет, сборщик мусора его уберёт когда-нибудь.
Ещё есть нюанс со структурами - они, кажется, копируются и передаются по значению - т.е., в коде типа var p = new Point(1,2) новые значения полей x и у будут записаны прямо поверх старых. Сборщик мусора для структур не вызывается - можно провести аналогию с переменными типа int - их явно никто не собирает, потому что они или на стеке или в составе другого объекта.

ILonion 04.05.2015 02:05

Ответ: Вопросы от новичка
 
Подскажите, пожалуйста, правильно ли будет в данном случае использовать .Close() ?
А то заморочили тут голову: https://msdn.microsoft.com/ru-ru/lib...eam.close.aspx
PHP код:

byte[] bank = new byte[100];
string filename = @"\dat.dat";
///
string save_path Directory.GetCurrentDirectory() + filename;
if (
File.Exists(save_path))
{
       
writer = new BinaryWriter(File.Open(save_pathFileMode.Open));
       {
              
writer.Seek(0,SeekOrigin.End);
              
writer.Write(bank);
              
writer.Close();
       }



seaman 04.05.2015 14:14

Ответ: Вопросы от новичка
 
Файл закрыть точно надо.
Но, имхо - используй using и не парься. Зря его что-ли выдумали.
Код:

using(FileStream fs = File.Open(save_path, FileMode.Open))
{
  using(BinaryWriter = new BinaryWriter(fs))
  {
      ...
  }
}


h1dd3n 04.05.2015 15:08

Ответ: Вопросы от новичка
 
Мало того что файл закрыть надо, надо еще Flush вызвать у райтера.

А вообще эта конструкция мне несовсем понятна:

writer.Seek(0,SeekOrigin.End);

Зачем ?

ILonion 04.05.2015 15:25

Ответ: Вопросы от новичка
 
А, понял. using гарантированно вызывает Dispose для неуправляемых. Так и сделаю, большое спасибо!

ILonion 04.05.2015 15:28

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от h1dd3n (Сообщение 295557)
Мало того что файл закрыть надо, надо еще Flush вызвать у райтера.

А вообще эта конструкция мне несовсем понятна:

writer.Seek(0,SeekOrigin.End);

Зачем ?

>>Flush - ясно. тем более нужен using)
>>writer.Seek(0,SeekOrigin.End); Зачем ? - мой фрагмент вырван из контекста. файл предполагается дозаписывать. Или он по умолчанию автоматом в конец писать будет?

ILonion 04.05.2015 23:43

Ответ: Вопросы от новичка
 
А вот такой вопрос. Вот здесь: https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx указано, что начиная с net 2 класс Array реализует интерфейс IList, с одной стороны, но "...члены, добавляющие, вставляющие или удаляющие элементы выбрасывают исключение NotSupportedException." с другой.
Как же все-таки в c# реализовать добавление (не знаю какой будет размер массива в процессе выполнения) и удаление элементов (актуальный список) одномерного массива? Только через Array.Resize ?

h1dd3n 05.05.2015 00:31

Ответ: Вопросы от новичка
 
List<T>

Под капотом там просто алгоритм который хранит внутри себя массив, и при добавлении элементов если массив слишком мал, создает новый и копирует туда элементы исходного (автоматом, разумеется).

Цитата:

>>writer.Seek(0,SeekOrigin.End); Зачем ? - мой фрагмент вырван из контекста. файл предполагается дозаписывать. Или он по умолчанию автоматом в конец писать будет?
var stream = File.Open(path, FileMode.Append);

seaman 05.05.2015 00:32

Ответ: Вопросы от новичка
 
Используйте List<T>, если часто меняется размер.
Ну или ArrayList, если не хотите дженерики.

ILonion 05.05.2015 00:51

Ответ: Вопросы от новичка
 
Благодарствую, seaman, h1dd3n!

Gector 05.05.2015 16:11

Ответ: Вопросы от новичка
 
Вопрос по анимации характерной для именно кат-сцен.
1. Как в юнити сделать анимацию камеры для кат-сцены?
2. Как вообще проще всего в юнити сделать кат-сцену используя лишь его родной функционал? (на всякий случай, вдруг я чего не знаю)

Nex 05.05.2015 19:21

Ответ: Вопросы от новичка
 
Цитата:

1. Как в юнити сделать анимацию камеры для кат-сцены?
Заходишь в Window > Animation. Открывается окно, выбираем камеру и в появившемся окне жмем на красный кружок, а далее указываем имя и папку для анимации и как в 3дмаксе двигаем камеру, указываем ключи и по окончании создании анимации снова жмем на красный кружок в окне Animation. И через анимацию можно вообще все менять у объектов даже тип проекции камеры.

Цитата:

2. Как вообще проще всего в юнити сделать кат-сцену используя лишь его родной функционал? (на всякий случай, вдруг я чего не знаю)
Например так:


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot