PDA

Просмотр полной версии : [Starling] Выгрузка из VRAM #3691


faraday
30.09.2016, 15:46
Привествую, некоторые игроки стали жаловаться что иногда часть объектов в интерфейсе перестает отрисовываться.В лог, при попытке создания текстуры (100*100), идет ошибка
Error #3691
\tat starling.textures::Texture$/empty()
\tat starling.textures::RenderTexture()
Подсчет суммарного размера текстур показывает в этот момент около ~64 мб, хотя по доке минимальный лимит 128 (игра браузерная) https://goo.gl/nD469K

static public function get textureSize():int{
var size:int = 0;
var all:Vector.<Texture> = resources.getTextures();
for each(var texture:Texture in all)
size+= (getNextPowerOfTwo(texture.nativeWidth) * getNextPowerOfTwo(texture.nativeHeight));
return size;}
Все текстуры загружатся по мере необходимости, так что проблема воникает на долгих сессиях. Места где текстуры создаются програмно - контролируются и очищаются, так что проблема врядли в утечке. Теперь собственно сам вопрос, как я понял проверить свободную видеопамять возможности нет, и прийдется хранить все ATF в памяти, и постоянно их пересоздавать в vRAM, насколько это рабочий подход, и как еще можно предотвратить возникновение этой ошибки?

caseyryan
01.10.2016, 16:37
У тебя там RenderTexture используется?
Недавно у меня с ней был баг, который мне чуть мозг не взорвал. А проблема оказлась простая.
В общем, суть была в том, что на разных устройствах разные размеры допустимой текстуры. У меня нормально тестировалась игра на компе, но при загрузке на телефон висла в процессе загрузки уровня. Подключил отладчик, и увидел проблему в том, что рендер текстура такого размера на телефоне не поддерживалась, хотя комп ее тянул.
Я не говорю, что у тебя такая же проблема, но факт в том, что эти показатели не фиксированы, и могут варьироваться от устройства к устройству. Вполне может быть что на одном девайсе 128 мегабайт под текстуры, а на другом меньше 60. Так, информация к размышлению

faraday
04.10.2016, 12:29
Render Texture используется только на аватарках 100*100, так что врядли их лимит. и игра браузерная, поэтому 128 мб должно быть фиксировано. Пока проблему решить так и не удалось..

caseyryan
04.10.2016, 13:03
поэтому 128 мб должно быть фиксировано
А может у юзер в момент запуска игры уже меньше памяти осталось?

faraday
04.10.2016, 15:36
ну да, в принципе с памятью любая ситуация может быть, но вылет фиксировано на 50-60 мб. Получается нет никакой возможности предотвратить это - не зная сколько свободной памяти, надо оборачивать в try и то не факт что заработает

faraday
28.10.2016, 15:08
Как я понял - не правильно считал размер текстур, там надо width*height домножать еще на 4

ShockWave512
29.10.2016, 01:31
Со сжатием текстур вообще не угадаешь точно по размеру. По умолчанию вроде как включено.
Посмотри сколько "подымает" vram-мы при старте игры, например GPU-Z позволяет на графике глянуть.

faraday
29.10.2016, 23:12
проблему решил обнулением всех текстур при исключении, и последующим их восстановлением по мере показа.
public static function checkVram(width:int, height:int):Boolean{
try{
var check:Texture = Texture.fromColor(width, height);
check.dispose();
return true;
}catch (e:Error){

}
return false;
}