Ir ao conteúdo

Ajuda com C++


Takutanuva

Posts recomendados

Postado

Eu pressiso fazer um IP Server em C++ (Borland C++ 6.0) que crie Threads, um para cada novo cliente que se conectar ao server, e mais unz 5 ou 6 normais (eu pressiso...). E que executem um comando para cada mensagem recebida de qualquer cliente...

Gostaria de um metodo para enviar uma mensagem para todos os players também....

De preferência na janela do DOS (sem as janelinhas do windows, estilo a do CMD)

Alguem pode me ensinar? (ou de preferência postar um exemplo :P )

É que eu não sei programar quase nada em c++... Eu estava fazendo o server em Ruby, fiz perfeitamente, mas avia muito lag.... Por isso achei que C++ seria uma boa solução....

Desde já agradeço :D

  • Membro VIP
Postado

Primeiro descubra o que causou o lag, se o processador não estiver a 100% no server feito em ruby é pouco provavel que reescrever em C++ va ajudar.

obs: Se importa em mostrar o fonte em ruby?

Postado

Primeiro descubra o que causou o lag, se o processador não estiver a 100% no server feito em ruby é pouco provavel que reescrever em C++ va ajudar.

obs: Se importa em mostrar o fonte em ruby?

acho que não é o processador, por testei no computador de um amigo (um computador realmente bom) e não tive problema... E também testei diversos servers piratas de jogos no meu, funcionaram perfeitamente...

Bem, senhor, a principiu eu não gostaria de postalo... Mas vou tentar explicar o problema, ok?

Eu já avia feito ele de 4 formas diferentes, mas a quarta se provou ser a mais veloz. Eu fiz um arquivo mestre (Server.rb) e dei o comando:


def requireFile!(filename)
  if FileTest.exis?(filename)
    Thread.new do
      require(filename)
    end
  else
    raise(NoConfigError, "It's not possible to open a required file: \"#{filename}\"...")
  end
end
# E por um exemplo:
requireFile!("Data\\Required\\Monsters.rb")

Todos os arquivos funcionaram perfeitamente, até eu ter que ler o Monsters.rb......

Ele executa um codigo para varias criaturas, para controlalas durante o jogo....


for i in $monsters
  ...
end

Mas, o problema é ali... A cada novo comando que eu coloco dentro daquele codigo, a velocidade (apenas dos monstros) é dividida pela metade....

Eu já tentei de tudo para resolver isto, por quê ali dentro, devem aver ao menos 50 comandos, e a Array $monsters deveria ter unz 2000 integrantes...

Num programa de ruby normal roda sem problema, mas dentro do server não está funcionando como eu esperava....

Pode me ajudar? (Se fizer em ruby, com certeza facilitaria, pois não sei quase nada de C++)

Postado

Se não for o processador deve ser um problema com a lógica, como você faz o controle do tempo?

Como assim controle do tempo? Desculpe, não entendi oquê você quis dizer....

Postado

Os monstros não se teletransportam certo? Eles andam (devem andar) do ponto x ao y em t segundos, como você faz para controlar isso?

Hehe, claro que não se teletransportam :P

Eu fiz um loop


for monster in $monsters
  ...
end

E o programa lê isto constantemente... Ai ele verifika para todos os jogadores ON-Line, se eles não estão vendo as o lugar que está (ou seja, no loop ali, as operações dependem do numero de jogadores...). Se não tiver, e se ele estiver com o HP 0, ele renasce (ou ele inicia a contagem pra renascer...). Se tiver um jogador, ele o segue, e se tiver perto, o ataka.

Mas, isto é de menos, porquê CADA comando que eu boto ali dentro diminui a velocidade, nem que seja um rand(5)... Eu fiz um scriptzinhu pra kontar quantos monstros serão por segundo, se continuar do jeito que está (pois não cheguei a fazer realmente o script, apenas simulei os comandos), vão ser unz 5~6 monstros por segundo....

O senhor tem uma ideia? (eu não gostaria de postar os scripts... Mas se for nescessário, eu posto, afinal, você vai (tentar) me ajudar :D )

Obrigado

  • Membro VIP
Postado

difícil dizer...

Minha suspeita é que algum comando dentro desse loop faça o contador andar, quando ele só deveria andar ao sair do loop.

Postado

difícil dizer...

Minha suspeita é que algum comando dentro desse loop faça o contador andar, quando ele só deveria andar ao sair do loop.

O contador é de menos... O problema é que sempre que eu adiciono um comando qualquer, qualquer um mesmo, a velocidade diminui... Olha ai o contador improvisado que eu fiz (um aviso: a maioria das coisas ai são apenas para testar a velocidade, não tem nada aver com o script final, mas a velocidade vai ser a mesma...):


class Numeric
  def x=(other)
    @x = other
  end
  def x
    return @x
  end
end
$test_ = []
for i in 0..15
  $test_.push(i)
end
module Monsters
  def self.requireMonsters!
    $monsters = {}
    Dir.foreach("Data\\Monsters") do |filename|
      if filename.include?(".yaml")
        file = File.open("Data\\Monsters\\#{filename}")
        filename.slice!(".yaml")
        $monsters[filename] = YAML.load(file)
        file.close
      end
    end
  end
  def self.update
    $time__ = Time.new.strftime("%I:%M:%S %p | %d/%m/%Y").to_s if (defined? $time__).nil?
    (0..10000).each do |monster|
      a = rand(3)
      case a
      when 0
        b = rand(4)
        next unless $test_.any? { |a| a == "10" }
        $clients.each { |c| c.write("#{b}") }
        monster.x = 2 if b == 0
        monster.x = 4 if b == 1
        monster.x = 6 if b == 2
        monster.x = 8 if b == 3
      when 1
        b = rand(5)
        $clients.each { |c| c.write("#{b}") }
        d = rand(5)
        move = true if b > 2
        move = true if b < 4
        move = true if d == 0
        move = true if d == 1
        b -= 10 if move == true
      when 2
        for i in 0..10
          b = rand(4)
          case b
          when 0
            monster.x += 1
          when 1
            monster.x += 1
          when 2
            monster.x -= 1
          when 3
            monster.x -= 1
          end
        end
      end
      unless Time.new.strftime("%I:%M:%S %p | %d/%m/%Y").to_s == $time__
        puts "Current = #{monster}"
        $time__ = Time.new.strftime("%I:%M:%S %p | %d/%m/%Y").to_s
        break
      end
    end
  end
end
sleep 1
loop do
  Monsters.update
end

Tem alguma ideia? (Se preferir, eu posto todos os scripts... Ou te mando um demo...)

  • Membro VIP
Postado

Não vi você controlar o tempo em lugar nenhum ai, ao invés disso usa um loop infinito,

Com um loop infinito e tendo um monstro ele vai se movimentar a cada nova repetição do loop, se cada repetição demora 0.5 segundos sera um movimento a cada 0.5 segundos, mas se tiver dois monstros o loop precisaria rodar duas vezes para cada movimento dos monstros, com isso a velocidade de cada monstro cai pela metade, com três são três repetições para cada movimento, etc.

Tente colocar um controle de tempo para que a movimentação ocorra 1 vez a cada 1 segundo (por exemplo).

Postado

Não vi você controlar o tempo em lugar nenhum ai, ao invés disso usa um loop infinito,

Com um loop infinito e tendo um monstro ele vai se movimentar a cada nova repetição do loop, se cada repetição demora 0.5 segundos sera um movimento a cada 0.5 segundos, mas se tiver dois monstros o loop precisaria rodar duas vezes para cada movimento dos monstros, com isso a velocidade de cada monstro cai pela metade, com três são três repetições para cada movimento, etc.

Tente colocar um controle de tempo para que a movimentação ocorra 1 vez a cada 1 segundo (por exemplo).

Senhor, como eu disse, ali no exemplo eu apenas verifiquei quanto daria a velocidade... Ao invés de 0..10000 eu vou colocar os monstros, o primeiro case (que roda sobre um rand(3) ) naverdade vai ser uma variavel do proprio monstro, e, o monstro só vai se movimentar se ele não estiver em movimento, mas esqueci de botar o comando ali, deskulpe.

Mas, de qualquer jeito, isto não importa... A velocidade não vai ser alterada... O problema ali é a velocidade, o script em si eu farei depois de resolver o problema (amenos que fazelo antes lhe ajudara a deskobrir meu problema)

Uma outra coisa... No arquivo mestre (Server.rb), eu dou este comando:


requireFile!("Monsters.rb")
requireFile!("Players.rb")
requireFile!("Update.rb")
requireFile!("NPCs.rb")
Thread.new { loop { print " \b" } }
while true
end

Não sei por quê, mas sem o Thread.new { loop { print " \b" } } a velocidade abaixa, e muito... O senhor sabe por quê? (só por curiosidade)

  • Membro VIP
Postado


Thread.new { loop { print " \b" } }
while true
end

Querer adivinhar as coisas tendo só algums linhas de código fica difícil... Mas tudo bem, o que tem dentro do "while true/end"?

Postado


Thread.new { loop { print " \b" } }
while true
end

Querer adivinhar as coisas tendo só algums linhas de código fica difícil... Mas tudo bem, o que tem dentro do "while true/end"?

Errr, nada?

Os comandos são interpretados nos arquiros que são abertos pelo requireFile!... No final de todos tem


loop do
  # Os comandos respectivos a cada arquivo
end

Ali eu apenas botei para o programa em ruby não ser fechado.

  • Membro VIP
Postado

Ok, isso deve ser por causa da forma que o windows gerencia as threads, veja se fica mais rápido assim:


requireFile!("Monsters.rb")
requireFile!("Players.rb")
requireFile!("Update.rb")
requireFile!("NPCs.rb")
while true
sleep 0
end

Postado

Ok, isso deve ser por causa da forma que o windows gerencia as threads, veja se fica mais rápido assim:


requireFile!("Monsters.rb")
requireFile!("Players.rb")
requireFile!("Update.rb")
requireFile!("NPCs.rb")
while true
sleep 0
end

Não, não ficou mais rápido... Tem outra ideia? (Se pressisar eu posto tudo aqui ou posto um demo, tem 700kbs, por favor cara, me ajuda, eu realmente pressiso fazer este server...)

Obrigado

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!