RenderThread.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include "RenderThread.h"
  2. #include "Bildschirm.h"
  3. #include "Zeit.h"
  4. using namespace Framework;
  5. // Inhalt der RenderTh Klasse aus RenderThread.h
  6. // Konstruktor
  7. RenderTh::RenderTh()
  8. : stoppen( 0 ),
  9. bildschirm( 0 ),
  10. zeit( new ZeitMesser() ),
  11. renderTickZeit( 1 / 60 ),
  12. renderParameter( 0 ),
  13. tickParameter( 0 ),
  14. renderFunktion( 0 ),
  15. tickFunktion( 0 ),
  16. pause( 0 ),
  17. maxFps( 30 ),
  18. ref( 1 )
  19. {
  20. }
  21. // Destruktor
  22. RenderTh::~RenderTh()
  23. {
  24. if( run )
  25. beenden();
  26. if( bildschirm )
  27. bildschirm->release();
  28. zeit->release();
  29. }
  30. // nicht constant
  31. void RenderTh::lock()
  32. {
  33. cs.lock();
  34. }
  35. void RenderTh::unlock()
  36. {
  37. cs.unlock();
  38. }
  39. void RenderTh::setBildschirm( Bildschirm *bildschirm ) // setzt den Bildschirm
  40. {
  41. lock();
  42. if( this->bildschirm )
  43. this->bildschirm->release();
  44. this->bildschirm = bildschirm;
  45. unlock();
  46. }
  47. void RenderTh::thread() // Render Schleife
  48. {
  49. zeit->messungStart();
  50. double ausgleich = 0;
  51. while( !stoppen )
  52. {
  53. lock();
  54. if( bildschirm && !pause )
  55. {
  56. if( renderFunktion )
  57. renderFunktion( renderParameter, this, bildschirm->zRenderBild() );
  58. bildschirm->render();
  59. if( tickFunktion )
  60. tickFunktion( tickParameter, this, renderTickZeit );
  61. bildschirm->tick( renderTickZeit );
  62. unlock();
  63. }
  64. else
  65. {
  66. unlock();
  67. Sleep( 100 );
  68. }
  69. ausgleich += 1.0 / maxFps - renderTickZeit;
  70. if( ausgleich > 0 )
  71. Sleep( (int)( ausgleich * 1000 ) );
  72. zeit->messungEnde();
  73. zeit->messungStart();
  74. renderTickZeit = zeit->getSekunden();
  75. }
  76. zeit->messungEnde();
  77. }
  78. void RenderTh::beginn() // beginnt rendering
  79. {
  80. stoppen = 0;
  81. start();
  82. }
  83. void RenderTh::beenden() // beendet den Thread
  84. {
  85. stoppen = 1;
  86. warteAufThread( 2000 );
  87. if( run )
  88. ende();
  89. }
  90. void RenderTh::setMaxFps( int fps ) // setzt die Anzahl der Bilder pro Sekunde
  91. {
  92. maxFps = fps;
  93. }
  94. void RenderTh::setPause( bool p ) // Renderpause
  95. {
  96. pause = p;
  97. }
  98. void RenderTh::setRenderFunktion( void( *rF )( void *, void *, Bild * ) ) // setzt die Rückruf Funktion beim Rendern
  99. {
  100. renderFunktion = rF;
  101. }
  102. void RenderTh::setTickFunktion( void( *tF )( void *, void *, double ) ) // setzt die Rückruf Funktion beim Tick
  103. {
  104. tickFunktion = tF;
  105. }
  106. void RenderTh::setRenderFunktionParameter( void *p ) // setzt den Parameter der Rückruf Funktion beim Rendern
  107. {
  108. renderParameter = p;
  109. }
  110. void RenderTh::setTickFunktionParameter( void *p ) // setzt den Parameter der Rückruf Funktion beim Tick
  111. {
  112. tickParameter = p;
  113. }
  114. // constant
  115. Bildschirm *RenderTh::getBildschirm() const // gibt den Bildschirm zurück
  116. {
  117. return bildschirm ? bildschirm->getThis() : 0;
  118. }
  119. Bildschirm *RenderTh::zBildschirm() const
  120. {
  121. return bildschirm;
  122. }
  123. double RenderTh::getRenderTickZeit() const // gibt die Zeit zurück, die zum Rendern und zum Tick benötigt wird
  124. {
  125. return renderTickZeit;
  126. }
  127. // Reference Counting
  128. RenderTh *RenderTh::getThis()
  129. {
  130. ++ref;
  131. return this;
  132. }
  133. RenderTh *RenderTh::release()
  134. {
  135. --ref;
  136. if( !ref )
  137. delete this;
  138. return 0;
  139. }