рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдСрдирд▓рд╛рдЗрди рдЧреЗрдо рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ред рднрд╛рдЧ 1: рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ



рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдореЗрд░реЗ рдкрд╛рд╕ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдЫреБрдЯреНрдЯреА рдереА, рдФрд░ рдореЗрд░реЗ рдШрд░ рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЛ рд╢рд╛рдВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдерд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд░реБрд╕реНрдд рдкрд░ рдЕрдкрдирд╛ рд╕рд░рд▓ рдСрдирд▓рд╛рдЗрди рдЧреЗрдо рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдПрдХ рд╕рд╛рдзрд╛рд░рдг 2D рд╢реВрдЯрд░ред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдФрд░ рд╡рд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдФрд░ рдХреИрд╕реЗред рдЪреВрдВрдХрд┐ рд╢реИрд▓реА рдореЗрдВ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдпреВрдбреАрдкреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ MIT рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рдкрд░рд┐рдгрд╛рдореА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ crates.io рдкрд░ рднреА рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐: рдП) рдпрд╣ рддрдм рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред рдЦ) рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдФрд░ рд▓рд╛рдн рд▓рд╛рдПрдЧрд╛ред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕рдВрджрд░реНрдн


-> рд╕реНрд░реЛрдд
-> рдкреБрд╕реНрддрдХрд╛рд▓рдп crates.io рдкрд░
-> рдкреНрд░рд▓реЗрдЦрди

рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ


рдЧреНрд░рд╛рд╣рдХ


//   use victorem; fn main() -> Result<(), victorem::Exception> { // ,    11111      127.0.0.1:22222 let mut socket = victorem::ClientSocket::new("11111", "127.0.0.1:22222")?; loop { //    socket.send(b"Client!".to_vec()); //    .             socket.recv().map(|v| String::from_utf8(v).map(|s| println!("{}",s))); } } 

рд╕рд░реНрд╡рд░


 //   use victorem; use std::time::Duration; use std::net::SocketAddr; //,  .            . struct ClientServerGame; //     Game,         impl victorem::Game for ClientServerGame { //,     .       false,   . fn handle_command(&mut self, delta_time: Duration, commands: Vec<Vec<u8>>, from: SocketAddr) -> bool { for command in commands { String::from_utf8(command).map(|s| println!("{}",s)); } true } //     30 .     ,     .      ,     . fn draw(&mut self, delta_time: Duration) -> Vec<u8> { b"Server!".to_vec() } } fn main() -> Result<(), victorem::Exception> { // ,      ClientServerGame     22222 let mut server = victorem::GameServer::new(ClientServerGame, "22222")?; //       . server.run(); Ok(()) } 

рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдбрд┐рд╡рд╛рдЗрд╕


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЕрдЧрд░ рдореИрдВ рд▓рд╛рдорд┐рдирд╛рд░ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдХрдЪреНрдЪреЗ рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдХреЗ рдмрдЬрд╛рдп рдХрдЪреНрдЪреЗ рдпреВрдбреАрдкреА рд╕реЙрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдХреЛрдб рдХреЛ 100 рдХреЗ рдХрд╛рд░рдХ рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рд▓реЗрдЦреЛрдВ рдХреА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдЧреЗрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ ред
рд╕рд░реНрд╡рд░ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯреНрд╕ рд╕реЗ рдХрдорд╛рдВрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдЙрд╕ рдмрдЯрди рдпрд╛ рдХреАрдмреЛрд░реНрдб рдкрд░ рдХреБрдЫ рдмрдЯрди рджрдмрд╛рдХрд░) рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд░рд╛рдЬреНрдп рднреЗрдЬрдирд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпреВрдирд┐рдЯреНрд╕ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡реЗ рдЬрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ) рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд▓реЗрдпрд░ рдХреЛ рдПрдХ рддрд╕реНрд╡реАрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рд░реНрд╡рд░ рдкрд░


 //         u32     ,  0 -  , 1 -   ,      . pub fn get_lost(&self) -> (u32, u32) { let mut sequence: u32 = 0; let mut x = 0; let mut y = self.last_received_packet_id; while x < 32 && y > 1 { y -= 1; if !self.received.contains(&y) { let mask = 1u32 << x; sequence |= mask; } x += 1; } (sequence, self.last_received_packet_id) } 

рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░


 //      (max_id)         (sequence)  .           fn get_lost(&mut self, max_id: u32, sequence: u32) -> Vec<CommandPacket> { let mut x = max_id; let mut y = 0; let mut ids = Vec::<u32>::new(); //      , ,     ,      . let max_cached = self.cache.get_max_id(); if max_cached != max_id { ids.push(max_cached); } while x > 0 && y < 32 { x -= 1; let mask = 1u32 << y; y += 1; let res = sequence & mask; if res > 0 { ids.push(x); } } self.cache.get_range(&ids) } 

рдЙрдкрд╕рдВрд╣рд╛рд░


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдорд╛рдВрдб рдбрд┐рд▓реАрд╡рд░реА рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рдерд╛ред рд╕рд░реНрд╡рд░ рдкрд░, рдХреЗрд╡рд▓ рдЙрд╕ рдкреИрдХреЗрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде +1 рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рдкреИрдХреЗрдЯ рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдмрд╛рдХреА рд╣реИ, рдФрд░ рдмрд╛рдХреА рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рдкреИрдХреЗрдЯ рднреЗрдЬреЗрдВред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░, рдЙрди рд╕рднреА рдХрдорд╛рдВрдбреНрд╕ рдХрд╛ рдХреИрд╢ рд░рдЦреЗрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдпреВрдЬрд░ рдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдереАред рд╣рд░ рдмрд╛рд░ рдПрдХ рдирдпрд╛ рд░рд╛рдЬреНрдп рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рд╕реЗ рдЖрддрд╛ рд╣реИ, рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдЕрдВрддрд┐рдо рдкреИрдХреЗрдЯ, рдЗрд╕реЗ рдХреИрд╢ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рд╕рднреА рдкреИрдХреЗрдЯ рдХрдо рд╕реЗ рдХрдо рд╣реИред рд╢реЗрд╖ рд╕рднреА рдкреИрдХреЗрдЯ рдлрд┐рд░ рд╕реЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрдм рдореИрдВ рдЧреЗрдо рдХреЛ рдЦреБрдж рдмрдирд╛рдКрдВрдЧрд╛, рдЙрдкрдпреЛрдЧ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдореИрдВ рдЖрдЧреЗ рдФрд░ рд╕реБрдзрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рд▓рд╛рдЗрдм рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реВрдВрдЧрд╛ред рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдХреАрдбрд╝реЗ рдорд┐рд▓реЗрдВрдЧреЗред

рдореБрдЭреЗ рдпрд╣рд╛рдВ C # рдореЗрдВ рдПрдХ рдЧреЗрдо рд╕рд░реНрд╡рд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдорд┐рд▓рд╛ - Rust рдкрд░ Networker +, рдПрдХ рдкрддреНрддрд╛ рд╣реИ, рдЧреЛ - рд▓реАрдл рдкрд░ рдЧреЗрдо рд╕рд░реНрд╡рд░ рдХреЗ рдПрдирд╛рд▓реЙрдЧ рдХреА рддрд░рд╣ред рдХреЗрд╡рд▓ рдкреНрд░рдЧрддрд┐ рдореЗрдВ рд╡рд┐рдХрд╛рд╕ рд╣реИред

PS рдкреНрд░рд┐рдп рдорд┐рддреНрд░, рдпрджрд┐ рдЖрдк рдПрдХ рд╢реБрд░реБрдЖрдд рд╣реИрдВ рдФрд░ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдХреЛрдб рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдБ рдореЗрд░реА рд╕рд▓рд╛рд╣ рд╣реИ - рдЬреИрд╕рд╛ рдореИрдВ рдХрд░рддрд╛ рд╣реВрдБ рд╡реИрд╕рд╛ рдордд рдХрд░реЛред рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рд╕рдм рдХреБрдЫ рдорд┐рд▓рд╛рдпрд╛ рдФрд░ "рдПрдПрдП" рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд┐рдпрд╛ (Google рдпрд╣ рдХреНрдпрд╛ рд╣реИ)ред рдЖрдкрдХреЛ рдпрд╣ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдПрдХ рдЪреАрдЬ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдПрдХ рд╕рд╛рде рдХрдИ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ, рдФрд░ рдЪрд░рдгреЛрдВ рд╕реЗ рдорд┐рд▓рдХрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

  1. рдЖрдкрдиреЗ рдЕрдкрдиреЗ рдЪрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдП;
  2. рдЖрдк рдЬрд┐рд╕ рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдЖрдк рдХрд░рддреЗ рд╣реИрдВ;
  3. рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП

  fn add_one(x:usize) -> usize { x+1 } #[test] fn add_one_fn_should_add_one_to_it_argument(){ let x = 2; let expected = x+1; ///////////////////////// let result = add_one(x); ////////////////////////////////// assert_eq!(expected,result); } 

Source: https://habr.com/ru/post/hi435384/


All Articles