Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Apr 19, 2024 07:54

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 15:39 
Offline
DGL Member
Benutzeravatar

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.

Code:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3.   HW : HWND;
  4.   DC : HDC;
  5.   WI: tagWINDOWINFO;
  6. begin
  7.   HW := FindWindow (nil, 'VU Meter');
  8.  
  9.   if HW <> 0 then
  10.     begin
  11.       GetWindowInfo(HW, WI);
  12.       DC := GetDC(HW);
  13.  
  14.       Image1.Picture.Bitmap.Width := WI.rcClient.Right - WI.rcClient.Left;
  15.       Image1.Picture.Bitmap.Height := WI.rcClient.Bottom - WI.rcClient.Top;
  16.  
  17.       BitBlt(
  18.         Image1.Picture.Bitmap.Canvas.Handle,
  19.         0, 0, WI.rcClient.Right - WI.rcClient.Left, WI.rcClient.Bottom - WI.rcClient.Top,
  20.         DC, 0, 0, SRCCOPY
  21.       );
  22.  
  23.       ReleaseDC(HW, DC);
  24.  
  25.       Image1.Repaint;
  26.     end;
  27. end;


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 15:57 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
müsste. Ist ja eigentlich das selbe, wie wenn man die Drucktaste drückt.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 16:25 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
wurde mein vorschlag einfach überlesen oder sofort als unbrauchbar abgehakt? :cry:

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 18:37 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
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:
  1. function CaptureScreen() : tBitmap;
  2. const
  3.   CAPTUREBLT = $40000000;
  4. var
  5.   hdcScreen: HDC;
  6.   hdcCompatible: HDC;
  7.   bmp: TBitmap;
  8.   hbmScreen: HBITMAP;
  9. begin
  10.   // Create a normal DC and a memory DC for the entire screen. The
  11.   // normal DC provides a \"snapshot\" of the screen contents. The
  12.   // memory DC keeps a copy of this \"snapshot\" in the associated
  13.   // bitmap.
  14.  
  15.   hdcScreen := CreateDC('DISPLAY', nil, nil, nil);
  16.   hdcCompatible := CreateCompatibleDC(hdcScreen);
  17.   // Create a compatible bitmap for hdcScreen.
  18.  
  19.   hbmScreen := CreateCompatibleBitmap(hdcScreen,
  20.     GetDeviceCaps(hdcScreen, HORZRES),
  21.     GetDeviceCaps(hdcScreen, VERTRES));
  22.  
  23.   // Select the bitmaps into the compatible DC.
  24.   SelectObject(hdcCompatible, hbmScreen);
  25.   bmp := TBitmap.Create;
  26.   bmp.Handle := hbmScreen;
  27.   BitBlt(hdcCompatible,
  28.     0, 0,
  29.     bmp.Width, bmp.Height,
  30.     hdcScreen,
  31.     0, 0,
  32.     SRCCOPY or CAPTUREBLT);
  33.   CaptureScreen := bmp;
  34.   //bmp.SaveToFile('mein.bmp');
  35.   //bmp.Free;
  36.   DeleteDC(hdcScreen);
  37.   DeleteDC(hdcCompatible);
  38. end;


ich hab keine delphi tags - also hab ich hald pascal genommen ..... :shock:

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.

Arnulf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 18:49 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 19, 2004 00:27
Beiträge: 454
Wohnort: Nürnberg
RC stehtfür Render Context (glaube ich :D)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 19:13 
Offline
DGL Member
Benutzeravatar

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.

ist das n vorschlag? ;)

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 21:45 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
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 :)

Arnulf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 18, 2005 22:47 
Offline
DGL Member

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.

:roll: 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mär 19, 2005 00:50 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
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).

http://212.112.224.207/content/download/SSMaker.zip

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 :P

Arnulf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 21, 2005 14:53 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
OK :) ich versuch mal mit ogl api was anzufangen.
wenn ich was falsch verstanden hab, dann wäre es net wenn mir das jemand sagt.

erstmal dc, rc holen:

Code:
  1. FoundWindow := FindWindowEx(0 ,0 , 'Medal of Honor Allied Assault(TM) Spearhead', nil);
  2. DC := GetDC(FoundWindow);
  3. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);

damit ist das initalisieren vorbei für mich oder?

jetzt fehlt mir noch with & hight vom window - lines and row in dem fall denk ich
ich weiß aber nicht wie ich die bekomme???

danach mit glread einlesen:

Code:
  1. glReadPixels(0,0,ffWidth, ffHeight, GL_RGB, GL_BITMAP, @Buffer)

buffer ist bei mir dann das bitmap - also lese ich dirrekt vom pointer ein denk ich.

oder hab ich das immer noch nicht verstanden :)
Arnulf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 21, 2005 15:43 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 21, 2005 20:37 
Offline
DGL Member

Registriert: Do Mär 17, 2005 20:43
Beiträge: 26
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....

Code:
  1.  
  2. unit Unit1;
  3.  
  4. interface
  5.  
  6. uses
  7.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  8.   Dialogs, StdCtrls,jpeg,
  9.   dglOpenGL;
  10.  
  11. type
  12.   TForm1 = class(TForm)
  13.     Button1: TButton;
  14.     procedure Button1Click(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. procedure TForm1.Button1Click(Sender: TObject);
  29. var RC        : HGLRC;
  30.     DC        : HDC;
  31.     pic       : tBitmap;
  32.     ffwidth, ffheight : integer;
  33.     viewport : Array[0..3] of integer;
  34. begin
  35.  
  36. InitOpenGL;
  37. DC := GetDC(0);
  38. RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
  39. ActivateRenderingContext(DC, RC);
  40. glGetIntegerv(GL_VIEWPORT, @viewport);
  41. ffwidth := viewport[2];
  42. ffheight:= viewport[3];
  43. pic := tBitmap.Create;
  44. pic.Height := ffheight;
  45. pic.Width := ffwidth;
  46.  
  47. glReadPixels(0,0,ffWidth, ffHeight, GL_RGBA, GL_BITMAP, @pic);
  48. pic.SaveToFile('mein.bmp');
  49. pic.Free;
  50.  
  51. DeactivateRenderingContext;
  52. wglDeleteContext(RC);
  53. ReleaseDC(Handle, DC);
  54.  
  55. end;
  56.  
  57. end.


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 :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 27 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.192s | 18 Queries | GZIP : On ]