Когда я впервые прочитал этот вопрос, я предположил, что пределом производительности была SetData
. Однако, читая комментарии ОП в верхнем ответе, он, похоже, выделяет лот из больших Texture2D.
В качестве альтернативы рассмотрите возможность использования пула Texture2D, который вы распределяете по мере необходимости, возвращайтесь в пул, когда он больше не нужен.
В первый раз, когда каждый файл текстуры необходим (или в «предварительной загрузке» в начале вашего процесса, в зависимости от того, где вы хотите задержку), загрузите каждый файл в массив byte[]
. (Храните эти byte[]
массивы в LRU Cache - если только вы не уверены, что у вас достаточно памяти для их постоянного хранения.) Затем, когда вам понадобится одна из этих текстур, возьмите одну из пула текстуры (выделение новой, если нет подходящего размера), SetData из вашего байтового массива - альт, у вас есть текстура.
[Я пропустил важные детали, такие как необходимость привязки текстуры к определенному устройству - но вы можете определить любые потребности от параметров до методов, которые вы вызываете. Цель, которую я делаю, состоит в том, чтобы минимизировать обращения к конструктору Texture2D, особенно если у вас много больших текстур.]
Если вам по-настоящему интересно, и вы имеете дело со многими текстурами разных размеров, вы также можете применить к пулу принципы LRU Cache . В частности, отслеживайте общее количество байтов «свободных» объектов, хранящихся в вашем пуле. Если эта сумма превышает установленное вами пороговое значение (возможно, в сочетании с общим количеством «свободных» объектов), то при следующем запросе отбрасываете самые старые бесплатные элементы пула (неправильного размера или других неправильных параметров), чтобы оставаться ниже разрешенного порог "потерянного" пространства кеша.
Кстати, вы могли бы сделать это просто, отслеживая порог и выбрасывая все свободные объекты при превышении порога. Недостатком является кратковременный сбой в следующий раз, когда вы выделите кучу новых текстур, которые вы можете улучшить, если у вас есть информация о том, какие размеры вам следует сохранить. Если этого недостаточно, вам нужно LRU .