RenderThread.cpp 3.4 KB

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