so.
ich habe ein paar Dreiecke (10 an der Zahl) die mir über den Bildschirm befördert werden.
Da hab ich jetzt die verschiedensten Methoden ausprobiert:
alle nebeninanderzeichnen und davor immer n stückerl weiter mit translate verschieben, oder mit push und popp
es funktioniert zwar alles aber es "hakt" ode zuckt oder weiss ich was
es läuft nicht flüssig.
hier mal die render methode:
Code:
procedure TForm1.Render;
var
i:integer;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
Ich mache nichts an den Mouseevents, bei mir laggt es aber auch so, also unabhöngig von Maus.. bin ich da der einzige??? ich mein 2.8 Ghz sind wohl hoffetnlich genug....
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Ne Ne du. Meine Frage mag vielleicht OT erscheinen hat aber durchaus seine Berechtigung. Ich weiß nicht wie das bei Hyperthreading ist aber bei Dual Cores hast du 2 CPUs. Windows verteilt den Prozess aber abwechselt auf die CPUs und da jeder Kern einen eigenen Performance Counter hat, kann es passieren, dass du beim Messen blödsinnige Werte bekommst. Weil die Counter nicht unbedingt wirklich gleich sein müssen. Dann kann es sein, dass die Werte mal kurzzeitig negativ sind und dann wieder überdimensional groß. Ich habe bei mir den AMD Dual Core Optimizer installiert der dafür sorgt, dass die Counter gleich sind und bei mir gehts.
PS: Wenn du den ProcessExplorer von SystemInternals hast, dann kann man damit auch eben die AffinityMask eines Prozesses einstellen. Dann sollte es auch gehen.
PPS: Falls das nicht hinhaut solltest du uns mal ein bisschen Codes deines Timebased Movements zeigen.
Die threadaffinität kann man auch mit dem normalen taskman einstellen (allerdings nur auf Prozessebene)
Außerdem deaktiviert der kompatibilitätsmodus für Win9x mehrere kerne. Mehrkerner sind ein problem bei Timebasedmovement da die uhr die queryperformancecounter abfragt auf verschiedenen kernen verschieden gehen kann.
ok, das könnte schon sein das es an mehreren Kernen liegt,
aber 1. ich habe 2 virteuelle Kerne und hyperthreading.
Ein freund von mir hat 4 physikalische Kerne und auch Hyperthreading.
Bei mir laggt es praktisch gar nicht, ob mit oder ohne Maus auf dem Bild
Bei ihm läuft das Spiel bei Mouseover praktisch in Zeitlupe. Es geht irsinnig langsam.
Sobald die Maus nicht mehr auf dem Formular ist funktionierts top, ohne laggs.
Also wenn das mit den Kernen das problem wäre, wieso dann nur bei Mouseover?? oO
Und wie machen das andere Programme/Spiele? Wie berechnen die ihre FPS wohl auch so oder?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wie das in aktuellen Spielen gelöst ist habe ich keine Ahnung. "Alternativ" dazu kann man auch GetTickCount benutzen. Denn das ist kein Bestandteil der CPU. Allerdings ist GetTickCount teilweise viel zu ungenau.
Was mich allerdings jetzt etwas stutzig macht ist die Zeitlupe mit der Maus. Sah in deinem ersten Post etwas anders aus. Evtl sollte dein Kumpel mal testweise auf seinem System die Mausschatten deaktivieren. Unter Systemsteuerung -> Maus -> Zeiger -> Zeigerschatten Aktivieren. Denn der muss nachträglich von Windows auf dein Fenster geblendet werden und wenn zu viele Frames Pro Sekunde entstehen und die Hardware das nicht sonderlich gut beschleunigt kann es sein, dass der Schatten einen merklichen Teil der CPU benötigt.
Und ich glaube deine Messmethode begünstigt das ausbremsen noch etwas. Denn der Mausschatten wird außerhalb der OnIdle Methode gerendert. Benötigt aber trotzdem Zeit und Windows "blockiert" in der Zwischenzeit deine Anwendung. Du misst aber nur innerhalb von OnIdle. Somit bekommst du das was außerhalb passiert aber nicht mit in deine Rechnung. Was dann dazu führen kann, dass du laut deiner Rechnung 100 FPS pro Sekunde hast aber in Wirklichkeit nur 30 Bilder gezeichnet wurden. Um so schneller der Rechner deines Kumpels um so krasser müsste das Problem auftreten.
Du musst jetzt zum Berechnen deines Frames die Zeit von einem OnIdle bis zum Nächsten messen. Also zu Begin des OnIdle weißt du EndCount den Wert von StartCount zu und misst StartCount danach neu. Schon solltest du arbeiten außerhalb auch berücksichtigen. Beachte aber, dass StartCount zu Begin nicht sinnvoll initialisiert ist und so dein erstes Frame rechnerisch mehrere Stunden gebraucht hat. Also StartCount ein mal auslesen. Also direkt bevor du mit Initialisieren fertig bist. OnShow oder OnCreate als letztes.
Wenn du nur 1x pro frame die Zeit misst (was ich auch empfehle) musst du auf jeden fall eine Zeitbegrenzung einbauen. Da manche ereignisse OnIdle verhindern, kommt es sonst zu extremen Zeitsprüngen. Ich verwende üblicherweise 100ms=10fps als maximale zeitdifferenz.
Außerdem solltest du unbedingt probieren deinen Prozess an einen Kern zu binden geht testweise im Taskman und ansonsten mit SetThreadAffinityMask.
Wenn du nur 1x pro frame die Zeit misst (was ich auch empfehle) musst du auf jeden fall eine Zeitbegrenzung einbauen. Da manche ereignisse OnIdle verhindern, kommt es sonst zu extremen Zeitsprüngen. Ich verwende üblicherweise 100ms=10fps als maximale zeitdifferenz.
Außerdem solltest du unbedingt probieren deinen Prozess an einen Kern zu binden geht testweise im Taskman und ansonsten mit SetThreadAffinityMask.
"Was meinst du mit maximaler Zeitdifferenz? das kapier ich nicht ganz...
aber der Rest ist einleuchtend.
Werde das gleich mal versuchen.
Doch dazu wieder die gleiche Frage:
wie machen andere das? den mauszeigerschatten haben ja viele an, und trotzdem laggt es nicht wie mit nem Holzmodem. Also ich mein das is zwar irgendwo ne möglichkeit das Sinnvoll zu messen, ist aber trotzdem noch keine Lösung des Problems.
Und ausserdem: wie konkret binde ich meine Anwendung an einen Kern? Und wie ist das mit Virtuellen Kernen? Funktioniert das da genauso?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das selbe Problem hatte ich auch als ich auf einen Doppelkern umgestiegen bin. Hier liegt der Ursprung im Idle-Event. Um das Problem zu umgehen reicht es also i.d.R. einen eigenen Renderloop zu straten und auf den Idlehandler zu verzichten. Also ganz einfach nach Anwendungsstart nen Timer anstossen, der dann beim ersten Aufruf den Renderloop startet (z.b. eine simple repeat...until Quit; - Schleife).
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
und wenn man solche Probleme bei anderen Anwendungen gibt es für AMD-Prozessoren auch noch dieses Tool (erster Eintrag).
Das merzt das aus, aber fragt mich nicht nach technischen Details
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Es gibt eine funktion die wenn ich mich richig erinnere SetThreadAffinityMask hieß die einen thread an einen kern bindet. Näheres findest du sicher in der MSDN. Testweise kannst du das auch im Taskman erledigen. (Im kontextmenü eines Prozessen kannst du die erlaubten CPUs einstellen).
Mit maximalerer zeitdifferenz meine ich, dass wenn deine berechnete Zeitdifferenz größer ist als ein bestimmter Schwellenwert, z.B. 0.1s du ihn auf den Schwellenwert herabsetzt. Das ist natürlich nur in singleplayerspieler empfehlenswert.
Hmm, das is jetzt viel Information auf einmal.
Also ich will natürlich höchste Genauigkeit und Maximalen Usercomfort.
Also fällt die Methode "TaskMan" wohl eindeutig aus...
Das mit der AffinityMask sieht schon eher danach aus...
Allerdings hab ich bei dem Timer meine Bedenken:
Das soll wohl Performancemässig nicht so der hit sein. Ich mein Prinzipiell ist ja die "Idle Methode" schon sinnvoll und praktisch.
Könnte das Problem sich durch die Bindung an einen Kern lösen?
Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.