[Ajuda] Lуgica para otimizaзгo de sistema de casa
#1

Boa.

Pessoal, meu problema й o seguinte; em um sistema de casas que estou desenvolvendo, faзo da seguinte forma

Cada casa й salva em um arquivo. Quando o gamemode й iniciado, й percorrido todos os arquivos e carrega as informaзхes preenchendo um enum. "houseinfo[house_id][house_owner]", por exemplo. A questгo й que, em todo comando relacionado ao sistema de casas me vejo obrigado em fazer um loop no nъmero total de casas comparando a posiзгo do jogador com a posiзгo de todas as casas atй, obviamente, achar a casa em que o jogador se encontra. Encontrando-a, pego o id da casa e comeзo a trabalhar com as informaзхes.

Minha cabeзa me diz que isso pode ser mais otimizado. Afinal, ficar fazendo loops nгo й algo legal. Que lуgica vocкs utilizariam para resolver o problema, para evitar ao mбximo o uso de loops em todos os comandos? Se й que existe uma alternativa para isso.

Pode parecer bobo, mas o que fiz para otimizar isso й usar um break ao encontrar a casa. Й algo bem bobo mesmo, mas em muitos cуdigos que vi por aн, o desenvolvedor deixa o loop percorrendo mesmo depois de encontrar o que quer.
Reply
#2

Usa pick-up?

Poderia converter para um salvamento numa base de dados SQL como por exemplo SQLite aн nгo teria que salvar cada casa por aquivo...

Mas sу vendo o cуdigo que vocк estб a usar para ajudar a melhorar.

P.S: coloque no tуpico a tag ajuda.
Reply
#3

Pense nas vezes que vocк vai utilizar estes loops. Serб apenas uma vez ao carregar o sistema.

Vocк realmente se importa se o servidor congelar alguns milesimos de segundo durante o carregamento? Pois й. Nгo й necessбrio grandes otimizaзхes nessa parte. Quanto a parte de salvar, vocк pode ir salvando sempre que houver alteraзхes em determinada casa, provavelmente cada arquivo de casa nгo terб muita informaзгo, portanto serб rбpido para editar.
Reply
#4

Da para fazer diversas funзхes para localizar uma casa.

Vocк pode utilizar por id, por local, nome do dono e etc... Se o jogador for dono, armazene o id da casa do jogador em uma variбvel e aн vocк pode verificar se ele estб prуximo а casa, assim vocк nгo precisa fazer o loop, jб que vocк possui o id da casa. E por aн vai...
Reply
#5

Vocкs nгo entenderam nada. Hahahaha.

Eu jб faзo o loop quando o gamemode inicial preenchendo as enums. O problema й que, por exemplo, quando o jogador digitar o comando "/ComprarCasa" eu preciso, obviamente, saber o id da casa em que ele estб e trabalhar com os dados. Aн que й o problema.

"/Comprarcasa" - Loop para descobrir o id da casa que o jogador se encontra
"/Trancarcasa" - Loop para descobrir o id da casa que o jogador se encontra

Queria evitar de fazer esse loops no enum durante os comandos. Hб como?

Usar um banco de dados estб fora de cogitaзгo.

Lуs, mesmo fazendo isso que vocк falou, vou ter que criar o loop. Afinal, como saberei qual a casa prуxima do jogador?
Reply
#6

Nгo, nгo hб como. Uma vez que vocк necessita iterar a variбvel para descobrir qual ID a casa pertence. O ъnico jeito de evitar o looping seria utilizando SQL fora isso nгo existe outra soluзгo.
Reply
#7

Se nгo quer utilizar loops simples: nгo faзa comando para comprar a casa PRУXIMA mas sim para comprar a casa com o ID X. Basta criar uma simples label em cada casa a informar o ID da casa. Os jogadores fazem /comprarcasa <id> e compram a casa. Dentro do comando й sу preciso verificar se o jogador estб perto da casa.

Da forma para comprar a casa PRУXIMA, se fizer com pickups, hб maneira de fazer de uma forma mais optimizada do que loops usando a funзгo OnPlayerPickUpPickup
Reply
#8

Quote:
Originally Posted by bruxo00
Посмотреть сообщение
Se nгo quer utilizar loops simples: nгo faзa comando para comprar a casa PRУXIMA mas sim para comprar a casa com o ID X. Basta criar uma simples label em cada casa a informar o ID da casa. Os jogadores fazem /comprarcasa <id> e compram a casa. Dentro do comando й sу preciso verificar se o jogador estб perto da casa.

Da forma para comprar a casa PRУXIMA, se fizer com pickups, hб maneira de fazer de uma forma mais optimizada do que loops usando a funзгo OnPlayerPickUpPickup
Exatamente, o filterscript gl_property (que jб vem na pasta do SA-MP) usa esta mesma lуgica.
Reply
#9

Eu prefiro utilizar a Streamer com Dynamic Area pra obter o ID da casa que o player estб, ou verificar se ele se aproximou de alguma, nunca testei a velocidade, mas o load no servidor й minimo.
Reply
#10

Um loop de 300~3000 voltas a cada rara vez que um player utilizar tal comando nгo iria gastar mais que 6 ms.

Porйm pode usar areas do streamer, ele farб o loop por vocк, com a velocidade do c++
Reply
#11

Eu usei essa maneira no sistema de casas do meu GM (WarCity) e nгo tive problemas.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)