Portal SAMP
[Tutorial] Streamer Objects Performance (Dicas, explicações e problemas com mapas) - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Guias e Tutoriais (https://portalsamp.com/forumdisplay.php?fid=7)
+--- Tópico: [Tutorial] Streamer Objects Performance (Dicas, explicações e problemas com mapas) (/showthread.php?tid=3147)



Streamer Objects Performance (Dicas, explicações e problemas com mapas) - zBL4CK - 06/01/2023

Olá pessoal beleza?

Quando se trata de modificar/adicionar mapa em servidores, é algo que chama bastante atenção, por exemplo(mapas estilo FiveM com interior e exterior, com texturas ou sem texturas) deixam o mapa do servidor diferenciado.

Mas muitas das vezes estes mapas utilizam muitos objetos para serem carregados para um player e eventualmente pra quem desenvolve um servidor, já se deparou com problemas de renderização dos mapas, e até mesmo crash.

Para evitar isto é preciso que você entenda como utilizar de maneira inteligente cada objeto e também o drawdistance e streamdistance de cada objeto.

No extinto forum samp um usuário chamado n0minal criou este Tutorial na qual deu dicas valiosas e que tenho certeza que ajudará muita gente.

Eu reescrevi e adaptei o que foi dito neste tópico para melhor aprendizado, pois devido à alguns problemas de acentuação causados pela codificação de site que foi feito backup do forum samp.


Creditos Total à: n0minal.


• Sumário

Este é um tópico explicativo, este tutorial tem como objetivo sanar dúvidas, problemas e ajudar a providenciar a melhor experiência aos usuários do seu servidor. Apesar de básico, muitas pessoas não fazem ideia entre a diferença de criar objetos com streamer e criá-los nativamente (createobject).

• O que é streamer?


Streamer como muito de vocês sabem, é um plugin que estende as possibilidades de recursos nativos do samp, tais como criação de objetos (o assunto no qual estamos), pickups, checkpoints e muito mais. Mas como dito anteriormente, o foco deste tutorial é sobre os objetos.

• Streaming de objetos?

Sim, a grosso modo, o streamer faz uma "distribuição inteligente" pra estender o limite de objetos, isso não significa que você pode criar infinitos objetos com o streamer (na teoria você pode, mas na prática a coisa é diferente), mas te dá muita liberdade pra criar seus mapas caso você o use. O streaming de objetos basicamente cria objetos pra você quando você está perto deles e os destrói quando você está longe e não precisa vê-lo mais, poupando então mais slots para outros mapas. Todo esse cálculo é feito através de uma série de fatores, dentre eles o drawdistance, que muita gente por padrão não o toca e acaba ignorando, mas que na verdade é um ponto-chave pra performance dos seus mapas, portanto, abaixo vou dar algumas dicas caso você queira ter a melhor performance nos seus mapas e poder organizá-lo de forma correta e inteligente.

• Dicas

• Organize seus mapas.

Organização é o primeiro passo pra tudo, tente centralizar seus mapas em algum módulo ou script principal, assim você não vai se perder na hora que mudar alguma coisa, use comentários para ajudar na organização daquele monte de funções, pule algumas linhas e aí prossiga.

• Escolha bem seu editor.

De fato existem vários, cada um deles com características diferentes do outro, escolha um que te dê conforto de trabalhar e possibilite a maior exploração da sua criatividade, mas o mais importante, é o método de exportação.

• Usa editor in-game? Modifique-o!

Aposto que você não tinha pensado nisso, além de trocar algumas corezinhas aqui e ali nos comandos, imagine como seria útil poder modificar o drawdistance de cada objeto pra te poupar dor de cabeça após a exportação dos mapas, simplesmente fantástico! Eu pessoalmente planejo editar meu texture studio para dar suporte а isso, que tal sugerir isso no tópico oficial do texture studio ou desenvolver por si mesmo?

• Use o drawdistance de forma inteligente!

Pra quê diabos deixar 300.0m de drawdistance pra um objeto de decoração e deixar os chãos da sua cidade com pop-in, onde vira e mexe um player não carrega o objeto a tempo e cai na água, isso é horrível não é? Portanto, use o drawdistance de forma inteligente, modificando o drawdistance de cada objeto você melhora a interface dos seus mapas em 100%, priorize o essencial e abstraia os detalhes!

• Estou usando streamer e meus objetos não são criados, o que fazer?

Existem muitos casos desse tipo hoje em dia, por isso, é estritamente aconselhável que você opte por um modo de criação de objetos antes de começar a mapear, a criação de objetos nativos prejudica e muito a performance do streamer caso seja usada em grande quantidade, daí vem a questão, usar CreateObject ou CreateDynamicObject?

• Usar o streamer ou não? Como criar meus objetos? Quando devo usá-lo?

Apesar de uma pergunta simples de ser respondida, muitas pessoas ainda tem essa dúvida, quando devo usar o streamer? A resposta pra 99% dos casos é: SEMPRE USE STREAMER, pare de usar CreateObject caso seu servidor tenha um planejamento de muitos mapas, caso você queira fazer pouquissimos mapas e sistemas usando objetos, e pelas suas contas isso não passa de 1000 objetos, usar o streamer pode não ser necessário, mas na maioria dos casos não é isso que acontece, as pessoas constroem mercados, DP's, HQ's, spawn disso e daquilo e quando vai ver tem 10.000 objetos de mapa no servidor, portanto, não use CreateObject nesses casos, use apenas o streamer.

• Por que o streamer influencia nos meus CreateObjects?

Porque como já explicado anteriormente, o streamer nada mais é que uma redistribuição de objetos do seu servidor, ele cria pra você os objetos que você precisa ver e deleta os que você não precisa ver, mas guarda os dados sobre cada um deles para serem recriados quando necessário, entendeu a lógica? É basicamente uma ferramenta de redistribuição, te fornece quando necessário (quando você chega no raio de drawdistance do objeto) e te tira quando não for mais necessário (quando você sai do raio do drawdistance do objeto), por isso, as pessoas costumam dizer que se pode criar infinitos objetos com o streamer, mas não é bem assim.

• Então posso criar infinitos objetos com streamer ou não?

Na teoria, "sim", na prática, não. Primeiro de tudo, não existe como criar infinitos objetos, as pessoas dizem infinitos porque é um limite muito alto de ser atingido, mas isso não significa que seja infinito, é igual aquelas hostings da vida que oferecem tráfego mensal ilimitado para seu cPanel, quando na verdade é um limite que muito raramente será atingido, e as mesmas o vendem como se fosse "ilimitado", mas não é ilimitado na prática, apenas muito alto.

• Até quantos objetos devo criar com o streamer?

Bom, isso depende de vários fatores, um deles é a sobrecarga da largura de banda e processamento da sua máquina, quanto melhores forem as especificações da mesma, mais alto será o limite, por exemplo, o mapa hitoyoshi project que possuia 80.000 objetos e demorou 2 anos pra ser desenvolvido:

http://www.youtube.com/watch?v=oGjJkFCAkng

São 80.000 objetos criados, um lindo mapa, revolucionou o samp, mas infelizmente poucas pessoas têm recursos pra suportar um mapa desta magnitude, processar 80.000 objetos pra 500, 800, 1000 players, imagina o lag e crash que isso tudo lhe daria, quanto processamento e largura de banda seria necessário ao servidor. Fatores como players online também influenciam e muito, visto que o processamento das funções do streamer é feito de acordo com cada player, portanto, economize objetos.

• Como criar um mapa bonito sem muitos objetos?


Bom, como vossas queridas mamães já devem ter dito alguma vez na vida, quantidade não garante qualidade, se você fizer um mapa com 1000 objetos seu amigo pode te superar fazendo o mesmo mapa com 100 e fazer ele ficar muito mais bonito do que o seu, portanto, priorize a economia de objetos em cada mapa sem prejudicar a riqueza nos detalhes (que é muito importante e não deve ser esquecido).

• Leon, criei meu mapa com 800 objetos mas o streamer não carrega todos, o que fazer?

Calma jovem gafanhoto, com certeza você não leu a documentação do plugin streamer, você sabia que por padrão, o streamer carrega no máximo 500 objetos dentro de um raio similar? Mas isso não é necessariamente um problema, você quer ter a mesma performance que teria com createobjects? Então siga os passos:

1- Transforme todos os objetos criados na função nativa (CreateObject) para a função do streamer (CreateDynamicObject), você pode seguir as dicas anteriores pra ter uma melhor performance.

2- Depois de transformar os objetos nativos para dinâmicos, você pode maximizar a performance do seu streamer aumentando o limite de objetos a serem carregados no mesmo raio, para isso, o Incognito desenvolveu uma função para aumentar o limite de itens visíveis:


Código PHP:
public OnGameModeInit() {
      Streamer_SetVisibleItems(STREAMER_TYPE_OBJECT999);//999 é o máximo de objetos que podem ser carregados pelo streamer
      return 1;


• Legal, agora tenho o mesmo desempenho do que tinha com createobject, mas como criar mais de 1000 objetos num lugar sem muito pop-in?

Já fica um pouco mais complicado, mas não impossível, aí a questão do drawdistance faz toda a diferença, por exemplo, se voc priorizar a estrutura de um edifício e deixar os detalhes dele com um drawdistance menor, a estrutura já será carregada mais de longe, e os detalhes apenas quando você se aproximar, daí você tem uma melhor distribuição dos seus recursos, um detalhe no qual você se afastou é deletado sem que você perceba, e então você pode ver outro, é tudo uma questão de organização.

• Existe alguma forma de definir o drawdistance de cada objeto antes de exportar meu mapa?

Eu pessoalmente ainda não vi, planejo desenvolver essa opção no meu texture studio e caso eu faça talvez dê um pull request no projeto oficial, mas caso você se interesse, você pode entrar em contato com o Crayder (atual desenvolvedor do texture studio) pedindo para ele desenvolver algo do tipo.

Bom, acho que é isso, foi um tutorial meio longo apesar de simples, caso tenham dúvidas expressem-nas nos comentários abaixo, espero que isso resolva seus problemas e sane suas dúvidas, até logo  Big Grin



RE: Streamer Objects Performance (Dicas, explicações e problemas com mapas) - zBreno - 06/01/2023

Como nada no samp é perfeito e é brecha pra tudo que é lado esse plugin tem seus problemas assim como a função que remove os objetos dentro do jogo o samp addon corrige alguns problemas relacionados a esse plugin e a criação de objetos, na parte onde ele fala pra você se livrar do create object isso é besteira em alguns momentos criando scripts esse plugin não vai te servir pra nada, por exemplo eu tava fazendo um trabalho de cozinheiro e com esse plugin na hora do garçom segurar o prato pra entrar ao cliente o objeto só aparece criado na mesa do cliente quando você ou o outro jogador se movem já com o create objetc o prato é criado instantaneamente, cada função supre a sua necessidade e vai de você decidir o que é melhor ou não para o seu servidor


RE: Streamer Objects Performance (Dicas, explicações e problemas com mapas) - zBL4CK - 12/01/2023

(06/01/2023 19:17)zBreno Escreveu: Como nada no samp é perfeito e é brecha pra tudo que é lado esse plugin tem seus problemas assim como a função que remove os objetos dentro do jogo o samp addon corrige alguns problemas relacionados a esse plugin e a criação de objetos, na parte onde ele fala pra você se livrar do create object isso é besteira em alguns momentos criando scripts esse plugin não vai te servir pra nada, por exemplo eu tava fazendo um trabalho de cozinheiro e com esse plugin na hora do garçom segurar o prato pra entrar ao cliente o objeto só aparece criado na mesa do cliente quando você ou o outro jogador se movem já com o create objetc o prato é criado instantaneamente, cada função supre a sua necessidade e vai de você decidir o que é melhor ou não para o seu servidor


Esse problema que você esta apontando, você pode resolver usando logo após criar o objeto:

Código PHP:
Streamer_Update(playerid); 



RE: Streamer Objects Performance (Dicas, explicações e problemas com mapas) - Dr Editor - 16/01/2023

Parabéns pelo tutorial!
Não sou mapper, mas me fez refletir em vários detalhes para criação de mapas com o plugin.
+REP