Muito bom o Código REP +
- Fórum
- OTServ
- Recursos
- Linguagens de Programação
- creature:moveTo(pos)
info
Registrado: 31/12/69
Posts: 0
Reputação: 0
info
Grupo: Administrador
Registrado: 08/07/05
Posts: 5.8k
Reputação: +1.4k
Gênero: Outro

Esta é uma contribuição para a maratona de projetos
Bom desempenho ao projeto!
info
Grupo: Campones
Registrado: 22/06/10
Posts: 89
Reputação: +9

Interessante, você implementou em C++ uma função para movimentar o personagem com o smart walk, é uma boa jogada também apesar que é possível se fazer em LUA;
Que tal agora um sistema parallel-thread para tais cálculos com alto-processamento ? Acho que seria bastante conveniente; Atualmente estou desenvolvendo algo do tipo para um projeto de faculdade, cujas ideias irão futuramente se transformar num servidor.
REP+
12 minutos atrás, Waterson disse:Interessante, você implementou em C++ uma função para movimentar o personagem com o smart walk, é uma boa jogada também apesar que é possível se fazer em LUA;
Que tal agora um sistema parallel-thread para tais cálculos com alto-processamento ? Acho que seria bastante conveniente; Atualmente estou desenvolvendo algo do tipo para um projeto de faculdade, cujas ideias irão futuramente se transformar num servidor.
REP+
Sei la, acho que nem é um processamento muito pesado, a parada que é meio paia no otserv que seria bacana de mudar ate mesmo usando essa ideia ai é a divisao que tem mais interna, que é o um thread pro scheduler, um pro asio e um pro dispatcher, porém o pesado é o dispatcher, ele se fosse subdividido ai ia melhorar pra caralho o processamento
sera que é muito complexo quebrar o dispatcher em threads e ainda assim manter a cronologia certa das execuções?
#topic
Muito boa implementação, meus parabéns.
info
Grupo: Campones
Registrado: 22/06/10
Posts: 89
Reputação: +9

O problema é o seguinte, você precisará ter controle das variáveis, exemplo, quando trabalhamos em maneira assíncrona dois threads poderão querer alterar/ler a mesma variável no mesmo exato segundo, e isso irá com certeza crashar ! A solução é utilizar uma biblioteca chamada atomic, ela terá novos tipos de variáveis chamados atomic_int, atomic_float, atomic_char ... etc ... que são exatamente iguais as int, float ,... mas ela possui um controle para que quando trabalhado de maneira assíncrona dois threads não possam modificar ou ler uma mesma variável no mesmo instante (seria um modelo chave fechadura, se um está lendo está trancado para o outro não ler, quando este terminar de ler será destrancando e o outro poderá a ler ...), o grande problema é que não existe por exemplo um atomic_luaState, ou seja, seria impossível trabalhar com multi-thread em LUA com esta biblioteca atomic, o esquema seria criar este modelo na mão para poder ser usado em variáveis do tipo luaState também !
6 minutos atrás, Waterson disse:O problema é o seguinte, você precisará ter controle das variáveis, exemplo, quando trabalhamos em maneira assíncrona dois threads poderão querer alterar/ler a mesma variável no mesmo exato segundo, e isso irá com certeza crashar ! A solução é utilizar uma biblioteca chamada atomic, ela terá novos tipos de variáveis chamados atomic_int, atomic_float, atomic_char ... etc ... que são exatamente iguais as int, float ,... mas ela possui um controle para que quando trabalhado de maneira assíncrona dois threads não possam modificar ou ler uma mesma variável no mesmo instante (seria um modelo chave fechadura, se um está lendo está trancado para o outro não ler, quando este terminar de ler será destrancando e o outro poderá a ler ...), o grande problema é que não existe por exemplo um atomic_luaState, ou seja, seria impossível trabalhar com multi-thread em LUA com esta biblioteca atomic, o esquema seria criar este modelo na mão para poder ser usado em variáveis do tipo luaState também !
entendi, complexo isso
e tipo tem que refatorar o codigo todo pra trabalhar com esses tipos do atomic tambem?
info
Grupo: Campones
Registrado: 22/06/10
Posts: 89
Reputação: +9

Nos locais aonde haverá transições entre threads sim !
Eu já fiz isso, pelo menos algo do tipo, consegui otimizar esta função acima de moveTo que eu usava em 4 NPCs de inteligência artificial (800-1200ms de ping) para 70 NPCs (290-420ms), porém estou tendo problemas com alocação de memória... então está complicando ...
info
Grupo: Campones
Registrado: 22/01/08
Posts: 41
Reputação: +18
Gênero: Masculino

43 minutos atrás, Waterson disse:é uma boa jogada também apesar que é possível se fazer em LUA;
eu já sugeri ter muito cuidado pra usar essa função... se fosse uma implementação Lua, eu então diria pra nem usá-la! hahhahahahha
43 minutos atrás, Waterson disse:Que tal agora um sistema parallel-thread para tais cálculos com alto-processamento ? Acho que seria bastante conveniente; Atualmente estou desenvolvendo algo do tipo para um projeto de faculdade, cujas ideias irão futuramente se transformar num servidor.
REP+
25 minutos atrás, dalvorsn disse:sera que é muito complexo quebrar o dispatcher em threads e ainda assim manter a cronologia certa das execuções?
Infelizmente eu não sou designer de framework, apenas desenvolvo conteúdo em cima da plataforma. Então eu parto do pressuposto de que o servidor cumpre com maestria o que eu preciso.
Afinal, nunca vi um OT que o gargalo seja o processamento. Em um OT que atingiu 2 mil jogadores, o computador não chegou a bater 50% de processamento... e nem era um dedicado tão possante.
Além disso tudo, o meu projeto possui características que pode alterar como funciona o mapa, posso bufferizar todo o mapa no cliente.
No que eu tenho conhecimento, essa parte do mapa é um dos grandes vilões do processamento.
23 minutos atrás, Marce Loko disse:Infelizmente eu não sou designer de framework, apenas desenvolvo conteúdo em cima da plataforma. Então eu parto do pressuposto de que o servidor cumpre com maestria o que eu preciso.
Afinal, nunca vi um OT que o gargalo seja o processamento. Em um OT que atingiu 2 mil jogadores, o computador não chegou a bater 50% de processamento... e nem era um dedicado tão possante.
Além disso tudo, o meu projeto possui características que pode alterar como funciona o mapa, posso bufferizar todo o mapa no cliente.
No que eu tenho conhecimento, essa parte do mapa é um dos grandes vilões do processamento.
do processamento e da rede ne, um map descriptions full envia uma quantidade de dados ferrada xD
essa parada de bufferizar o mapa é bacana, dai ficam apenas os things e uma eventual atualizaçao do mapa ne?
info
Grupo: Campones
Registrado: 22/01/08
Posts: 41
Reputação: +18
Gênero: Masculino

48 minutos atrás, dalvorsn disse:do processamento e da rede ne, um map descriptions full envia uma quantidade de dados ferrada xD
essa parada de bufferizar o mapa é bacana, dai ficam apenas os things e uma eventual atualizaçao do mapa ne?
sim, como o meu mapa é pequeno, dá certinho
eu não cheguei a profilar, mas me disseram que considerável porcentagem do processamento é relativo ao map description
info
Grupo: Campones
Registrado: 22/06/10
Posts: 89
Reputação: +9

No fim das contas o problema não era alocação de memória, era um simplesmente um crash no thread secundário ocasionado por um problema relacionado aos protocolos que eu havia utilizado para comunicação para averiguar a situação dos processamentos pelo cliente. O erro default para esse tipo de coisa era Memory Allocation Failed, porém esse erro é exibido sempre que ocorre um erro ou no MainThread ou em qualquer outro thread que não seja o Dispatcher.
Sistema funcionando
- Sistema é exibido no final do vídeo. [isto fora um trabalho da faculdade da matéria de Ciência, Tecnologia, Sociedade e Ambiente & Jogos, Games e Gameficação]



info
Grupo: Campones
Registrado: 22/01/08
Posts: 41
Reputação: +18
Gênero: Masculino
Bom dia!
Esse código faz a creature (NPC, monster ou player) andar até a posição desejada.
Notas:
Coloque em luascript.cpp
registerMethod("Creature", "moveTo", LuaScriptInterface::luaCreatureMoveTo);
Coloque em luascript.h
static int luaCreatureMoveTo(lua_State* L);
Substitua a função original em creature.cpp
Substitua a função original em monster.cpp
Aproveitem! Abraço.