![]() |
Re: ScriptEngine II (v. 0.5.0.0)
Mir fällt auf, dass im gesamten Projekt keine Interfaces verwendet werden.
Ich habe allerdings nur stichprobenartig in den Code geschaut. Gerade bei so einem komplexen Projekt könnten aber Interfaces und die autom. Referenzzählung bei Interfacepointern eine weitere Verbesserung bringen. |
Re: ScriptEngine II (v. 0.5.0.0)
Zitat:
Jetzt kann ich es sogar kompilieren, danke! Ich konnte auch noch die console.pas/consoleform.pas unter FPC kompilieren (dachte erst es würde nicht funktionieren :P) Hab ich mich damals verlesen oder sollten Arrays nicht in Version 0.5.0.0 erscheinen :P Zitat:
Dann bräuchte man "nur" noch Arrays und Interfaces richtig? :) |
Re: ScriptEngine II (v. 0.5.0.0)
Zitat:
Zitat:
Zitat:
|
Re: ScriptEngine II (v. 0.5.0.0)
Zitat:
Delphi-Quellcode:
Da findestes du schonmal alle Interfaces eines Objektes.
PInterfaceEntry = ^TInterfaceEntry;
TInterfaceEntry = packed record IID: TGUID; VTable: Pointer; IOffset: Integer; ImplGetter: Integer; end; PInterfaceTable = ^TInterfaceTable; TInterfaceTable = packed record EntryCount: Integer; Entries: array[0..9999] of TInterfaceEntry; end; TObject: function GetInterface(const IID: TGUID; out Obj): Boolean; class function GetInterfaceEntry(const IID: TGUID): PInterfaceEntry; class function GetInterfaceTable: PInterfaceTable; ![]() Direkt an der Adresse, wohin der Interfacezeiger zeigt, liegt eine MethodAdressTabelle. Und die InterfaceMethoden werden einfach über ihren Index aufgerufen.
Delphi-Quellcode:
Kannst dir ja mal hiervon den ASM-Code anzeigen lassen:
IInterface = interface
function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall; function _AddRef: Integer; stdcall; function _Release: Integer; stdcall; end;
Delphi-Quellcode:
_AddRef ist die 2. Methode des Interfaces.
var Intf: IInterface;
begin Integer(Intf) := $123; Intf._AddRef; Es gibt auch keine Vorfahren dieses Interfaces ... deren Methoden würden sonst vorher aufgezählt. Somit hat die Methode die Adresse, welche bei +4 Byte (Index = 1, da 0-basierendes Array) in dieser Tabelle liegt.
Code:
mov eax, Intf
call TMethod(PPointer(Intf)^ + Index)
Delphi-Quellcode:
PS: Wenn nix angegeben ist, dann ist der Standardvorfahr automatisch IInterface.
ITest = Interface(IInterface)
Procedure Test; end; .Test läge also bei Index 4 aka +12 Byte (0 bis 3 in IInterface und die 4 in ITest) |
Re: ScriptEngine II (v. 0.5.1.0)
@himi: ich habe mir deine Sachen zu den Interfaces noch nicht angeschaut, aber trotzdem sage ich schonmal danke: PInterfaceTable könnte helfen
Zur später Stunde noch ein Update :arrow: Version 0.5.1.0
Der Download befindet sich wie immer im ![]() Grüße |
Re: ScriptEngine II (v. 0.5.1.0)
Hallo littleDave!
Mal ne Frage. Bei welcher Version glaubst du, dass du Arrays implementiert haben wirst und wie lange schätzt du, bis diese Version veröffentlicht werden kann? Dolvik |
Re: ScriptEngine II (v. 0.5.1.0)
Das Problem mit arrays ist halt: ich brauche sie im Moment nicht. Daher ist es für mich schwer mich dazu zu überwinden, arrays einzubauen. Zumal man mit TList etwas Ähnliches bekommen kann. Ich kann leider nicht sagen, wann ich arrays einbauen werde. Ich baue lieber Sachen ein, die ich gerade brauche. Natürlich will ich auch irgendwann arrays unterstützen, (da ich jedoch kein großer Fan von arrays bin), dauert das leider noch etwas. Ich welchem Zeitraum kann ich leider auch nicht sagen. Ich habs ja schon mal Versucht indem ich Version 0.5 gesagt habe *hust*. Daher will ich jetzt nicht v0.6, v0.7, v4.0, etc sagen und den gleichen Fehler nochmal machen. Hoffe, dass das etwas nachvollziehbar ist.
Weil ich gerade dabei bin, mach ich mal etwas Werbung für die nächste Version ;-) In der nächsten Version, die bald kommen wird, kann man Multi-Threaded-Scripts erstellen - also eigene Threads im Script erstellen und ausführen. Dafür muss man den Delphi-Quelltext nicht anrühren. Es wird dabei Ähnlich wie in Delphi sein: man muss eine Klasse erstellen, die von einer bestimmten Klasse abgeleitet werden muss. Dort muss dann nur die Execute() - Methode überschrieben werden und fertig. Das ganze schaut dann so aus:
Delphi-Quellcode:
Ist zwar noch nicht final, aber funktioniert schon super. Habe zum Test mal eine Primzahl-Berechnung auf 15 Threads aufgesplittet und hab die Ausführungszeit halbieren können (Dual-Core halt ;-)). Wie gesagt, ist noch nicht fertig, daher dauert das noch ein wenig - jedoch nicht mehr lange ;-)
program Test;
uses System.Threading; type TMyTest = class(TExecutionContext) protected procedure Execute; override; end; procedure TMyTest.Execute; begin TThread.Sleep(1000); end; var Context : TMyTest; Thread : TThread; begin Context := TMyTest.Create; try Thread := TThread.NewThread(Context); try Thread.Start; while not (Thread.State = ThreadState.Finished) do { irgendwas } ; finally Thread.Free; end; finally Context.Free; end; end. Gruß |
Re: ScriptEngine II (v. 0.5.1.0)
Hallo littleDave!
Nein ist überhaupt kein Problem, wenn man keine arrays hat. Hab nur das mit v0.5 mitbekommen und wollte wissen ob das noch in der beta-Phase ist oder ob es hinausgeschoben wurde. Multithreading klingt interessant :) Freu mich schon aufs Testen. An was arbeitest du denn gerade für einem Projekt, das die SE2 miteinbezieht? Dolvik |
Re: ScriptEngine II (v. 0.5.1.0)
Ich arbeite seit längerem an einer 3D-Engine auf OpenGL-Basis. Die Engine an sich ist in Delphi geschrieben, die komplette "Spiellogik" wird dabei von der Script-Engine übernommen. Also vom einfachen Einschalten einer Lampe bis hin zur (späteren) KI- und Spielersteuerung. Die Engine benutzt fast ausschließlich Shader - komplett dynamisches Per-Pixel-Lighting, Realtime-Shadows, Bump/Parallax-Mapping, Depth-of-Field, Deferred Shading, usw. Das ganze ist für relativ starke PCs ausgelegt, daher leiste ich mir auch den "Luxus", die Spiellogik nicht nativ sondern mit der Script-Engine zu realisiern. Da ich SE2 schon ziemlich stark optimiert habe, ist der Performance-Verlust nicht so tragisch.
Hier mal zwei YouTube-Videos: ![]() ![]() Gruß |
Re: ScriptEngine II (v. 0.5.1.0)
Hallo littleDave,
Ist echt gut gemacht! Das die Scriptengine das so schnell hinbekommt hätte ich nicht gedacht. *respekt* Bin mal gespannt, wie die finale Version des Spiels aussehen wird. Ich wünsch dir weiterhin viel Glück und gutes Gelingen. Dolvik PS: Erstaunlich was du alles schaffst: SE1, SE2, Widgetengine, ImageViewer, Spiel. Übernimm dich nicht ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz