Beiträge: 988
Themen: 65
Registriert seit: 03.06.2004
0 Zitat:Original von Thorium
TaDa: SlowIt v0.05 (16kb RAR)
Sollte selbsterklärend sein. Ist noch nicht ganz fertig, sollte aber soweit funktionieren. Im Augenblick kann nur die Pausendauer eingestellt werden. Dafür mit GUI und die Pausendauer ist in Echtzeit regelbar.
Jetzt interessiert mich aber doch schon, wie du das gemacht hast...
Oder bleibt das Programmierer Geheimnis? ;-)
Give a man a gun and he'll rob a bank. Give a man a bank and he'll rob everybody.
Beiträge: 2.827
Themen: 101
Registriert seit: 25.09.2005
0 Zitat:Original von Apie
Jetzt interessiert mich aber doch schon, wie du das gemacht hast...
Oder bleibt das Programmierer Geheimnis? ;-)
Naja, sooo kompliziert ist es nicht, das ichs unbedingt geheimhalten müsste.
Habs in PureBasic geschrieben.
SlowIt.dll
Wird in den Zielprozess injiziert und nimmt da die Verlangsamung vor.
Code: ;/------------------\\
;| Process SlowIt |
;| DLL |
;| |
;| Version 0.05 |
;| PureBasic 4.20 |
;\\------------------/
EnableExplicit
#THREAD_ALL_ACCESS = $1F03FF
Structure SharedData
PauseTime.l
Exit.l
EndStructure
Global *SharedConfig.SharedData
Procedure AllocSharedMemory(SizeOfSharedData.l,MemoryName.s)
Define.l hMapping
hMapping = CreateFileMapping_(#INVALID_HANDLE_VALUE,0,#PAGE_READWRITE,0,SizeOfSharedData,MemoryName)
hMapping = MapViewOfFile_(hMapping,#FILE_MAP_WRITE,0,0,0)
ProcedureReturn hMapping
EndProcedure
Procedure.l GetThreadID(ProcessID.l)
Define.l hSnapshot,RetVal
Define.THREADENTRY32 ThreadInfo
ThreadInfo\\dwSize = SizeOf(ThreadInfo)
hSnapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPTHREAD,0)
If hSnapshot <> 0
RetVal = Thread32First_(hSnapshot,@ThreadInfo)
If RetVal <> 0
If ThreadInfo\\th32OwnerProcessID = ProcessID
CloseHandle_(hSnapshot)
ProcedureReturn ThreadInfo\\th32ThreadID
EndIf
Repeat
RetVal = Thread32Next_(hSnapshot,@ThreadInfo)
If RetVal = 0
Break
Else
If ThreadInfo\\th32OwnerProcessID = ProcessID
CloseHandle_(hSnapshot)
ProcedureReturn ThreadInfo\\th32ThreadID
EndIf
EndIf
Until RetVal = 0
CloseHandle_(hSnapshot)
EndIf
EndIf
ProcedureReturn 0
EndProcedure
Procedure SelfUnloadModule(SelfModuleName.s)
Define.l NewProcAddr,ProcSize,hKernel32,hSelfModule,FreeLibraryAddr,ExitThreadAddr
ProcSize = ?SelfUnloadProcEnd - ?SelfUnloadProcStart
NewProcAddr = VirtualAlloc_(0,ProcSize,#MEM_COMMIT | #MEM_RESERVE,#PAGE_EXECUTE_READWRITE)
CopyMemory(?SelfUnloadProcStart,NewProcAddr,ProcSize)
hSelfModule = GetModuleHandle_(SelfModuleName)
hKernel32 = GetModuleHandle_("kernel32.dll")
FreeLibraryAddr = GetProcAddress_(hKernel32,"FreeLibrary")
ExitThreadAddr = GetProcAddress_(hKernel32,"ExitThread")
!jmp dword[p.v_NewProcAddr]
SelfUnloadProcStart:
!mov eax,dword[p.v_FreeLibraryAddr]
!mov ebx,dword[p.v_hSelfModule]
!push ebx
!call eax
!mov eax,dword[p.v_ExitThreadAddr]
!xor ebx,ebx
!push ebx
!call eax
SelfUnloadProcEnd:
EndProcedure
Procedure SlowDown(Param.l)
Define.l hThread,StartTime,EndTime,hKernel32DLL
*SharedConfig = AllocSharedMemory(SizeOf(SharedData),"SlowItConfigGSM")
hKernel32DLL = OpenLibrary(#PB_Any,"kernel32.dll")
hThread = CallFunction(hKernel32DLL,"OpenThread",#THREAD_ALL_ACCESS,0,GetThreadID(GetCurrentProcessId_()))
SetThreadPriority_(GetCurrentThread_(),#THREAD_PRIORITY_ABOVE_NORMAL)
Repeat
Sleep_(1)
SuspendThread_(hThread)
Sleep_(*SharedConfig\\PauseTime)
ResumeThread_(hThread)
Until *SharedConfig\\Exit = 1
*SharedConfig\\Exit = 0
CloseHandle_(hThread)
SelfUnloadModule("SlowIt.dll")
EndProcedure
ProcedureDLL AttachProcess(Instance)
CreateThread(@SlowDown(),0)
EndProcedure
ProcedureDLL DetachProcess(Instance)
EndProcedure
SlowIt.exe
GUI und Injector für die SlowIt.dll
Code: ;/------------------\\
;| Process SlowIt |
;| Injector |
;| |
;| Version 0.04 |
;| PureBasic 4.20 |
;\\------------------/
EnableExplicit
Enumeration
#MainWindow
EndEnumeration
Enumeration
#Gad_List
#Gad_PauseTrackbar
#Gad_PauseText
#Gad_StartButton
EndEnumeration
#AppTitle = "SlowIt"
#UpdateInterval = 200
Structure ProcessInfo
Name.s
Path.s
ID.l
ParentID.l
ThreadsCnt.l
PriorityClass.l
Icon.l
EndStructure
Structure SharedData
PauseTime.l
Exit.l
EndStructure
Global OS.l
Global Dim ProcessList.ProcessInfo(0)
Global ProcessListCnt.l
Global SystemAppIcon.l
Global SlowItDLLPath.s
Global *SharedConfig.SharedData
Global SlowState.l
Global SlowProcessHandle.l
Procedure AllocSharedMemory(SizeOfSharedData.l,MemoryName.s)
Define.l hMapping
hMapping = CreateFileMapping_(#INVALID_HANDLE_VALUE,0,#PAGE_READWRITE,0,SizeOfSharedData,MemoryName)
hMapping = MapViewOfFile_(hMapping,#FILE_MAP_WRITE,0,0,0)
ProcedureReturn hMapping
EndProcedure
Procedure OpenMainWindow()
If OpenWindow(#MainWindow, 216, 0, 590, 328, "SlowIt 0.05 by Thorium", #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
If CreateGadgetList(WindowID(#MainWindow))
ListIconGadget(#Gad_List,0,0,590,290,"Name",150,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#Gad_List,1,"Path",250)
AddGadgetColumn(#Gad_List,2,"PID",50)
AddGadgetColumn(#Gad_List,3,"Parent PID",75)
TrackBarGadget(#Gad_PauseTrackbar, 90, 300, 200, 20, 0, 20, #PB_TrackBar_Ticks)
TextGadget(#Gad_PauseText, 0, 300, 90, 20, "Pause Time:", #PB_Text_Right)
ButtonGadget(#Gad_StartButton, 300, 297, 100, 27, "&Slow It")
EndIf
EndIf
EndProcedure
Procedure.l InjectDLLThread(hProcess.l,DLLFileName.s)
Define.l FileNameLen,FileNameAddr,BytesWritten,hKernel32,LoadLibraryAAddr,hThread
;Dateiname der DLL in den Zielprozess schreiben
FileNameLen = Len(DLLFileName) + 1
FileNameAddr = VirtualAllocEx_(hProcess,0,FileNameLen,#MEM_COMMIT | #MEM_RESERVE,#PAGE_READWRITE)
If FileNameAddr = 0
ProcedureReturn 0
EndIf
If WriteProcessMemory_(hProcess,FileNameAddr,DLLFileName,FileNameLen,@BytesWritten) = 0
ProcedureReturn 0
EndIf
If BytesWritten <> FileNameLen
ProcedureReturn 0
EndIf
;Addresse von LoadLibraryA ermitteln
hKernel32 = GetModuleHandle_("Kernel32.dll")
If hKernel32 = 0
ProcedureReturn 0
EndIf
LoadLibraryAAddr = GetProcAddress_(hKernel32,"LoadLibraryA")
If LoadLibraryAAddr = 0
ProcedureReturn 0
EndIf
;Thread im Zielprozess erstellen um LoadLibraryA auszuführen
hThread = CreateRemoteThread_(hProcess,0,0,LoadLibraryAAddr,FileNameAddr, 0, 0)
If hThread = 0
ProcedureReturn 0
EndIf
;warten bis der Thread beendet ist und aufräumen
WaitForSingleObject_(hThread,#INFINITE)
VirtualFreeEx_(hProcess,FileNameAddr,0,#MEM_RELEASE)
ProcedureReturn 1
EndProcedure
Procedure GetProcessList()
Define.l ProcessSnapHandle,ModuleSnapHandle,RetVal,i,ProcessID,ExePath,IconHandle
Define.PROCESSENTRY32 ProcessEntry
Define.MODULEENTRY32 ModuleEntry
ReDim ProcessList.ProcessInfo(0)
ProcessListCnt = 0
ProcessEntry\\dwSize = SizeOf(ProcessEntry)
ModuleEntry\\dwSize = SizeOf(ModuleEntry)
;laufende Prozesse ermitteln
ExePath = AllocateMemory(1024)
ProcessSnapHandle = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS,0)
RetVal = Process32First_(ProcessSnapHandle,ProcessEntry)
While RetVal = #True
ProcessListCnt = ProcessListCnt + 1
ReDim ProcessList.ProcessInfo(ProcessListCnt)
ProcessList(ProcessListCnt)\\Name = PeekS(@ProcessEntry\\szExeFile)
If OS = #PB_OS_Windows_95 Or OS = #PB_OS_Windows_98 Or OS = #PB_OS_Windows_ME
ProcessList(ProcessListCnt)\\Name = GetFilePart(ProcessList(ProcessListCnt)\\Name)
EndIf
ProcessList(ProcessListCnt)\\ID = ProcessEntry\\th32ProcessID
ProcessList(ProcessListCnt)\\ParentID = ProcessEntry\\th32ParentProcessID
ProcessList(ProcessListCnt)\\ThreadsCnt = ProcessEntry\\cntThreads
ProcessList(ProcessListCnt)\\PriorityClass = ProcessEntry\\pcPriClassBase
If ProcessEntry\\th32ProcessID <> 0
ModuleSnapHandle = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE,ProcessEntry\\th32ProcessID)
If ModuleSnapHandle
If Module32First_(ModuleSnapHandle,ModuleEntry)
ProcessList(ProcessListCnt)\\Path = GetPathPart(Trim(PeekS(@ModuleEntry\\szExePath)))
EndIf
CloseHandle_(ModuleSnapHandle)
EndIf
EndIf
PokeS(ExePath,ProcessList(ProcessListCnt)\\Path + ProcessList(ProcessListCnt)\\Name)
IconHandle = ExtractIcon_(0,ExePath,0)
If IconHandle = 0
IconHandle = SystemAppIcon
EndIf
ProcessList(ProcessListCnt)\\Icon = IconHandle
RetVal = Process32Next_(ProcessSnapHandle,ProcessEntry)
Wend
CloseHandle_(ProcessSnapHandle)
FreeMemory(ExePath)
EndProcedure
Procedure FillProcessList()
Define.l i
ClearGadgetItemList(#Gad_List)
For i = 1 To ProcessListCnt
AddGadgetItem(#Gad_List,i-1,ProcessList(i)\\Name,ProcessList(i)\\Icon)
SetGadgetItemText(#Gad_List,i-1,ProcessList(i)\\Path,1)
SetGadgetItemText(#Gad_List,i-1,Hex(ProcessList(i)\\ID),2)
SetGadgetItemText(#Gad_List,i-1,Hex(ProcessList(i)\\ParentID),3)
Next
EndProcedure
Procedure UpdateProcessList()
Define.l i,i2,OldProcessListCnt
Dim OldProcessList.ProcessInfo(ProcessListCnt)
For i = 1 To ProcessListCnt
OldProcessList(i)\\Name = ProcessList(i)\\Name
OldProcessList(i)\\Path = ProcessList(i)\\Path
OldProcessList(i)\\ID = ProcessList(i)\\ID
OldProcessList(i)\\Icon = ProcessList(i)\\Icon
Next
OldProcessListCnt = ProcessListCnt
For i = 1 To OldProcessListCnt
If OldProcessList(i)\\Icon <> SystemAppIcon
DestroyIcon_(OldProcessList(i)\\Icon)
EndIf
Next
GetProcessList()
If OldProcessListCnt = ProcessListCnt
For i = 1 To ProcessListCnt
If OldProcessList(i)\\Name <> ProcessList(i)\\Name Or OldProcessList(i)\\Path <> ProcessList(i)\\Path Or OldProcessList(i)\\ID <> ProcessList(i)\\ID
FillProcessList()
Break
EndIf
Next
Else
FillProcessList()
EndIf
EndProcedure
Procedure InitProcessSlow(Index.l)
Define.s ModulePath
Define.l PauseTime
PauseTime = GetGadgetState(#Gad_PauseTrackbar)
SlowProcessHandle = OpenProcess_(#PROCESS_ALL_ACCESS,0,ProcessList(Index)\\ID)
If InjectDLLThread(SlowProcessHandle,SlowItDLLPath) = 0
SlowProcessHandle = 0
MessageRequester(#AppTitle,"Error: Can't inject SlowIt.dll!",16)
ProcedureReturn
EndIf
DisableGadget(#Gad_List,1)
SetGadgetText(#Gad_StartButton,"&Stop")
SlowState = 1
EndProcedure
Procedure EndProcessSlow()
SetGadgetText(#Gad_StartButton,"Stopping...")
DisableGadget(#Gad_StartButton,1)
*SharedConfig\\Exit = 1
SlowState = 2
EndProcedure
Procedure ProcessSlowEnded()
SlowProcessHandle = 0
*SharedConfig\\Exit = 0
SetGadgetText(#Gad_StartButton,"&Slow It")
DisableGadget(#Gad_StartButton,0)
DisableGadget(#Gad_List,0)
SlowState = 0
EndProcedure
Procedure CheckProcessSlowEnded()
If *SharedConfig\\Exit = 0
ProcessSlowEnded()
EndIf
EndProcedure
Procedure.l CheckProcessRunning(hProcess.l)
Define.l ExitCode
GetExitCodeProcess_(hProcess,@ExitCode)
If ExitCode = #STILL_ACTIVE
ProcedureReturn 1
Else
CloseHandle_(hProcess)
ProcedureReturn 0
EndIf
EndProcedure
Define.l Event,Index,UpdateStartTime,hMutex
OS = OSVersion()
If OS < #PB_OS_Windows_2000
MessageRequester(#AppTitle, "Unsupported Windows version!",#MB_ICONEXCLAMATION)
End
EndIf
CreateMutex_(0,0,"SlowItInstanceMutex")
If GetLastError_() = #ERROR_ALREADY_EXISTS
End
EndIf
SlowItDLLPath = Space(1024)
GetModuleFileName_(0,@SlowItDLLPath,1024)
SlowItDLLPath = GetPathPart(Trim(SlowItDLLPath)) + "SlowIt.dll"
*SharedConfig = AllocSharedMemory(SizeOf(SharedData),"SlowItConfigGSM")
*SharedConfig\\Exit = 0
*SharedConfig\\PauseTime = 1
SystemAppIcon = LoadIcon_(0,#IDI_APPLICATION)
OpenMainWindow()
GetProcessList()
FillProcessList()
Repeat
UpdateStartTime = ElapsedMilliseconds()
Event = WaitWindowEvent(#UpdateInterval)
Select Event
Case #PB_Event_SizeWindow
ResizeGadget(#Gad_List,#PB_Ignore,#PB_Ignore,WindowWidth(#MainWindow),WindowHeight(#MainWindow)-40)
TrackBarGadget(#Gad_PauseTrackbar, 90, WindowHeight(#MainWindow) - 30, 200, 20, 1, 20, #PB_TrackBar_Ticks)
TextGadget(#Gad_PauseText, 0, WindowHeight(#MainWindow) - 28, 90, 20, "Pause Time:", #PB_Text_Right)
ButtonGadget(#Gad_StartButton, 300, WindowHeight(#MainWindow) - 32, 100, 27, "&Slow It")
Case #PB_Event_Gadget
Select EventGadget()
Case #Gad_List
Select EventType()
Case #PB_EventType_LeftDoubleClick
Index = GetGadgetState(#Gad_List)
If Index > -1
InitProcessSlow(Index+1)
EndIf
EndSelect
Case #Gad_StartButton
If SlowState = 0
Index = GetGadgetState(#Gad_List)
If Index > -1
InitProcessSlow(Index+1)
EndIf
ElseIf SlowState = 1
EndProcessSlow()
EndIf
Case #Gad_PauseTrackbar
*SharedConfig\\PauseTime = GetGadgetState(#Gad_PauseTrackbar)
EndSelect
EndSelect
If ElapsedMilliseconds() => UpdateStartTime + #UpdateInterval
If SlowProcessHandle <> 0
If CheckProcessRunning(SlowProcessHandle) = 0
ProcessSlowEnded()
EndIf
EndIf
If SlowState = 2
CheckProcessSlowEnded()
EndIf
UpdateProcessList()
EndIf
Until Event = #PB_Event_CloseWindow
End
Beiträge: 988
Themen: 65
Registriert seit: 03.06.2004
0 Nicht schelcht, dafür musste dich aber doch schon sehr gut mit den Win32 APIs auskennen
*RESPEKT*
Give a man a gun and he'll rob a bank. Give a man a bank and he'll rob everybody.
Beiträge: 7.357
Themen: 130
Registriert seit: 13.07.2006
0 Ich seh's leider erst jetzt und habe momentan keine Zeit zum Testen - aber ich kann mich Apie nur anschließen: Großartige Arbeit. Ich will sobald wie möglich mal auf Version 0.05 umsteigen.
EDIT: Hab's dann doch getestet und muss sagen: Schöne Sache, das grafische Menü gefällt mir. Nur könntest du bei dem Schieberegler noch was dranschreiben, damit man in etwa eine Ahnung hat, wieviel der jetzt abbremst. Ich würde vielleicht sogar 2 Boxen bevorzugen, in die man die Run- und Pause-Zeit wieder in ms angeben kann, dann hat man die bessere Kontrolle. Oder ist der Schieberegler vielleicht logarithmisch eingeteilt? Hätte vielleicht den gleichen Effekt....
Auf jeden Fall vielen Dank für deine Arbeit. So ein Programm hat der Welt noch gefehlt.
Beiträge: 6.843
Themen: 127
Registriert seit: 18.02.2006
0 Zitat:Original von Thorium
TaDa: SlowIt v0.05 (16kb RAR)
Sollte selbsterklärend sein. Ist noch nicht ganz fertig, sollte aber soweit funktionieren. Im Augenblick kann nur die Pausendauer eingestellt werden. Dafür mit GUI und die Pausendauer ist in Echtzeit regelbar.
Hey, das Programm funktioniert ja echt klasse. So etwas habe ich schon lange gesucht, weil es mich gestört hat, dass ich beim Verlangsamen von Prozessen gleich auch sonst nichts mehr am PC machen konnte, da das Verlangsamungsprogramm die komplette CPU-Zeit in Anspruch genommen hat. Vielen Dank für dieses geniale Programm, das werde ich nie wieder löschen
Beiträge: 2.827
Themen: 101
Registriert seit: 25.09.2005
0 Bitte nochnicht so viel rumverteilen, das Programm. Es ist wie gesagt noch nicht fertig. Ich bin noch am machen aber dank täglicher Überstunden, diese Woche nur 3 Zeilen Code am Tag geschafft.
Also dauert noch ein bissel.
Beiträge: 7.357
Themen: 130
Registriert seit: 13.07.2006
0 Lass dir Zeit, läuft ja eigentlich gut genug. Es kommt mir allerdings so vor, als würde mein gebremstes Spiel ein wenig ruckeln - vielleicht ist ja die Pause-Zeit zu lang. Wie ich schon sagte: Zwei Boxen zum Eingeben fand ich schöner....
Und weiterverteilen werde ich es auch nicht (kannst ja eine kleine Notiz zu deinem Programm zufügen), womöglich wirst du nochmal reich damit?
Beiträge: 46
Themen: 2
Registriert seit: 18.01.2007
0 Zitat:Dosbox, ja? Muss ich gleich mal schauen. Ich bin ja noch relativ neu hier. Wenn ich mal richtig hinschaue, dann stelle ich fest, dass es hier Spiele gibt, die in Dos laufen. Sowas muss man sich mal vorstellen! Dos! Also muss ich mal bei google Doxbos eingeben.... ach nee "BosDox"..... mmhh....gibt's beides nicht. Tja, dann muss ich wohl weiterhin ohne auskommen.
War nur ein kleiner Scherz, nimm's mir nicht übel gruffi , die DosBox kenne ich natürlich. Du hast schon Recht, sie ist das wohl beste Tool um ein Dos-Spiel zum Laufen zu bekommen. Als ich aber die CPU-Bremse für Dos ansprach, dachte ich eher daran, dass auch unter jeder Windows-Version vor Win95 noch ein vollständiges Dos steckte. Und Windows 3.1 habe ich leider in der Dosbox nur mit Problemen zum Laufen bekommen. Das heißt, ich brauche eine gute "Bremse", die unter Dos läuft. Ein "Slowdown" und "Moslo" habe ich da schon probiert, aber da gibt's gleich ein 50-seitiges Handbuch dazu und ca. eine Million Parameteroptionen.
Ok, ich dachte, du suchst einfach nur eine Möglichkeit, die Geschwindigkeit für DOS Spiele zu regulieren. Ist aber eine interessante Diskussion hier.
Beiträge: 7.357
Themen: 130
Registriert seit: 13.07.2006
0 Stimmt, sehr interessante Sache hier. Ich will gleich mal *push* machen und fragen, ob es schon was neues gibt? Vielleicht ist in meiner Abwesenheit schonmal an Version 0.06 gearbeitet worden?
Beiträge: 2.827
Themen: 101
Registriert seit: 25.09.2005
0 Zitat:Original von thEClaw
Vielleicht ist in meiner Abwesenheit schonmal an Version 0.06 gearbeitet worden?
Ja, ich arbeite drann. Gibt aber keine neue öffentliche Version, Gedult.
Beiträge: 7.357
Themen: 130
Registriert seit: 13.07.2006
0 Schade, aber das klingt trotzdem schonmal gut. Willst wohl tatsächlich reich damit werden?
Ich habe dein Programm vorhin nochmal ausprobiert, habe allerdings etwas festgestellt: Wenn man ein Programm im Kompatibilitätsmodus ausführt, dann wird es nicht gebremst - da scheint dann wohl so etwas wie ein Emulator zu laufen. Falls du weißt, welchen Prozess man dazu bremsen muss, könntest du mal eine kleine Readme dazu legen (viele zu bremsende Programme werden wohl einen Komp.-Modus benötigen). Kann aber auch sein, dass das ein so systemnaher Prozess ist, dass man deine Bremse nicht drauf anwenden kann, ich habe schon eine Weile rumprobiert. Da wird dann wohl nur der Umweg über einen virtuellen PC helfen.
Und wenn du bereit dazu wärst, deine Version an mich zu verschicken, dann würde ich gern weiter testen - weitergeben würde ich das Programm natürlich nicht.
Beiträge: 2.827
Themen: 101
Registriert seit: 25.09.2005
0 Zitat:Original von thEClaw
Schade, aber das klingt trotzdem schonmal gut. Willst wohl tatsächlich reich damit werden?
Nein, es wird auf jeden Fall 100% kostenlos und werbefrei sein!
Aber ich glaub ich werd mir bei PayPal ein Spendenkonto anlegen. Wer will kann dann was spenden.
Zitat:Original von thEClaw
Ich habe dein Programm vorhin nochmal ausprobiert, habe allerdings etwas festgestellt: Wenn man ein Programm im Kompatibilitätsmodus ausführt, dann wird es nicht gebremst
Danke für den Hinweis, werde mir das anschauen.
Zitat:Original von thEClaw
Und wenn du bereit dazu wärst, deine Version an mich zu verschicken, dann würde ich gern weiter testen - weitergeben würde ich das Programm natürlich nicht.
Das währe super, wenn du für mich testen könntest. Mal sehen werd dir heute oder morgen mal ne neue Version schicken. Es geht beim "nicht weitergeben" darum das sich einfach keine unfertigen und fehlerhaften Versionen verbreiten. Sowas schaded dem Ruf der Software.
Beiträge: 7.357
Themen: 130
Registriert seit: 13.07.2006
0 Zitat:Original von Thorium
Das währe super, wenn du für mich testen könntest. Mal sehen werd dir heute oder morgen mal ne neue Version schicken. Es geht beim "nicht weitergeben" darum das sich einfach keine unfertigen und fehlerhaften Versionen verbreiten. Sowas schaded dem Ruf der Software.
Kann ich verstehen, ich bereite mich mal drauf vor.
Ich habe übrigens mit der aktuellen Version immer noch das Problem, dass das Spiel (ich teste ja nur Betrayal in Antara, vielleicht finde ich auch mal ein anderes) schnell ins Stocken kommt, wenn ich den Schieberegler mehr als 2 Striche nach rechts ziehe. Ich teste zwar auch nur auf einem Celeron mit 2,6 GHz, aber falls die Striche jeweils eine Millisekunde bedeuten, dürfte es da nicht so schnell bergab gehen. In der Ursprungsversion (0.03) hatte ich dieses Problem nie (will nachher nochmal vergleichen).
Und wie sieht es jetzt eigentlich mir der Prozesspriorität aus? Hast du die Wahl automatisiert? Oder soll ich im Taskmanager lieber noch die Einstellungen vornehmen? Und dazu gleich noch eine Frage: Wäre es vielleicht günstig, die Priorität auf "Echtzeit" zu setzen? Das Problem, das andere Programme da machen, nämlich dass die CPU plötzlich völlig ausgelastet wird, dürfte ja nicht auftreten, so lange eine Pause eingestellt ist.
Beiträge: 7.357
Themen: 130
Registriert seit: 13.07.2006
0 Der Doppelpost muss jetzt sein, damit mein Text nicht untergeht:
Ich habe Version 0.06 jetzt eine ganze Weile getestet, mir fällt zuerst auf, dass es gar nicht so leicht ist, eine Einstellung zu finden, die für die richtigen Ergebnisse sorgt. Ich hatte bei Betrayal in Antara die Run-Zeit auf 1ms, die Pause-Zeit auf 18ms und es lief viel zu schnell. Bei Pause 20ms hat es ziemlich gestockt und bei 19ms lief es dann gut.
Jetzt kommen mal meineWünsche für das Programm, ein Teil sollte nicht allzu schwierig umzusetzen sein:
1. Wunsch: Beschriftung für die Achsen der Schieberegler (OK, da gibt's ja jetzt Einblendungen, aber Beschriftungen alle 25ms wären trotzdem praktisch, damit man nicht bei jedem Start suchen muss)
2. Wunsch: Möglichkeit, die Regelung nach oben offen zu halten (damit das Programm auch in 10 Jahren noch funktioniert )
3. Wunsch: Möglichkeit, zwischen "Schieberegler"-Modus und Direkteingabemodus umzuschalten (wenn bei Direkteingabe ein Wert steht, der größer ist, als der maximale Schieberegler-Wert, dann soll der Eingabewert gelten bis man den Regler berührt - das würde gleichzeitig den 2. Wunsch erfüllen)
4. Wunsch: SlowIt minimieren, wenn es aktiv ist.
Und wie schwer wäre die Erstellung einer Verknüpfung, die das Starten und Einstellen von SlowIt erspart? Automatische Erstellung wäre schön, eine Kommandozeilen-Option wäre auch ausreichend (Im Stile: C:\\Spiel\\Game.exe -C:\\Programme\\SlowIt\\SlowIt.exe R:1 P:3; oder natürlich andersherum: C:\\Programme\\SlowIt\\SlowIt.exe R:1 P:3 -C:\\Spiel\\Game.exe <-- wäre wahrscheinlich leichter). Wenn es die Möglichkeit gäbe, könnte man sich ja schnell eine Verknüpfung zusammenbasteln, die alles nötige automatisiert.
Ein kleines Problem habe ich, wenn ich Betrayal in Antara (in Virtual PC) mit R:1 und P:19 laufen lasse (gut spielbar). Wenn ich jetzt zu R:2 und P:19 wechsle, stockt das Spiel ziemlich stark - eigentlich müsste es doch eher schneller laufen, oder? Ist da der Timing-Aufwand zu groß?
Ach ja, eines gäbe es noch: Da ich nur Betrayal in Antara in Virtual PC testen kann, wäre es vielleicht gut, mal was anderes zu testen. Allerdings fällt mir nicht auf Anhieb ein Windows-Spiel ein, das zu schnell liefe - da ich eine ziemliche Sammlung besitze, wäre ein Vorschlag nützlich, was ich denn noch testen könnte.
EDIT: Es gab mal einen Rainbow Six-Teil, der ungebremst lief, den habe ich auch irgendwo....
Beiträge: 249
Themen: 10
Registriert seit: 02.11.2006
0 Hallo,
hier ist noch ein sehr vielversprechendes und ungewöhnliches Slowdown-Tool für Vista/XP/NT/2K:
http://www.oldskool.org/pc/throttle
Auf der Seite ist auch ein Link zur DOS-Version. Dort wird genauer erklärt, wie es arbeitet. Kurz gesagt: Es kann den L1 Cache deaktivieren und außerdem noch die CPU heruntertakten. Letzteres soll im Prinzip mit allen ACPI-fähigen Chipsätzen per Software möglich sein. Durch die Kombination aus beidem soll man sehr große Verlangsamungen erreichen können, ohne daß es ruckelig wird. Zusätzlich kann man es auch noch mit herkömmlichen Software-Slowdownprogrammen kombinieren, da "Throttle" ja die Hardware anspricht und daher ganz anders arbeitet.
Diese Seite ist in dem Zusammenhang interessant, weil sie die verschiedenen Möglichkeiten erklärt einen Rechner langsamer zu machen:
http://www.oldskool.org/guides/oldonnew/cripple
Oboe
|