Performance ao mostrar imagens.

4 Respostas   266 Visualizações

0 Membros e 1 Visitante estão vendo este tópico.

TonyHart

  • *
  • Posts: 144
  • Ouros: 126
  • Born in 95 to die
Tópico criado em: 27/09/2016 às 17:01 - Última modificação por tonyhart em 28/09/2016 às 21:05

Exemplo, estou fazendo um script que mostra imagens na tela do jogo com animações (move picture); Estou em dúvida do que seria mais custoso em termos de performance

SITUACAO A:
  • CRIAR E MOSTRAR IMAGEM (comando show picture e move picture)
  • OCULTAR E DELETAR IMAGEM (comando move picture e erase picture)

SITUACAO B
  • Ao inicializar plugin, criar todas as imagens apenas uma vez (comando show picture)
  • Ao mostrar e ocultar imagem apenas trocar opacidade sem deletar (apenas comando move picture)

Será que é mais custoso criar a imagem toda vez for utilizar (ex: um sistema de mensagens feito por imagens) ou se seria mais custoso manter todas as imagens já criadas, mas apenas ocultadas...

Qualquer idéia agradesço
Born in 95 to die

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 1: 27/09/2016 às 17:51

Primeiro e mais importante: é em Javascript ou RGSS? Tu menciona script e plugin, daí fiquei meio perdido.
E isso seria para a confecção de código mesmo ou usando em sistemas por eventos?

TonyHart

  • *
  • Posts: 144
  • Ouros: 126
  • Born in 95 to die
Resposta 2: 27/09/2016 às 18:32

Javascript / Rpg Maker MV. Abaixo como exemplo, como estou fazendo atualmente, seguindo a lógica de código da situação B do post anterior.
Outra coisa, independente da forma, o jogo sempre dá umas travadas quando executo o comando 'hidePicture'... Não sei por que...

Código: [Selecionar]
    // Inicializacao
    var _Window_Message_initialize = Window_Message.prototype.initialize;
    Window_Message.prototype.initialize = function() {
        _Window_Message_initialize.call(this);
        // Mostrar imagem com opacidade zero
        $gameScreen.showPicture(shadowBitmap, 'message_shadow', 0, 0, 50, 100, 100, 0,
            Graphics.BLEND_NORMAL);

    };

    // Comando
    var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
    Game_Interpreter.prototype.pluginCommand = function(command, args) {
        _Game_Interpreter_pluginCommand.call(this, command, args);
        switch (command) {

            case 'showMessage':
                // Alterar opacidade para 255
                $gameScreen.movePicture(shadowBitmap, 0, 0, 0, 100, 100, 255,
                    Graphics.BLEND_NORMAL, 10);
                break;

            case 'hideMessage':
                // Alterar opacidade para 0
                $gameScreen.movePicture(shadowBitmap, 0, 0, 0, 100, 100, 0,
                    Graphics.BLEND_NORMAL, 5);
                break;

        }
    }
Born in 95 to die

Geraldo de Rívia

  • Mito
  • *
  • Posts: 4452
  • Ouros: 3887
  • O vento está sibilando.
  • Medalhas Vencedor do Protótipo Premiado Participantes do Maps Together 2
Resposta 3: 27/09/2016 às 20:14

Então, vou explicar conforme entendi de como o Javascript funciona na MV até então.

Primeiramente tu não tem algum comando que realmente apague a imagem. Depois que uma imagem
é carregada, ela permanece em memória, diferente de como era na Ace, em que tu tinha o dispose
de cada elemento. Creio que o máximo que ocorra é da imagem não sofrer atualização ou perder
prioridade, mas ela continua pesando na memória, até que a cena atual sena terminada.

A vantagem de criar todas imagens de uma vez é que a ação de carregar uma imagem pode pesar
um pouco, o que causaria um dropzinho do fps quando isso ocorresse. Carregando todas elas de uma
vez, vai fazer com que esse drop seja maior no momento dessa ação, mas das outras vezes que
precisar da imagem, como ela já vai estar carregada, em tese não haveria essa perca de fps.

Por outro lado, você terá mais elementos na memória, elementos esse que talvez tu nem use,
portanto estarão lá pesando à toa. Mas também esse método é o que a maioria dos programadores
usaram nos plugins que vi, pois evita a necessidade de verificar se a imagem já fora criada.

Tudo isso que disse foi se tratando na programação de um plugin.

Tu, apesar de estar fazendo isso num plugin, está utilizando os comandos para exibir uma imagem
pelo mesmo método que os eventos usam, daí não sei se o que eu disse também se aplica, pois
como, nesse caso, realmente existe um comando que diz "Deletar Imagem", crê-se que ele o faça,
e pode ser que ele seja sim efetivo e carregue menos o sistema. Diferente de quando uma variável
é settada à um arquivo de imagem, que descrevi anteriormente.

Por fim, meu conselho é unir o melhor de dois mundos: crie no começo as imagens que tu tem
certeza que vai precisar, e as que for precisar esporadicamente, crie-as conforme for necessário.

TonyHart

  • *
  • Posts: 144
  • Ouros: 126
  • Born in 95 to die
Resposta 4: 27/09/2016 às 22:15

Ah sim, entendi, vou tentar fazer com delete então, já que mais frente posso acabar utilizando mais imagens em outros sistemas do jogo. Obrigado
Born in 95 to die