Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich habe das gerade mal so ausprobiert und zwar mit einem Timer dessen Interval auf 1 ms stand und einer OpenGL Anwendung von mir.
Die CPU Auslastung lag bei ca 5-10% und so weit sa alles in Ordnung aus. Ich weiß allerdings nicht ob das auch für MoH funktioniert. Aber im Endeffekt ist es ja ziemlich genau das was du auch hattest.
varianten über varianten lol - aber alle bisherigen benutzen hald scrcopy oder bitblt eben.
hier noch eine methode die ganz gut zu funktionieren scheint.
ja lag ist immer noch da - aber das soll das problem mit overlays oder transparenten grafiken lösen - angeblich
Code:
function CaptureScreen(): tBitmap;
const
CAPTUREBLT =$40000000;
var
hdcScreen: HDC;
hdcCompatible: HDC;
bmp: TBitmap;
hbmScreen: HBITMAP;
begin
// Create a normal DC and a memory DC for the entire screen. The
// normal DC provides a \"snapshot\" of the screen contents. The
// memory DC keeps a copy of this \"snapshot\" in the associated
// bitmap.
hdcScreen := CreateDC('DISPLAY',nil,nil,nil);
hdcCompatible := CreateCompatibleDC(hdcScreen);
// Create a compatible bitmap for hdcScreen.
hbmScreen := CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen, HORZRES),
GetDeviceCaps(hdcScreen, VERTRES));
// Select the bitmaps into the compatible DC.
SelectObject(hdcCompatible, hbmScreen);
bmp := TBitmap.Create;
bmp.Handle:= hbmScreen;
BitBlt(hdcCompatible,
0,0,
bmp.Width, bmp.Height,
hdcScreen,
0,0,
SRCCOPY or CAPTUREBLT);
CaptureScreen := bmp;
//bmp.SaveToFile('mein.bmp');
//bmp.Free;
DeleteDC(hdcScreen);
DeleteDC(hdcCompatible);
end;
ich hab keine delphi tags - also hab ich hald pascal genommen .....
Zitat:
Natürlich kommt nichts, weil du kein Zugriff auf RC von MedalOfHonor hast. Sonst, mit einem eigenem RC geht es wunderbar, schließlich ist das so in Quake II gemacht.
RC - hm... was ist das? - ich hab mit grafik bisher noch nie etwas am hut gehabt - ist das erste mal das ich überhaupt etwas davon seh
also verzeiht mir meine unwissenheit.
DC ist mir ja klar - aber RC?
@luketheduke - also es ist ganz einfach - ich kapier deinen vorschlag nicht - wie soll ich mehrere screenshots machen wenn das sowieso lags verursacht? - oder meinst du ich soll zu einem bestimmten zeitpunkt während eines frames einen ss machen? das klappt nie mit dem timing denk ich.
wär natürlich spitze wenn ich 2-3 screenshots in der sekunde machen könnte, weil ich dann einen film machen könnte. - ist aber für den anticheat nicht relevant, weil der upload von dem stream zu viel bandbreite brauchen würde.
Registriert: Fr Mai 14, 2004 18:56 Beiträge: 804 Wohnort: GER/OBB/TÖL-WOR/Greiling
mein vorschlag war ja eher zu testzwecken gedacht. sprich du siehst, wie sich das bild zusammensetzt.
und zu den lags noch was: wo tritt der lag auf? du hast vorhin gesagt beim screenshot holen. heisst das, dein anticheat braucht soviel cpu load, dass das medal of honor auf dem client zu laggen anfängt? wenn ja: mach doch einfach nur alle 3- 5- 10 sekunden dein anticheat bild - mehr brauchst du doch eh nicht - und fahr die priority n bisschen runter -> MoH kriegt seine cpu load, und ein bisschen versatz(ich nehm mal an höchstens eine sekunde??) schadet dem anticheat ja wohl kaum.
also: 3 bilder schießen und in drei arrays packen, priority runter, in jpeg konvertieren, x sekunden warten, priority hoch, drei bilder schießen usw.
Der screenshot wird vom benutzer am server oder über die rcon console über das spiel vom user angefordert.
also mach ich eh kaum einen screenshot.
alle 2 minuten oder weniger kommt drauf an.
ich teste mal ein bisschen herum.
einen kurzen ruck gibt es auch mit der von mir zuletzt geposteten methode - obwohl ich den sinn davon nicht ganz verstehe .
wie man die priorität herunterfährt weiß ich zum beispiel auch nicht.
ich hab zum testen ein eigenes programm geschrieben das nur in bmp screenshots auf die festplatte speichert - alle 3 sekunden und man spürt es im spiel deutlich. - also keine convertierung oder sonstwas nur speichern hald.
aber ich werd noch mehr testen.
vielleicht geht die letzt methode ja wirklich und ich hab immer alles drauf - obwohl ichs nicht versteh wie bereits erwähnt.
aber einen film mit 3-4 bildern pro sekunde kann ich damit auf keinen fall machen
Registriert: Mi Dez 15, 2004 20:36 Beiträge: 454 Wohnort: Wien, Österreich
Zitat:
mein vorschlag war ja eher zu testzwecken gedacht. sprich du siehst, wie sich das bild zusammensetzt.
Wie du darauf gekommen bist , ist mir ein Rätsel. Denn Bild setzt sich sowieso dort wo man es nicht sehen kann, im RAM, und dann mittels SwapBuffers() auf einmal fertig gezeigt.
_________________ "Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump
Egal - die alte methode funktioniert ja halbwegs.
Also denk ich braucht man darüber nicht reden.
Um das zu veranschaulichen hab ich ein kleines programm geschreiben das hald einfach Screenshots macht.
einstellbar ist der timer - nur ein start button - zum stoppen muß man das programms schon beenden.
ist nicht ganz ernst gemeint das programm - aber man kann beinahe einen film drehen damit (100 ms hab ich ausprobiert).
Vielleicht zurück zu anderen methoden.
Render Context - ja ein rätsel für micht - ich kanns mir ungefähr vorstellen hab aber keinen blassen dunst.
Ich würde mir einfach gerne einen screenshot in einen stream oder ein bmp laden.
Die Delphi funktionen verursachen einfach ein ruckeln - oder lags und die cpu last ist bei 10% selbst bei 100 ms screenshots.
Trotzdem ruckelt es sehr.
Die Screenshots werden am laufenden band im jpg format 640x480 gespeichert - egal welche Auflösung man benutzt.
Das umwandeln von bmp auf jpg und das resize vom bild kostet meiner cpu nichtmal einen huster (3 gig pentium) also das ruckelt nicht - hab ich ausprobiert! Ausserdem hab ich probiert nur screenshots zu machen ohne sie zu speichern, umzuwandeln oder sonstwas. und es ruckelt im spiel.
Mit glReadPixels hab ichs nicht geschafft und die ideen sind mir ausgegangen
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Breite und Höhe: Schau mal in mein Beispiel am Anfang der Seite! Dort verwende ich die Methode GetWindowInfo. Das Record besitzt auch Felder für die komplette Größe des Fensters aber normal brauchst du nur den Clientbereich.
OpenGL initlisieren: Eigentlich sollte das ausreichen. Wie ich aber schon mal erwähnt hatte, erstellst du mit CreateRenderContext einen neuen RenderContext. Das dürfte also nicht der sein mit dem das Spiel arbeitet. Die liegen dann nur mehr oder weniger Zufällig auf dem selben Fenster. Ob das so funktioniert wie es soll wage ich mal zu bezweifeln, da du dich ja nicht in die vorhandene Renderschleife gehangen hast.
Ich denke mal du müsstest dich da genau so ins Spiel reinhängen wie dir Programme die du zu verhindern versuchst. Ich hatte auch schon mal geschaut. Bei google ist immer von 'OpenGL Hook' die Rede. Allerdings habe ich keinen Code gefunden. Aber normal scheinen die wohl einen Hook auf API Calls von OpenGL gesetzt zu haben. Aber frag mich nicht wie das geht. :roll
ja habs schon gefunden - danke
naja jedenfalls denk ich, ich kann das nicht.
Da ich nicht viel einblick hab, kann ich mir auch nicht wirklich vorstellen wie das alles funktioniert.
Jedenfalls bekomm ich mit der funktion die ich mir jetzt zusammengebastelt hab nichtmal mehr einen sinnlosen speicherauszug
sonder einfach nur ein 3-5 mb großes weißes bitmap.
Den RenderContext von dem spiel werd ich wohl so nicht bekommen.
Aber ich dachte man kann sich den Speicher auf irgendeine weise kopieren bevor er auf den bildschirm übertragen wird.
also bevor swapbuffer gemacht wird oder ähnliches.
Naja hier mal mein code - keine ahnung ob das jemals zu dem gewünschten führt jedenfalls macht er irgendwas und es gibt auch keine fehler - schön oder lol....
aber trotzdem mal danke an alle die mir versucht haben was beizugringen ich glaub ich versteh das ganze jetzt so halbwegs...
vielleicht fang ich ja doch noch an selbst was zu rendern lol...
sollte jemand noch eine geniale idee haben, dann bitte posten....
Danke
Arnulf
edit:
Jetzt wollte ich statt absenden - str(f9) drücken - das wird schon krankhaft glaub ich - ich brauch urlaub denk ich
Mitglieder in diesem Forum: 0 Mitglieder und 20 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.