Changeset 201

Show
Ignore:
Timestamp:
11/06/07 14:56:47 (1 year ago)
Author:
LeoD
Message:

--

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/jobs/defend/Main.d

    r200 r201  
    142142            profile!("sleep") 
    143143            ({ 
    144                 sleep(1); 
     144                //sleep(1); 
     145                //Thread.yield(); 
     146                 
     147                if(!renderer.window.active) 
     148                    sleep(10); 
    145149 
    146150                // Limit FPS and calculate frame time 
  • branches/jobs/defend/game/Game.d

    r200 r201  
    1010 
    1111import gen.core.JobSystem; 
     12import gen.renderer.All; 
     13import gen.sound.SoundSystem; 
     14import gen.input.Input; 
     15import gen.model.Model; 
    1216import gen.util.Wrapper; 
    1317import gen.util.Profiler; 
     
    1519import gen.util.Sprite2D; 
    1620import gen.util.ScreenDebugger; 
    17 import gen.renderer.All; 
    18 import gen.sound.SoundSystem; 
    19 import gen.input.Input; 
    20 import gen.model.Model; 
    2121import gen.math.Vector; 
    2222import gen.math.Matrix; 
     
    3434import defend.Config; 
    3535import defend.Camera; 
    36 import defend.game.Config; 
    37 import defend.game.Mouse; 
     36import defend.com.Gateway; 
     37import defend.terrain.Terrain; 
     38import defend.demo.Recorder; 
     39import defend.player.Manager; 
     40import defend.player.Info; 
    3841import defend.objects.Base; 
    3942import defend.objects.Manager; 
    4043import defend.objects.ObjectType; 
     44import defend.game.Jobs; 
     45import defend.game.Config; 
     46import defend.game.Mouse; 
     47import defend.game.hud.Hud; 
    4148import defend.game.net.All; 
    4249import defend.game.FakeGateway; 
    43 import defend.com.Gateway; 
    44 import defend.terrain.Terrain; 
    45 import defend.player.Manager; 
    46 import defend.player.Info; 
    47 import defend.game.hud.Hud; 
    48 import defend.demo.Recorder; 
    4950 
    5051class Game : IGameState 
     
    282283    void createJobs() 
    283284    { 
    284         auto inputJob = jobSystem.addFrameJob("input", &jobInput); 
    285  
    286         auto simulationJob = jobSystem.addFrameJob("simulation", &gateway.runSimulation); 
    287         auto gatewayJob = jobSystem.addFrameJob("gateway", &gateway.update); 
    288         auto updateSyncsJob = jobSystem.addFrameJob("syncs", &jobUpdateSyncs); 
    289         //updateSyncsJob.dependOn(simulationJob); 
     285        inputJob = jobSystem.addFrameJob("input", &jobInput); 
     286        simulationJob = jobSystem.addFrameJob("simulation", &gateway.runSimulation); 
     287        gatewayJob = jobSystem.addFrameJob("gateway", &gateway.update); 
     288        hudJob = jobSystem.addFrameJob("hud", &jobUpdateHUD); 
     289        mouseJob = jobSystem.addFrameJob("mouse", &jobUpdateMouse); 
    290290         
    291         auto hudJob = jobSystem.addFrameJob("hud", &jobUpdateHUD); 
    292         //hudJob.dependOn(inputJob); 
     291        updateSyncsJob = jobSystem.addFrameJob("syncs", &jobUpdateSyncs); 
     292        updateSyncsJob.dependOn(simulationJob); 
    293293         
    294         auto mouseJob = jobSystem.addFrameJob("mouse", &jobUpdateMouse); 
    295         //mouseJob.dependOn(inputJob); 
    296          
    297         auto updateGraphJob = jobSystem.addFrameJob("graph", &jobUpdateGraph); 
     294        updateGraphJob = jobSystem.addFrameJob("graph", &jobUpdateGraph); 
    298295        updateGraphJob.dependOn(updateSyncsJob); 
    299296         
    300         auto renderJob = jobSystem.addFrameJob("render", &jobRender); 
     297        renderJob = jobSystem.addFrameJob("render", &jobRender); 
    301298        renderJob.dependOn(hudJob); 
    302299        renderJob.dependOn(updateSyncsJob); 
    303         //renderJob.dependOn(simulationJob); 
    304         //renderJob.dependOn(gatewayJob); 
    305300        renderJob.dependOn(updateGraphJob); 
    306301        renderJob.dependOn(mouseJob); 
  • branches/jobs/defend/game/Mouse.d

    r198 r201  
    269269        if(mousePos.y < renderer.height - HUD_HEIGHT || areaSelection) 
    270270        { 
    271             if(inputManager.keyPressed(KeyType.LeftButton) && !areaSelection) 
     271            if(inputManager.keyPressedFirst(KeyType.LeftButton) && !areaSelection) 
    272272            { 
    273273                if(!inputManager.keyPressed(KeyType.LeftControl) || 
  • branches/jobs/defend/game/hud/Hud.d

    r190 r201  
    55import Float = tango.text.convert.Float; 
    66 
     7import gen.core.JobSystem; 
    78import gen.util.FPS; 
     9import gen.util.Bind; 
    810import gen.util.Bind; 
    911import gen.util.JobHub; 
    1012import gen.util.Gamestates; 
     13import gen.util.Statistics; 
    1114import gen.util.ProfilingDisplay; 
    12 import gen.util.Statistics; 
    1315import gen.util.ScreenDebugger; 
    1416import gen.math.Vector; 
     
    2325import gen.font.Font; 
    2426import gen.font.FreeType; 
    25 import gen.util.Property; 
    26 import gen.util.Bind; 
    2727import gen.input.Input; 
    2828 
     
    9595    } 
    9696     
     97    JobInfo profilerJob; 
     98     
    9799public: 
    98100    IFont font, littlefont; 
     
    112114        { 
    113115            profiling = new ProfilingDisplay(littlefont); 
     116            profilerJob = jobSystem.addPostFrameJob(&profiling.update); 
     117            profilerJob.disable; 
    114118        } 
    115119         
     
    139143        { 
    140144            if(inputManager.keyPressedFirst(KeyType.P)) 
    141                 profile = !profile
     145                profilerJob.toggleEnabled()
    142146                 
    143147            if(inputManager.keyPressedFirst(KeyType.V)) 
     
    171175            font.write(10, 30, Vec3f(1), "Time: {}", frametime); 
    172176 
    173             if(profile
     177            if(profilerJob.enabled
    174178                profiling.render(); 
    175179                 
  • branches/jobs/gen/core/JobSystem.d

    r200 r201  
    77import gen.util.Array; 
    88import gen.util.Wrapper; 
     9import gen.util.Profiler; 
    910import gen.util.Allocator; 
    1011 
     
    2223    void onAllocate() 
    2324    { 
     25        enabled = true; 
     26        enableAfterFrame = false; 
     27        disableAfterFrame = false; 
    2428        name = ""; 
    2529        deps = []; 
     
    3034    } 
    3135     
     36    bool enabled = true; 
     37    bool enableAfterFrame = false; 
     38    bool disableAfterFrame = false; 
     39     
    3240    char[] name; 
    3341    JobInfo[] deps; 
     
    4149    void reset() 
    4250    { 
     51        enableAfterFrame = false; 
     52        disableAfterFrame = false; 
    4353        depsResolved = 0; 
    4454        done = false; 
     
    6070        deps ~= other; 
    6171        other.clientDeps ~= this; 
     72    } 
     73     
     74    void toggleEnabled() 
     75    { 
     76        if(enabled) 
     77            disable(); 
     78        else 
     79            enable(); 
     80    } 
     81     
     82    void enable() 
     83    { 
     84        assert(!enabled); 
     85        enableAfterFrame = true; 
     86    } 
     87     
     88    void disable() 
     89    { 
     90        assert(enabled); 
     91        disableAfterFrame = true; 
     92    } 
     93     
     94    void checkEnable() 
     95    { 
     96        if(enableAfterFrame) 
     97        { 
     98            assert(!enabled); 
     99            enabled = true; 
     100        } 
     101        else if(disableAfterFrame) 
     102        { 
     103            assert(enabled); 
     104            enabled = false; 
     105        } 
    62106    } 
    63107} 
     
    67111private: 
    68112    JobInfo[] frameJobs; 
     113    JobInfo[] preFrameJobs; 
     114    JobInfo[] postFrameJobs; 
     115     
    69116    uint oneShots; // number of one shot jobs this frame 
    70117    uint jobsFinished; 
     118    uint thisFrameToDo; 
     119    bool inFrame; 
     120     
     121    ThreadInstance[] threads; 
     122    Queue!(JobInfo) jobQueue; 
     123     
     124    void checkDeps(JobInfo job) 
     125    { 
     126        foreach(cdep; job.clientDeps) 
     127        { 
     128            if(!cdep.enabled) 
     129                continue; 
     130             
     131            assert(!cdep.done, cdep.name ~ " already done"); 
     132            cdep.depsResolved++; 
     133             
     134            if(cdep.resolved) 
     135                devolve(cdep); 
     136        } 
     137    } 
     138     
     139    void runJob(JobInfo job) 
     140    { 
     141        assert(job !is null); 
     142        assert(job.dg !is null); 
     143 
     144        debug(jobs) synchronized(Stdout) Stdout("+ doing ")(info.name)(" from ")(cast(void*)this).newline; 
     145 
     146        job.dg(); 
     147         
     148        job.done = true; 
     149        jobsFinished++;      
     150    } 
    71151     
    72152    enum ThreadState 
     
    101181                { 
    102182                    state = ThreadState.Wait; 
    103                      
    104                     Thread.yield; 
    105                      
     183 
    106184                    //synchronized(Stdout) Stdout("waiting... and waiting...").newline; 
    107185                    //synchronized(mutex) condition.wait(); 
    108186                    //synchronized(Stdout) Stdout("but not forever! noes!").newline; 
     187                     
     188                    Thread.yield; 
    109189                     
    110                    while(!jobQueue.empty) 
    111                    
    112                         JobInfo info; 
    113                          
    114                         synchronized(jobQueue) 
    115                         { 
    116                             if(!jobQueue.empty
     190                    while(!jobQueue.empty) 
     191                   
     192                        profile!("worker thread") 
     193                        ({ 
     194                            JobInfo job; 
     195                             
     196                            synchronized(jobQueue
    117197                            { 
    118                                 info = jobQueue.pop; 
    119                                 state = ThreadState.Exec; 
     198                                if(!jobQueue.empty) 
     199                                { 
     200                                    job = jobQueue.pop; 
     201                                    state = ThreadState.Exec; 
     202                                } 
     203                                else 
     204                                    return; 
    120205                            } 
    121                             else 
    122                                 continue; 
    123                         } 
    124                          
    125                         assert(info !is null); 
    126                         assert(info.dg !is null); 
    127  
    128                         debug(jobs) synchronized(Stdout) Stdout("+ doing ")(info.name)(" from ")(cast(void*)this).newline; 
    129  
    130                         info.dg(); 
    131                          
    132                         info.done = true; 
    133                         jobsFinished++; 
    134                          
    135                         foreach(cdep; info.clientDeps) 
    136                         { 
    137                             assert(!cdep.done, cdep.name ~ " already done"); 
    138                             cdep.depsResolved++; 
    139206                             
    140                             if(cdep.resolved) 
    141                             { 
    142                                 //debug(jobs) synchronized(Stdout) Stdout("> ")(cdep.name, cdep.depsResolved, cdep.done).newline; 
    143                                  
    144                                 devolve(cdep); 
    145                             } 
    146                         } 
    147                     } 
     207                            runJob(job); 
     208                            checkDeps(job); 
     209                        }); 
     210                    } 
    148211                } 
    149212            } 
     
    155218    } 
    156219     
    157     ThreadInstance[] threads; 
    158     Queue!(JobInfo) jobQueue; 
    159      
    160220    void devolve(JobInfo job) 
    161221    { 
     222        assert(job.enabled); 
     223         
    162224        //debug(jobs) synchronized(Stdout) Stdout("! devolving ")(job.name).newline; 
    163225         
     
    169231        foreach(thread; threads) 
    170232        { 
    171             if(thread.state == ThreadState.Wait || true) 
    172             { 
     233            if(thread.state == ThreadState.Wait /*|| true*/) 
     234            { 
     235                //Thread.sleep(0.05); 
    173236                synchronized(Stdout) Stdout("I'm notifying here, though...").newline; 
    174237                synchronized(thread.mutex) thread.condition.notify(); 
     
    183246        jobQueue = new typeof(jobQueue)(2048); 
    184247     
    185         uint numThreads = 2; 
    186         while(numThreads--) 
    187             threads ~= new ThreadInstance; 
     248        uint numThreads = 1; 
     249         
     250        for(uint i = 0; i < numThreads; i++) 
     251            threads ~= new ThreadInstance; 
    188252    } 
    189253 
     
    196260    synchronized JobInfo addFrameJob(char[] name, JobType dg) 
    197261    { 
    198         auto info = new JobInfo; 
    199         info.name = name; 
    200         info.dg = dg; 
     262        auto job = new JobInfo; 
     263        job.name = name; 
     264        job.dg = dg; 
    201265         
    202         frameJobs ~= info
     266        frameJobs ~= job
    203267         
    204         return info; 
    205     } 
    206      
    207     JobInfo addOneShotJob(JobInfo info) 
    208     { 
    209         info.reset(); 
     268        return job; 
     269    } 
     270     
     271    JobInfo addFrameJob(JobType dg) 
     272    { 
     273        return addFrameJob("", dg); 
     274    } 
     275     
     276    JobInfo addOneShotJob(JobInfo job) 
     277    { 
     278        assert(inFrame); 
     279         
     280        job.reset(); 
    210281        oneShots++; 
    211         devolve(info); 
    212          
    213         return info; 
     282        thisFrameToDo++; 
     283        devolve(job); 
     284         
     285        return job; 
     286    } 
     287     
     288    JobInfo addPostFrameJob(JobType dg) 
     289    { 
     290        auto job = new JobInfo; 
     291        job.dg = dg; 
     292         
     293        postFrameJobs ~= job; 
     294         
     295        return job; 
    214296    } 
    215297     
    216298    void startFrame() 
    217299    { 
    218         oneShots = 0; 
    219         jobsFinished = 0; 
    220         jobQueue.reset; 
    221      
    222         foreach(job; frameJobs) 
    223             job.reset(); 
    224  
    225         debug 
    226         { 
     300        profile!("job.start") 
     301        ({ 
     302            oneShots = 0; 
     303            jobsFinished = 0; 
     304            thisFrameToDo = 0; 
     305            jobQueue.reset; 
     306         
    227307            foreach(job; frameJobs) 
    228308            { 
    229                 assert(!job.done); 
    230                 assert(job.depsResolved == 0); 
    231             } 
    232              
    233             foreach(thread; threads) 
    234             { 
    235                 assert(thread.state == ThreadState.Wait); 
    236             } 
    237         } 
    238  
    239         foreach(job; frameJobs) 
    240         { 
    241             if(job.deps.length == 0) 
    242                 devolve(job); 
    243         } 
     309                job.checkEnable(); 
     310                 
     311                if(job.enabled) 
     312                    thisFrameToDo++; 
     313                 
     314                job.reset(); 
     315            } 
     316             
     317            foreach(job; postFrameJobs) 
     318            { 
     319                job.checkEnable(); 
     320                job.reset(); 
     321            } 
     322 
     323            debug 
     324            { 
     325                foreach(job; frameJobs) 
     326                { 
     327                    assert(!job.done); 
     328                    assert(job.depsResolved == 0); 
     329                } 
     330                 
     331                foreach(thread; threads) 
     332                { 
     333                    assert(thread.state == ThreadState.Wait); 
     334                } 
     335            } 
     336 
     337            inFrame = true; 
     338 
     339            foreach(job; frameJobs) 
     340            { 
     341                if(job.enabled && job.deps.length == 0) 
     342                    devolve(job); 
     343            } 
     344             
     345            if(threads.length == 0) 
     346            { 
     347                while(!jobQueue.empty) 
     348                { 
     349                    auto job = jobQueue.pop(); 
     350                    runJob(job); 
     351                    checkDeps(job); 
     352                } 
     353            } 
     354        }); 
    244355    } 
    245356     
    246357    void endFrame() 
    247358    { 
    248         while(true) 
    249         { 
    250             if(jobsFinished == frameJobs.length + oneShots) 
    251             { 
    252                 assert(jobQueue.count == 0); 
    253                  
    254                 debug 
    255                 { 
    256                     foreach(job; frameJobs) 
    257                     { 
    258                         assert(job.resolved); 
    259                         assert(job.done); 
    260                     } 
    261                 } 
    262                  
    263                 outer: while(true) 
    264                 { 
    265                     foreach(thread; threads) 
     359        profile!("job.end") 
     360        ({ 
     361            while(jobsFinished != thisFrameToDo) 
     362                Thread.yield(); 
     363             
     364            inFrame = false; 
     365            assert(jobsFinished == thisFrameToDo); 
     366            assert(jobQueue.count == 0); 
     367             
     368            debug 
     369            { 
     370                foreach(job; frameJobs) 
     371                { 
     372                    if(!job.enabled) 
     373                        continue; 
     374                     
     375                    assert(job.resolved); 
     376                    assert(job.done); 
     377                } 
     378            } 
     379             
     380            if(threads.length == 0 || threads.length == 1) 
     381            { 
     382                foreach(job; postFrameJobs) 
     383                { 
     384                    if(job.enabled) 
     385                        job.dg(); 
     386                } 
     387            } 
     388            else 
     389            { 
     390                foreach(job; postFrameJobs) 
     391                { 
     392                    if(job.enabled) 
     393                        devolve(job); 
     394                } 
     395            } 
     396             
     397            while(jobQueue.count != 0) 
     398                Thread.yield(); 
     399             
     400            outer: while(true) 
     401            { 
     402                foreach(thread; threads) 
     403                { 
     404                    if(thread.state != ThreadState.Wait) 
    266405                    { 
    267                         if(thread.state != ThreadState.Wait) 
    268                         { 
    269                             Thread.sleep(0); 
    270                             continue outer; 
    271                         } 
     406                        Thread.yield(); 
     407                        continue outer; 
    272408                    } 
    273                      
    274                     break; 
    275                 } 
    276                  
    277                 debug(jobs) synchronized(Stdout) Stdout("- frame done").newline; 
    278                  
    279                 return; 
    280             } 
    281              
    282            Thread.sleep(0)
    283        } 
     409                } 
     410                 
     411                break; 
     412            } 
     413             
     414            assert(jobQueue.count == 0); 
     415             
     416            debug(jobs) synchronized(Stdout) Stdout("- frame done").newline; 
     417             
     418            return
     419        }); 
    284420    } 
    285421} 
  • branches/jobs/gen/math/Misc.d

    r149 r201  
    2121} 
    2222 
     23// From deadlock 
    2324void catmullRomInterp(T)(float t, T a, T b, T c, T d, inout T res) { 
    2425    res = .5f * ((b * 2.f) + 
  • branches/jobs/gen/util/Profiler.d

    r200 r201  
    55import gen.util.ThreadLocal; 
    66import gen.util.HardwareTimer; 
     7 
     8// From deadlock 
    79 
    810struct ProfilingData 
  • branches/jobs/gen/util/ProfilingDisplay.d

    r187 r201  
    2222    ulong time; 
    2323} 
     24 
     25// From deadlock 
    2426 
    2527class ProfilingDisplay 
     
    6466                { 
    6567                    totalTime += data.time; 
    66                    break
     68                    continue
    6769                } 
    6870            } 
    6971         
    70             foreach(index, data; profilingData) 
     72            foreach_reverse(index, data; profilingData) 
    7173            { 
    7274                if(data.calls == 0) 
     
    8082                else 
    8183                    parent = &nodes[data.parent]; 
    82                      
     84                 
    8385                node.sibling = parent.child; 
    8486                parent.child = node; 
     
    104106                return sum; 
    105107            } 
     108 
     109            //subChildTime(&root); 
    106110             
    107111            foreach(index, data; profilingData) 
     
    128132        static Vec3f[] colorRamp = [{x:1, y:1, z:1}, {x:1, y:0.6, z:0.4}, {x:1, y:0.4, z:0.3}, {x:1, y:0, z:0}]; 
    129133         
    130         uint offtop = 30; 
     134        uint offTop = 30; 
    131135         
    132         void recursion(Node* node, int offleft) 
     136        void recursion(Node* node, int offLeft) 
    133137        { 
    134138            for(; node !is null; node = node.sibling) 
     
    137141                { 
    138142                    Vec3f color; 
    139                     catmullRomInterp(node.timeFrac * 3.f - 0.5f, colorRamp[0], colorRamp[1], colorRamp[2], colorRamp[3], color); 
     143                    catmullRomInterp(node.timeFrac * 3.f - .5f, colorRamp[0], colorRamp[1], colorRamp[2], colorRamp[3], color); 
    140144                     
    141                     font.write(offleft, offtop, color, "{}", node.text); 
     145                    font.write(offLeft, offTop, color, "{}", node.text); 
    142146                } 
    143147                 
    144                 offtop += font.maxHeight + 10; 
    145                 recursion(node.child, offleft + indent); 
     148                offTop += font.maxHeight + 10; 
     149                recursion(node.child, offLeft + indent); 
    146150            } 
    147151        } 
  • branches/jobs/windefend.cbp

    r199 r201  
    113113        <Unit filename="defend\game\FakeGateway.d" /> 
    114114        <Unit filename="defend\game\Game.d" /> 
     115        <Unit filename="defend\game\Jobs.d" /> 
    115116        <Unit filename="defend\game\Mouse.d"> 
    116117            <Option weight="1" /> 
  • trunk/defend/Main.d

    r200 r201  
    171171            profile!("sleep") 
    172172            ({ 
    173                 sleep(1); 
     173                //sleep(1); 
    174174 
    175175                // Limit FPS and calculate frame time