Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   API приложений и сред (http://www.flasher.ru/forum/forumdisplay.php?f=61)
-   -   [Starling] Выгрузка из VRAM #3691 (http://www.flasher.ru/forum/showthread.php?t=213433)

faraday 30.09.2016 15:46

Выгрузка из VRAM #3691
 
Привествую, некоторые игроки стали жаловаться что иногда часть объектов в интерфейсе перестает отрисовываться.В лог, при попытке создания текстуры (100*100), идет ошибка
Код AS3:

Error #3691
\tat starling.textures::Texture$/empty()
\tat starling.textures::RenderTexture()

Подсчет суммарного размера текстур показывает в этот момент около ~64 мб, хотя по доке минимальный лимит 128 (игра браузерная) https://goo.gl/nD469K
Код AS3:

 
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

проблему решил обнулением всех текстур при исключении, и последующим их восстановлением по мере показа.
Код AS3:

                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;
                }



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

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