<!-- MHonArc v2.4.4 --> <!--X-Subject: [MUD-Dev] Re: processors --> <!--X-From-R13: Oqnz Ivttvaf <nqnzNnatry.pbz> --> <!--X-Date: Mon, 1 Feb 1999 10:53:06 -0800 --> <!--X-Message-Id: Pine.SGI.3.96.990201104136.18066C-100000#zazu,angel.com --> <!--X-Content-Type: text/plain --> <!--X-Reference: E107Ckc-0007kR-00#koala,kanga.nu --> <!--X-Head-End--> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <html> <head> <title>MUD-Dev message, [MUD-Dev] Re: processors</title> <!-- meta name="robots" content="noindex,nofollow" --> <link rev="made" href="mailto:adam#angel,com"> </head> <body background="/backgrounds/paperback.gif" bgcolor="#ffffff" text="#000000" link="#0000FF" alink="#FF0000" vlink="#006000"> <font size="+4" color="#804040"> <strong><em>MUD-Dev<br>mailing list archive</em></strong> </font> <br> [ <a href="../">Other Periods</a> | <a href="../../">Other mailing lists</a> | <a href="/search.php3">Search</a> ] <br clear=all><hr> <!--X-Body-Begin--> <!--X-User-Header--> <!--X-User-Header-End--> <!--X-TopPNI--> Date: [ <a href="msg00343.html">Previous</a> | <a href="msg00345.html">Next</a> ] Thread: [ <a href="msg00341.html">Previous</a> | <a href="msg00342.html">Next</a> ] Index: [ <A HREF="author.html#00344">Author</A> | <A HREF="#00344">Date</A> | <A HREF="thread.html#00344">Thread</A> ] <!--X-TopPNI-End--> <!--X-MsgBody--> <!--X-Subject-Header-Begin--> <H1>[MUD-Dev] Re: processors</H1> <HR> <!--X-Subject-Header-End--> <!--X-Head-of-Message--> <UL> <LI><em>To</em>: <A HREF="mailto:mud-dev#kanga,nu">mud-dev#kanga,nu</A></LI> <LI><em>Subject</em>: [MUD-Dev] Re: processors </LI> <LI><em>From</em>: Adam Wiggins <<A HREF="mailto:adam#angel,com">adam#angel,com</A>></LI> <LI><em>Date</em>: Mon, 1 Feb 1999 10:52:58 -0800 (PST)</LI> <LI><em>Reply-To</em>: <A HREF="mailto:mud-dev#kanga,nu">mud-dev#kanga,nu</A></LI> </UL> <!--X-Head-of-Message-End--> <!--X-Head-Body-Sep-Begin--> <HR> <!--X-Head-Body-Sep-End--> <!--X-Body-of-Message--> <PRE> On Sun, 31 Jan 1999, J C Lawrence wrote: > diablo <diablo#best,com> wrote: > > A 3 second task would take 20 seconds, but this only happened with a > > heavy player load. Our tasks are held in a table indexed to some > > number (some sort of ticker in linux? I don't know the proper names > > for anything). That table is polled every time the game searches for > > player input (it cycles through all our player lines constantly), > > and if a task is found to be either overdue or ready to go off, it > > goes off. > > Ouch. > > Cheaper: > > 1) Keep the table, but sort it by due time and pProcess the table > only up to the first record that has a due date in the future. You > need to take care in your table and sort code to make it minimally > expensive (choice of sorting algorithm), and in your storage format to > ensure minimal traversal and ordering expense (no buffer copies, only > pointer copies if possible). Standard event handlers. I've written them at the start of so many projects now I think I could do it blind, typing with my nose, and still finish in less than 90 seconds. In fact, here we go: typedef float Tick; class Event { friend class EventManager; public: Event(Tick time) { RipenTime = EventManager::GetCurrentTime() + time; EventManager::AddEvent(this); } virtual void Ripen() = 0; bool RipensBefore(Event *e) { return (RipenTime < e->RipenTime); } bool RipensBy(Tick time) { return (RipenTime <= time); } private: Tick RipenTime; // time at which event ripens bool HasRipened; // flag for deletion Event *Next; }; class EventManager { public: EventManager() { Events = NULL; GameTick = 0; } static void Update() { bool update = false; // Execute each event that is due to ripen Event *e; for (e = Events; e; e = e->Next) { if (e->RipensBy(GameTick)) { e->Ripen(); e->HasRipened = true; update = true; } } // Second pass, delete all ripened events if (update) { Event *next, *prev = NULL; for (e = Events; e; e = Next) { next = e->Next; if (!e->HasRipened) prev = e; else { if (prev) prev->Next = e->Next; else events = e->Next; delete e; } } } // Increment the game timer GameTick += TimeManager::GetTicksEllapsedLastUpdate(); } static void AddEvent(Event *newEvent); { // Descend the list until a later event is found Event *e, *prev = NULL; for (e = events; e && e->RipensBefore(newEvent); e = e->Next) prev = e; // Insert the new event before that event newEvent->HasRipened = false; newEvent->Next = e; if (prev) prev->Next = newEvent; else Events = newEvent; } static Tick GetCurrentTime() { return GameTick; } protected: static Event *Events; static Tick GameTick; }; This could, of course, easily be converted to C (I'd be happy to do so if anyone desires, it'd take probably another 90 seconds). Those into design patterns would probably also do the event manager as a singleton (or perhaps have multiple event managers for different types of events) rather than using all statics, but I wanted to keep the example simple. Adam W. </PRE> <!--X-Body-of-Message-End--> <!--X-MsgBody-End--> <!--X-Follow-Ups--> <HR> <!--X-Follow-Ups-End--> <!--X-References--> <UL><LI><STRONG>References</STRONG>: <UL> <LI><STRONG><A NAME="00340" HREF="msg00340.html">[MUD-Dev] Re: processors</A></STRONG> <UL><LI><EM>From:</EM> J C Lawrence <claw#kanga,nu></LI></UL></LI> </UL></LI></UL> <!--X-References-End--> <!--X-BotPNI--> <UL> <LI>Prev by Date: <STRONG><A HREF="msg00343.html">[MUD-Dev] Re: processors</A></STRONG> </LI> <LI>Next by Date: <STRONG><A HREF="msg00345.html">[MUD-Dev] Re: processors</A></STRONG> </LI> <LI>Prev by thread: <STRONG><A HREF="msg00341.html">[MUD-Dev] Re: processors</A></STRONG> </LI> <LI>Next by thread: <STRONG><A HREF="msg00342.html">[MUD-Dev] Re: processors</A></STRONG> </LI> <LI>Index(es): <UL> <LI><A HREF="index.html#00344"><STRONG>Date</STRONG></A></LI> <LI><A HREF="thread.html#00344"><STRONG>Thread</STRONG></A></LI> </UL> </LI> </UL> <!--X-BotPNI-End--> <!--X-User-Footer--> <!--X-User-Footer-End--> <ul><li>Thread context: <BLOCKQUOTE><UL> <LI><STRONG>[MUD-Dev] Re: processors</STRONG>, <EM>(continued)</EM> <ul compact> <ul compact> <LI><strong><A NAME="00331" HREF="msg00331.html">[MUD-Dev] Re: processors</A></strong>, diablo <a href="mailto:diablo#best,com">diablo#best,com</a>, Sun 31 Jan 1999, 03:00 GMT <UL> <LI><strong><A NAME="00336" HREF="msg00336.html">[MUD-Dev] Re: processors</A></strong>, Mik Clarke <a href="mailto:mikclrk#ibm,net">mikclrk#ibm,net</a>, Sun 31 Jan 1999, 18:50 GMT </LI> <LI><strong><A NAME="00340" HREF="msg00340.html">[MUD-Dev] Re: processors</A></strong>, J C Lawrence <a href="mailto:claw#kanga,nu">claw#kanga,nu</a>, Mon 01 Feb 1999, 06:22 GMT <UL> <LI><strong><A NAME="00341" HREF="msg00341.html">[MUD-Dev] Re: processors</A></strong>, Marc Hernandez <a href="mailto:marc#ias,jb.com">marc#ias,jb.com</a>, Mon 01 Feb 1999, 07:08 GMT </LI> <LI><strong><A NAME="00344" HREF="msg00344.html">[MUD-Dev] Re: processors</A></strong>, Adam Wiggins <a href="mailto:adam#angel,com">adam#angel,com</a>, Mon 01 Feb 1999, 18:53 GMT </LI> </UL> </LI> <LI><strong><A NAME="00342" HREF="msg00342.html">[MUD-Dev] Re: processors</A></strong>, Petri Virkkula <a href="mailto:pvirkkul#iki,fi">pvirkkul#iki,fi</a>, Mon 01 Feb 1999, 07:36 GMT </LI> </UL> </LI> <LI><strong><A NAME="00338" HREF="msg00338.html">[MUD-Dev] Re: processors</A></strong>, Greg Underwood <a href="mailto:gunderwood#donet,com">gunderwood#donet,com</a>, Mon 01 Feb 1999, 02:15 GMT <UL> <LI><strong><A NAME="00343" HREF="msg00343.html">[MUD-Dev] Re: processors</A></strong>, Adam Wiggins <a href="mailto:adam#angel,com">adam#angel,com</a>, Mon 01 Feb 1999, 18:38 GMT </LI> </UL> </LI> </ul> </ul> </LI> <LI><strong><A NAME="00306" HREF="msg00306.html">[MUD-Dev] Re: Mud reviewing</A></strong>, Caliban Tiresias Darklock <a href="mailto:caliban#darklock,com">caliban#darklock,com</a>, Wed 27 Jan 1999, 16:10 GMT </LI> </UL></BLOCKQUOTE> </ul> <hr> <center> [ <a href="../">Other Periods</a> | <a href="../../">Other mailing lists</a> | <a href="/search.php3">Search</a> ] </center> <hr> </body> </html>