Exceso de consumo de CPU

Started by CorEduard, September 02, 2015, 01:29:49 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

CorEduard

Cree una simple ventana que no hace nada y acabo de descubrir que la aplicación de Bennu se mantiene constantemente consumiendo un 90% aproximadamente del CPU.

El bucle principal que utilizo para mantener la ventana abierta es este :

  Repeat
    frame;
  Until( key(_ESC) || exit_status )


Al pasarle cualquier numero al operador frame no pasa nada, sigue consumiendo 90% del CPU, tampoco no eh podido encontrar una función tipo Sleep() para poder darle un descanso al CPU.

Por otro lado yo no se si esto pasa también con la versión para Android, pero me preocupa mucho si esto también pasa en Android.

No es bueno que una aplicación se mantenga constantemente consumiendo el 90% o 100% del CPU innecesariamente y esto seria mucho peor si esto también pasa con dispositivos móviles.

Por favor ¿alguien sabe como puedo solucionar esto?.

FreeYourMind

entonces segun tu logica, si tienes varios procesos ya necesitas conectarse a la nasa para correr tu juego  ;D


Deberias meter la app completa aqui de ejemplo y lo porbamos en nuestras maquinas

warrior_rockk

No es normal. ¿Que versión de Bennu estás utilizando? Por otro lado, postea el código completo para ver si hay algo raro...

CorEduard

#3
Quote from: FreeYourMind on September 02, 2015, 05:28:59 AM
entonces segun tu logica, si tienes varios procesos ya necesitas conectarse a la nasa para correr tu juego  ;D


Deberias meter la app completa aqui de ejemplo y lo porbamos en nuestras maquinas

Yo no dije eso que estas tratando de decir, en el caso de Windows, si un proceso esta consumiendo el 90% del CPU sin hacer nada, igual el SO sigue procesando los demás procesos con normalidad y sin problemas, aun si hay otros procesos que también consumen el 90% del CPU sin hacer nada.

Se sabe que cuando programas con SDL 1.2 hay que agregar un SDL_delay( 1 ); al final del bucle principal para evitar este problema. Yo no se si Bennu hace esto porque aun no me eh fijado en el código de Bennu.

Quote from: warrior_rockk on September 02, 2015, 07:33:57 AM
No es normal. ¿Que versión de Bennu estás utilizando? Por otro lado, postea el código completo para ver si hay algo raro...

La versión de Bennu que estoy utilizando es la ultima versión oficial publicada en la pagina oficial (bgd-1.0.0-r307-win32.rar)

Este es el script completo que estoy desarrollando como base para mis proyectos :


Program app_base;


import "mod_proc";  // let_me_alone, ...
import "mod_wm";    // set_title, ...
import "mod_video"; // mode_is_ok, set_mode, set_fps, ...
import "mod_key";   // key

import "mod_text";
import "mod_say";


//  App Config
// =============================================================================
global

  string _win_title = "app_base";

  int _flags = MODE_WINDOW;

  short _win_width   = 512;
  short _win_height  = 384;
  short _full_width  = 1680;
  short _full_height = 1050;
  short _desk_width  = 1024; // _full_width;
  short _desk_height = 768;  // _full_height;

  short _width  = 512; // _win_width;
  short _height = 384; // _win_height;

  byte _bpp = MODE_32BITS; // MODE_8BITS, MODE_16BITS, MODE_32BITS

  byte _fps      = 60;
  byte _fps_skip = 0;

  bool _fullscreen = false; // false, true

  bool _hardware      = true;
  bool _double_buffer = true;
  bool _vsync         = true;
  bool _border        = true;
  bool _2xscale       = false;

  // --- Android Config ---
  bool _android_release = false; // false, true
  bool _landscape       = true; // false, true

  // --- PSP Config ---
  bool _psp_release = false; // false, true

end


//  Functions Declaration
// =============================================================================
declare function app_setup(); end
declare process main( void ); end


// =============================================================================
function app_setup()
// =============================================================================
private

  short _temp_width;
  short _temp_height;

end
begin

  if ( (OS_ID == OS_ANDROID) || (OS_ID == OS_IOS) )
    _android_release = true;
  end

  if ( _android_release )

    if ( _landscape )
      _desk_width  = 800;
      _desk_height = 480;
    else
      _desk_width  = 480;
      _desk_height = 800;
    end

    _fullscreen = true;

    if ( (OS_ID != OS_ANDROID) && (OS_ID != OS_IOS) )
      _fullscreen = false;
      get_desktop_size( &_temp_width, &_temp_height );
      move_window( ((_temp_width / 2) - (_desk_width / 2)), ((_temp_height / 2) - (_desk_height / 2)) );
    else
      get_desktop_size( &_desk_width, &_desk_height );
    end

    _win_width   = _desk_width;
    _win_height  = _desk_height;
    _full_width  = _desk_width;
    _full_height = _desk_height;

    if ( _fps > 30 ) _fps_skip = 30; end

  else

    get_desktop_size( &_desk_width, &_desk_height );
    if ( _full_width  > _desk_width  ) _full_width  = _desk_width;  end
    if ( _full_height > _desk_height ) _full_height = _desk_height; end

    if ( OS_ID == 1001 ) // OS_PSP )
      _psp_release = true;
    end

    if ( _psp_release )

      _desk_width  = 480;
      _desk_height = 272;

      _win_width   = _desk_width;
      _win_height  = _desk_height;
      _full_width  = _desk_width;
      _full_height = _desk_height;

      _fullscreen = true;

      if ( OS_ID != 1001 ) // OS_PSP )
        _fullscreen = false;
        get_desktop_size( &_temp_width, &_temp_height );
        move_window( ((_temp_width / 2) - (_desk_width / 2)), ((_temp_height / 2) - (_desk_height / 2)) );
      end

      if ( _fps > 30 ) _fps_skip = 30; end

    else

      if ( !_fullscreen )
        move_window( (_desk_width / 2) - (_win_width / 2), (_desk_height / 2) - (_win_height / 2) );
      end

    end

  end

  _width  = _win_width;
  _height = _win_height;

  if ( !_border ) _flags += MODE_FRAMELESS; end

  if ( _fullscreen )
    _width  = _full_width;
    _height = _full_height;
    _flags  = MODE_FULLSCREEN + MODE_FRAMELESS;
  end

  if ( _hardware      ) _flags += MODE_HARDWARE;     end
  if ( _double_buffer ) _flags += MODE_DOUBLEBUFFER; end
  if ( _vsync         ) _flags += MODE_WAITVSYNC;    end
  if ( _2xscale       ) _flags += MODE_2XSCALE;      end

  set_title( _win_title );
  set_fps  ( _fps, _fps_skip );
  set_mode ( _width, _height, _bpp, _flags );

end


// =============================================================================
process main( void )
// =============================================================================
begin

  let_me_alone();
  app_setup();
  let_me_alone();

  Repeat
    frame;
  Until( key(_ESC) || exit_status )

  let_me_alone();

end



Aclaro que esto en la plataforma PC no es una problema grave, pero tampoco no es algo que debería pasar.

CorEduard

Perdón, ya descubrí cual es el problema.

El problema esta en el sincronizado vertical, si a la variable "bool _vsync = true;" la inicializo en "false", mi CPU se mantiene en un 10% de consumo.

Por ahora no usaré el sincronizado vertical, para evitar ese exceso de consumo de CPU.