Changeset 4628


Ignore:
Timestamp:
Aug 27, 2014 1:08:53 PM (7 years ago)
Author:
ldelgass
Message:

Add some Makefile flags for sleep throttling settings

Location:
geovis/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • geovis/trunk/Makefile.in

    r4376 r4628  
    55USE_THREADS             = yes
    66USE_READ_THREAD         = #yes
     7USE_CACHE               = yes
     8USE_OSGEARTH_TRUNK      = #yes
     9USE_THROTTLING_SLEEP    = #yes
     10SLEEP_AFTER_QUEUE_FRAME = yes
    711
    812bindir          = @bindir@
     
    9599DEFINES         += -DUSE_READ_THREAD
    96100endif
     101ifdef USE_CACHE
     102DEFINES         += -DUSE_CACHE
     103endif
     104ifdef USE_OSGEARTH_TRUNK
     105DEFINES         += -DUSE_OSGEARTH_TRUNK
     106endif
     107ifdef USE_THROTTLING_SLEEP
     108DEFINES         += -DUSE_THROTTLING_SLEEP
     109endif
     110ifdef SLEEP_AFTER_QUEUE_FRAME
     111DEFINES         += -DSLEEP_AFTER_QUEUE_FRAME
     112endif
    97113
    98114CXX_SWITCHES    = $(CXXFLAGS) $(EXTRA_CXXFLAGS) $(DEFINES) $(INCLUDES)
  • geovis/trunk/RenderServer.cpp

    r4424 r4628  
    367367    for (;;) {
    368368        long timeout = g_renderer->getTimeout();
     369#ifdef SLEEP_AFTER_QUEUE_FRAME
     370        g_renderer->markFrameStart();
     371#endif
    369372        int cmdStatus = processCommands(interp, NULL, g_inBufPtr, g_fdOut, timeout);
    370373        if (cmdStatus < 0)
     
    391394                g_stats.nFrameBytes += imgData->s() * imgData->t() * 3;
    392395            }
     396#ifdef SLEEP_AFTER_QUEUE_FRAME
     397            g_renderer->markFrameEnd();
     398#endif
    393399        } else {
    394400            //TRACE("No render required");
  • geovis/trunk/Renderer.cpp

    r4575 r4628  
    2020#include <sys/time.h>
    2121#endif
    22 
    23 //#define USE_OSGEARTH_TRUNK
    24 #define USE_CACHE
    2522
    2623#include <osgDB/FileUtils>
     
    8986    _bgColor[1] = 0;
    9087    _bgColor[2] = 0;
    91     _minFrameTime = 1.0/30.0;
     88    //setMaximumFrameRateInHertz(15.0);
     89    // 100MBit
     90    setMaximumBitrate(1.0e8);
    9291    _lastFrameTime = _minFrameTime;
     92    TRACE("Bandwidth target: %.2f MBit", (float)(getMaximumBitrate()/1.0e6));
     93    TRACE("Frame rate target: %.2f Hz", (float)getMaximumFrameRateInHertz());
    9394
    9495    char *base = getenv("MAP_BASE_URI");
     
    10261027}
    10271028
    1028 void Renderer::addImageLayer(const char *name,
     1029bool Renderer::addImageLayer(const char *name,
    10291030                             osgEarth::TileSourceOptions& opts,
    10301031                             bool makeShared,
     
    10331034    if (!_map.valid()) {
    10341035        ERROR("No map");
    1035         return;
     1036        return false;
    10361037    }
    10371038    TRACE("layer: %s", name);
     
    10461047        layerOpts.visible() = false;
    10471048    }
    1048     _map->addImageLayer(new osgEarth::ImageLayer(layerOpts));
     1049    osg::ref_ptr<osgEarth::ImageLayer> layer = new osgEarth::ImageLayer(layerOpts);
     1050    _map->addImageLayer(layer.get());
     1051    if (layer->getTileSource() == NULL || !layer->getTileSource()->isOK()) {
     1052        ERROR("Failed to add image layer: %s", name);
     1053        _map->removeImageLayer(layer.get());
     1054        return false;
     1055    }
    10491056    _needsRedraw = true;
     1057    return true;
    10501058}
    10511059
     
    13071315    TRACE("Setting window size to %dx%d", width, height);
    13081316
     1317    double origBitrate = getMaximumBitrate();
     1318
    13091319    _windowWidth = width;
    13101320    _windowHeight = height;
     1321
     1322    setMaximumBitrate(origBitrate);
     1323    TRACE("Bandwidth target: %.2f MBit", (float)(getMaximumBitrate()/1.0e6));
     1324    TRACE("Frame rate target: %.2f Hz", (float)getMaximumFrameRateInHertz());
     1325
    13111326    if (_viewer.valid()) {
    13121327#ifdef USE_OFFSCREEN_RENDERING
     
    16471662}
    16481663
     1664void Renderer::markFrameStart()
     1665{
     1666    _startFrameTime = osg::Timer::instance()->tick();
     1667}
     1668
     1669void Renderer::markFrameEnd()
     1670{
     1671    osg::Timer_t endFrameTick = osg::Timer::instance()->tick();
     1672    _lastFrameTime = osg::Timer::instance()->delta_s(_startFrameTime, endFrameTick);
     1673    TRACE("Frame time: %g sec", _lastFrameTime);
     1674#ifdef USE_THROTTLING_SLEEP
     1675    if (_lastFrameTime < _minFrameTime) {
     1676        TRACE("Sleeping for %g secs", _minFrameTime - _lastFrameTime);
     1677        OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(_minFrameTime - _lastFrameTime)));
     1678    }
     1679#endif
     1680}
     1681
    16491682/**
    16501683 * \brief Cause the rendering to render a new image if needed
     
    16571690    if (_viewer.valid() && checkNeedToDoFrame()) {
    16581691        TRACE("Enter needsRedraw=%d",  _needsRedraw ? 1 : 0);
     1692#ifndef SLEEP_AFTER_QUEUE_FRAME
    16591693        osg::Timer_t startFrameTick = osg::Timer::instance()->tick();
     1694#endif
    16601695        TRACE("Before frame()");
    16611696        _viewer->frame();
    16621697        TRACE("After frame()");
     1698#ifndef SLEEP_AFTER_QUEUE_FRAME
    16631699        osg::Timer_t endFrameTick = osg::Timer::instance()->tick();
    16641700        _lastFrameTime = osg::Timer::instance()->delta_s(startFrameTick, endFrameTick);
    16651701        TRACE("Frame time: %g sec", _lastFrameTime);
    1666 #if 0
    1667         if (frameTime < minFrameTime) {
    1668             TRACE("Sleeping for %g secs", minFrameTime-frameTime);
    1669             OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(minFrameTime-frameTime)));
    1670         }
     1702#ifdef USE_THROTTLING_SLEEP
     1703        if (_lastFrameTime < _minFrameTime) {
     1704            TRACE("Sleeping for %g secs", _minFrameTime - _lastFrameTime);
     1705            OpenThreads::Thread::microSleep(static_cast<unsigned int>(1000000.0*(_minFrameTime - _lastFrameTime)));
     1706        }
     1707#endif
    16711708#endif
    16721709#ifdef WANT_TRACE
  • geovis/trunk/Renderer.h

    r4575 r4628  
    191191    }
    192192
    193     void addImageLayer(const char *name, osgEarth::TileSourceOptions& opts,
     193    bool addImageLayer(const char *name, osgEarth::TileSourceOptions& opts,
    194194                       bool makeShared = false, bool visible = true);
    195195
     
    358358                       bool invertY = true);
    359359
     360    void setMaximumFrameRateInHertz(double rate)
     361    {
     362        if (rate > 60.0)
     363            rate = 60.0;
     364        if (rate < 0.25)
     365            rate = 0.25;
     366        _minFrameTime = 1.0/rate;
     367    }
     368
     369    void setMaximumBitrate(double bitsPerSecond)
     370    {
     371        unsigned long bitsPerFrame = (_windowWidth * _windowHeight * 3 + 16) * 8;
     372        double fps = bitsPerSecond / ((double)bitsPerFrame);
     373        setMaximumFrameRateInHertz(fps);
     374    }
     375
     376    double getMaximumFrameRateInHertz()
     377    {
     378        return (1.0/_minFrameTime);
     379    }
     380
     381    double getMaximumBitrate()
     382    {
     383        unsigned long bitsPerFrame = (_windowWidth * _windowHeight * 3 + 16) * 8;
     384        return ((double)bitsPerFrame * getMaximumFrameRateInHertz());
     385    }
     386
     387    void markFrameStart();
     388
     389    void markFrameEnd();
     390
    360391    long getTimeout();
    361392
     
    399430    double _minFrameTime;
    400431    double _lastFrameTime;
     432    osg::Timer_t _startFrameTime;
    401433
    402434    ColorMapHashmap _colorMaps;
  • geovis/trunk/RendererCmd.cpp

    r4575 r4628  
    666666
    667667static int
     668FilePutOp(ClientData clientData, Tcl_Interp *interp, int objc,
     669          Tcl_Obj *const *objv)
     670{
     671    long size;
     672    const char *path = Tcl_GetString(objv[2]);
     673    if (Tcl_GetLongFromObj(interp, objv[4], &size) != TCL_OK ||
     674        size < 1) {
     675        return TCL_ERROR;
     676    }
     677    char *data = (char *)malloc((size_t)size);
     678    if (!SocketRead(data, size)) {
     679        free(data);
     680        return TCL_ERROR;
     681    }
     682    std::ostringstream fullPath;
     683    //fullPath << "/tmp/" << path;
     684    fullPath << path;
     685    FILE *fp = fopen(fullPath.str().c_str(), "wb");
     686    if (fp == NULL) {
     687        free(data);
     688        return TCL_ERROR;
     689    }
     690    int bytesWritten = fwrite(data, 1, (size_t)size, fp);
     691    fclose(fp);
     692    free(data);
     693    return (bytesWritten == size) ? TCL_OK : TCL_ERROR;
     694}
     695
     696static CmdSpec fileOps[] = {
     697    {"put",    1, FilePutOp, 5, 5, "name type size"}
     698};
     699static int nFileOps = NumCmdSpecs(fileOps);
     700
     701static int
     702FileCmd(ClientData clientData, Tcl_Interp *interp, int objc,
     703          Tcl_Obj *const *objv)
     704{
     705    Tcl_ObjCmdProc *proc;
     706
     707    proc = GetOpFromObj(interp, nFileOps, fileOps,
     708                        CMDSPEC_ARG1, objc, objv, 0);
     709    if (proc == NULL) {
     710        return TCL_ERROR;
     711    }
     712    return (*proc) (clientData, interp, objc, objv);
     713}
     714
     715static int
    668716ImageFlushCmd(ClientData clientData, Tcl_Interp *interp, int objc,
    669717              Tcl_Obj *const *objv)
     
    804852    char *type = Tcl_GetString(objv[3]);
    805853    if (type[0] == 'i' && strcmp(type, "image") == 0) {
     854        bool ret;
     855        char *name;
    806856        char *driver = Tcl_GetString(objv[4]);
    807857        std::string url;
     
    817867        if (driver[0] == 'd' && strcmp(driver, "debug") == 0) {
    818868            osgEarth::Drivers::DebugOptions opts;
    819             char *name = Tcl_GetString(objv[5]);
    820             g_renderer->addImageLayer(name, opts);
     869            name = Tcl_GetString(objv[5]);
     870            ret = g_renderer->addImageLayer(name, opts);
    821871        } else if (driver[0] == 'g' && strcmp(driver, "gdal") == 0) {
    822872            osgEarth::Drivers::GDALOptions opts;
    823873            opts.url() = url;
    824             char *name = Tcl_GetString(objv[6]);
    825             g_renderer->addImageLayer(name, opts);
     874            name = Tcl_GetString(objv[6]);
     875            ret = g_renderer->addImageLayer(name, opts);
    826876        } else if (driver[0] == 't' && strcmp(driver, "tms") == 0) {
    827877            osgEarth::Drivers::TMSOptions opts;
     
    831881            //opts.tmsType() = tmsType;
    832882            //opts.format() = format;
    833             char *name = Tcl_GetString(objv[6]);
    834             g_renderer->addImageLayer(name, opts);
     883            name = Tcl_GetString(objv[6]);
     884            ret = g_renderer->addImageLayer(name, opts);
    835885        } else if (driver[0] == 'w' && strcmp(driver, "wms") == 0) {
    836886            osgEarth::Drivers::WMSOptions opts;
     
    846896            opts.transparent() = transparent;
    847897
    848             char *name = Tcl_GetString(objv[9]);
    849             g_renderer->addImageLayer(name, opts);
     898            name = Tcl_GetString(objv[9]);
     899            ret = g_renderer->addImageLayer(name, opts);
    850900        } else if (driver[0] == 'x' && strcmp(driver, "xyz") == 0) {
    851901            osgEarth::Drivers::XYZOptions opts;
     
    855905            //opts.invertY() = invertY;
    856906            //opts.format() = Tcl_GetString(objv[6]);
    857             char *name = Tcl_GetString(objv[6]);
    858             g_renderer->addImageLayer(name, opts);
     907            name = Tcl_GetString(objv[6]);
     908            ret = g_renderer->addImageLayer(name, opts);
    859909        } else {
    860910            Tcl_AppendResult(interp, "unknown image driver \"", driver,
    861911                             "\": should be 'debug', 'gdal', 'tms', 'wms' or 'xyz'", (char*)NULL);
     912            return TCL_ERROR;
     913        }
     914        if (!ret) {
     915            Tcl_AppendResult(interp, "Failed to add image layer \"", name, "\"", (char*)NULL);
    862916            return TCL_ERROR;
    863917        }
     
    19812035    Tcl_CreateObjCommand(interp, "clientinfo",     ClientInfoCmd,     clientData, NULL);
    19822036    Tcl_CreateObjCommand(interp, "colormap",       ColorMapCmd,       clientData, NULL);
     2037    Tcl_CreateObjCommand(interp, "file",           FileCmd,           clientData, NULL);
    19832038    Tcl_CreateObjCommand(interp, "imgflush",       ImageFlushCmd,     clientData, NULL);
    19842039    Tcl_CreateObjCommand(interp, "key",            KeyCmd,            clientData, NULL);
     
    19972052    Tcl_DeleteCommand(interp, "clientinfo");
    19982053    Tcl_DeleteCommand(interp, "colormap");
     2054    Tcl_DeleteCommand(interp, "file");
    19992055    Tcl_DeleteCommand(interp, "imgflush");
    20002056    Tcl_DeleteCommand(interp, "key");
Note: See TracChangeset for help on using the changeset viewer.