<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#ffffff" text="#000000">
    I question if the lag is as bad as you are expecting it to be. Some
    connections and/or rural areas are worst than others but I am not
    sure it will be as bad as you think. For example, if you look back
    at the last few e-mails I sent to this list you will see my current
    project treats the client as a dumb terminal-- only key presses are
    send and object information is back unreliably 20 times a second.
    There is some dead reckoning (the object speed and direction are
    sent to the client and the client does that work while waiting for
    the next update) and I do not have an issue even on my mobile phone.<br>
    <br>
    My point is you should run a number of tests to see what you get.
    Make sure to play with the rate the "server" (or in your case client
    to client) sends data vs bandwidth usage. Make sure you do not flood
    the line with too many tiny packets and that you process all packets
    in a while loop (vs an if) to make sure you processes everything as
    fast as possible. Another note on my project is that I do not wait
    on an timers to process network events (as opposed to my log and
    display code that only happens 60 times a second).<br>
    <br>
    I think you may surprised yourself with what you can pull off in
    terms of latency.<br>
    <div class="moz-signature"><br>
      <hr style="height: 1px;">
      <p><span style="font-weight: bold;">Nicholas J Ingrassellino<br>
          <a style="text-decoration: none;"
            href="http://www.lifebloodnetworks.com/" target="_blank">LifebloodNetworks.com</a></span>
        || <a style="text-decoration: none;"
          href="mailto:nick@lifebloodnetworks.com">nick@lifebloodnetworks.com</a></p>
      <p style="font-size: 75%;">"<span style="font-style: italic;">The
          idea that I can be presented with a problem, set out to
          logically solve it with the tools at hand, and wind up with a
          program that could not be legally used because someone else
          followed the same logical steps some years ago and filed for a
          patent on it is horrifying.</span>"<br>
        - <span style="font-weight: bold;">John Carmack</span> on
        software patents</p>
    </div>
    <br>
    On 11/23/2010 10:00 PM, Philip Bennefall wrote:
    <blockquote cite="mid:E61F0244375C45C380DD8F39A8BAD8F7@chicken"
      type="cite">
      <meta content="text/html; charset=ISO-8859-1"
        http-equiv="Content-Type">
      <meta name="GENERATOR" content="MSHTML 8.00.6001.23067">
      <style></style>
      <div><font face="Arial" size="2">Hi all,</font></div>
      <div> </div>
      <div><font face="Arial" size="2">This is a fairly lengthy email,
          so I apologize in advance.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">I am relatively new to ENet. I
          have integrated it in my game engine and have successfully
          written a game which is working perfectly. It is one of those
          finger twitching action games where speed is of the utmost
          importance and delay is the most evil thing in the world. The
          way I do it is to keep sending the entire state for a player
          to the other party unreliably. The other client then works out
          the events that "must" have occured by looking at the
          differences between the last known state and the new one. This
          is far from a perfect solution as it neither scales well nor
          provides for very readable code. Here's a summary of how I'm
          handling things:</font></div>
      <div> </div>
      <div><font face="Arial" size="2">The game is a shooter where you
          run a round on a 1d grid firing rocks at your oponent's
          palace. When a rock hits a square on the other side it'll
          quickly begin piercing its way through until that section of
          the wall crumbles. During that time, the other player may use
          their hammer to defend the section.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">I wrote an internal layout
          description for myself before I started coding, which I then
          followed to ensure proper handling of all possible situations.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">---Start of Internal
          Description---</font></div>
      <div><font face="Arial" size="2">The way in which this game
          communicates over the network is fairly simple. The two
          players have a direct connection established between one
          another, and they send out their player state roughly 30 times
          a second. This player state contains the current x position,
          the current throwing position which is -1 if nothing is being
          thrown, and then a list of all the squares on that player's
          side. For each square, two values are stored. The first is the
          current resistance which is 20 on max, and 0 if the square is
          destroyed. The second one is crumbling speed which is 0 if the
          square is not currently crumbling, and a value in milliseconds
          otherwise. This value is used to measure if two or more rocks
          have been thrown on the same square.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">When a new state is received from
          the remote player, we have to analyse this information in
          order to determine what changes that have occured and if we
          need to take any action.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">If a new x position is received,
          we simply move the player's local variable to this square and
          play a footstep sound.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">If the new throwing position is
          different from our old one, we can take a few actions
          depending on its value:</font></div>
      <div> </div>
      <div><font face="Arial" size="2">1. If the new one is greater than
          -1 and the old one is -1, the remote player threw a rock at
          us. we play the throwing sound in the appropriate location,
          but take no other action.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">2. If the new one is -1 and the
          old one is greater than -1, we can assume that the remote
          player hit us and start the crumbling sequence for that square
          on our end. Naturally if our square is already crumbled, the
          remote player will not get any hit notifications from us. </font></div>
      <div> </div>
      <div><font face="Arial" size="2">3. If they both are greater than
          -1, we can assume that the remote player hit us and so we
          activate that sequence as above. We can also assume that the
          remote player made a new throwing attempt in another location
          and that we didn't see the -1 state that came prior to it
          probably because of lag, and so we play another throwing sound
          in the new location.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">After this, we go on to scan the
          game board and do the following for each square:</font></div>
      <div> </div>
      <div><font face="Arial" size="2">If the new resistance is greater
          than the old one, the remote player hammered and so we play
          that sound.</font></div>
      <div> </div>
      <div><font face="Arial" size="2">If the new resistance is lower
          than the old one, we can take four actions.</font></div>
      <div> </div>
      <font face="Arial" size="2">
      </font>
      <div><font face="Arial" size="2"><br>
          1. If the new resistance is 0 and the old resistance is
          greater than 0, the square just broke so we play the
          appropriate sound and forget about it.</font></div>
      <div><font face="Arial" size="2"> </font></div>
      <div><font face="Arial" size="2">2. If the old crumbling speed is
          the same as the new one, this was a normal crumbling step and
          so we play the appropriate sound.</font></div>
      <div><font face="Arial" size="2"> </font></div>
      <div><font face="Arial" size="2">3. If the old crumbling speed is
          0 and the new one is greater than 0, this was a new hit so we
          react accordingly.</font></div>
      <div><font face="Arial" size="2"> </font></div>
      <div><font face="Arial" size="2">4. If the old one is greater than
          the new one and the new one is greater than 0, this was a new
          hit on the same square.<br>
        </font><font face="Arial" size="2">---End of Internal
          Description---</font></div>
      <div> </div>
      <div><font face="Arial" size="2">I realize that this is a lot of
          very game specific information, and that's exactly my point.
          This all seems like a very dirty hack to me, and I was
          wondering if any of you can suggest a better and more scalable
          way of doing this while still keeping latency to an absolute
          minimum?</font></div>
      <div> </div>
      <div><font face="Arial" size="2">Thanks in advance for any help!</font></div>
      <div> </div>
      <div><font face="Arial" size="2">Kind regards,</font></div>
      <div> </div>
      <div><font face="Arial" size="2">Philip Bennefall</font></div>
      <div><font face="Arial" size="2">P.S. I should perhaps mention
          that this is a game for the blind; entirely based on sound,
          which is why sounds are mentioned all over the place rather
          than graphics.</font></div>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
_______________________________________________
ENet-discuss mailing list
<a class="moz-txt-link-abbreviated" href="mailto:ENet-discuss@cubik.org">ENet-discuss@cubik.org</a>
<a class="moz-txt-link-freetext" href="http://lists.cubik.org/mailman/listinfo/enet-discuss">http://lists.cubik.org/mailman/listinfo/enet-discuss</a>
</pre>
    </blockquote>
  </body>
</html>