Jump to content

DynDoLOD...is it worth using?


noodles1976

Recommended Posts

Posted

Hi LL...just out of curiosity, has anyone here used the Dynamic Distant Objects LOD utility?

http://www.nexusmods.com/skyrim/mods/59721/?tab=1&navtag=http%3A%2F%2Fwww.nexusmods.com%2Fskyrim%2Fajax%2Fmoddescription%2F%3Fid%3D59721%26preview%3D&pUp=1

I'm considering using it to improve my LODs, as that has always been something that has stuck out to me like a swore thumb. I'm looking for pros and cons to using it, from people with experience with it.

 

I'm not keen to try other options at this point, such as editing uGridstoload or other LOD mods...I'm essentially 'shopping' at this point.

 

Any help / insight would be greatly appreciated!

 

N~dles

Posted

I don't use it because I found it gave me quite a hefty performance loss on my hobo pc.  The original TESLODGen requires a lot less knob twiddling from me to get a decent result with negligible if any fps loss so I've stuck with that instead.  

 

Yeah it really is worth it. I've spent literally years trying to make my game look pretty on a budget and distant trees always made me feel like I was wasting my time. These mods sort that right out. They'll also make a lot more architecture, clutter and landmarks visible without having to raise ugrids. 

Posted

It's essentially the Book of Secrets for terrain.

 

If you don't use it, you probably won't miss it. Once you do use it, it will be very very hard to go back to vanilla or equivalent.

Posted

Yes its worth it. DynDoLOD is "the" mod to use. It takes a lil bit of legwork but it is the most performance friendly, customizable and compatible option, especially if you dont want to edit ugrids. 

Posted

Thanks for the replies so far! Really appreciate it :D

 

I don't use it because I found it gave me quite a hefty performance loss on my hobo pc.  The original TESLODGen requires a lot less knob twiddling from me to get a decent result with negligible if any fps loss so I've stuck with that instead.  

 

Yeah it really is worth it. I've spent literally years trying to make my game look pretty on a budget and distant trees always made me feel like I was wasting my time. These mods sort that right out. They'll also make a lot more architecture, clutter and landmarks visible without having to raise ugrids. 

 

 

It's essentially the Book of Secrets for terrain.

 

If you don't use it, you probably won't miss it. Once you do use it, it will be very very hard to go back to vanilla or equivalent.

 

 

Yes its worth it. DynDoLOD is "the" mod to use. It takes a lil bit of legwork but it is the most performance friendly, customizable and compatible option, especially if you dont want to edit ugrids. 

 

So, the only negative mentioned so far is a performance hit...Do you all think it would be better to run TES5LODGen first and see what kind of impact it has on my system?

 

Thanks again for the insight / advice so far!

 

N~dles

Posted

...and, strangely enough, one weird thing I've found is that, while there's a performance hit and no mistake, once I started using it my stability actually improved.  Go figure.

Posted

Last time I used that thing it made my game completely unplayable. Infinite loading screens every time I went outdoors, crashes every time I opened menus when indoors...

 

Then again I have a toaster with 1GB of vram so...

Posted

Thanks for the replies everybody...really appreciate it :)

 

Yes, I think it is totally worth it.  I used the high settings, but I checked my memblocks log, and it shot up to like 400 something, so I went down to medium settings

 

 

...and, strangely enough, one weird thing I've found is that, while there's a performance hit and no mistake, once I started using it my stability actually improved.  Go figure.

 

 

Last time I used that thing it made my game completely unplayable. Infinite loading screens every time I went outdoors, crashes every time I opened menus when indoors...

 

Then again I have a toaster with 1GB of vram so...

 

 

 

 

If you don't use it, you probably won't miss it. Once you do use it, it will be very very hard to go back to vanilla or equivalent.

 

not that hard

oOfXX8Q.jpg

had a ctd in winterhold thanks to those scripts

one of them didn't survive a stack dump probably

so they were killed

ADieCXZ.jpg

 

 

Thanks for the info Yatol...I was hoping that you would post in this thread ;) I ran TES5LODGen last night and did some testing to see how my system would react and there was zero performance impact. I'm edging towards running the DynDoLOD utility, as having LODs built from my load order is just too tempting. I double checked and I don't have anything installed that is not compatible with DynDoLOD according to the main page on the Nexus, so it should be just fine to run. The only concern I have now is with what you just posted...CTDs due to script issues. Just out of curiosity, have you encountered any other CTD's with DynDoLOD?

 

I see you were able to fix it, so I may be referencing your post as a guide if I encounter the same trouble.

 

Thanks!

 

N~dles

Posted

 

 

If you don't use it, you probably won't miss it. Once you do use it, it will be very very hard to go back to vanilla or equivalent.

 

not that hard

oOfXX8Q.jpg

had a ctd in winterhold thanks to those scripts

one of them didn't survive a stack dump probably

so they were killed

ADieCXZ.jpg

 

 

You realize I'm talking about the visual quality and not whether it can be nuked or not, right?

 

right.

Posted

 

You realize I'm talking about the visual quality and not whether it can be nuked or not, right?

 

right.

 

 

you realize if you don't check that option

nVOeUkK.jpg

that mod don't add the lods with scripts (the others don't need a script, why those ones need one?)

 

 

before

7fmGiEg.jpg

after

UKrTwCK.jpg

don't see much difference

and i don't use dof, that thing is to hide lods or distant terrain

but i still have fog to hide some

vRd1nll.jpg

 

 

Posted

Yeah, not so keen on scripts being needed for the LODs to load either...script lag, Skyrim being Skyrim and Papyrus being "sensitive" could cause CTDs or save file bloat in a worst case scenario. TES5LODGen doesn't seem to have these issues as far as I can tell in testing it out, and it essentially does the same thing...

 

What do you think Yatol? Am I better off using TES5LODGen in your opinion?

 

N~dles

Posted

Scripts are bad and cause cooties. Best to delete the scripts folder.   :cool:

A script instance however...

 

This forum needs a facepalm emoticon please. :P

 

Posted

Scripts are bad and cause cooties. Best to delete the scripts folder.   :cool:

A script instance however...

 

This forum needs a facepalm emoticon please. :P

 

facepalm if you want i don't give a shit

 

this is what i check everytime i add a mod now

kErJbrG.jpg

mod 3b that's japan lodge

that mod have a lof of dirty edits, it was renaming some buildings to german, a dawnguard quest to german too, and other things from skyrim esm that was removing whatever i put in tamriel reload btt

 

16 automaticlight scrips in update 2? what is that? oh, no psc

 

 

;/ Decompiled by Champollion V1.0.1

Source   : AutomaticLightSwitchScript.psc

Modified : 2012-04-10 23:15:05

Compiled : 2012-04-10 23:25:24

User     : M3rvin

Computer : PIPBOY

/;

scriptName AutomaticLightSwitchScript extends ObjectReference

{Controls a set of lights with a master enable parent marker with this script attached to turn on and off at the times of the day specified by the properties LightsOffTime and LightsOnTime}

 

;-- Properties --------------------------------------

float property LightsOffTime = 7.00000 auto

{The time at which lights should be turned off}

float property LightsOnTime = 18.0000 auto

{The time at which lights should be turned on}

 

;-- Variables ---------------------------------------

 

;-- Functions ---------------------------------------

 

float function GetCurrentHourOfDay() global

{Returns the current time of day in hours since midnight}

 

    float Time = utility.GetCurrentGameTime()

    Time -= math.Floor(Time) as float

    Time *= 24 as float

    return Time

endFunction

 

; Skipped compiler generated GotoState

 

; Skipped compiler generated GetState

 

function OnInit()

 

    if AutomaticLightSwitchScript.GetCurrentHourOfDay() > LightsOffTime

        self.GotoState("LightsOff")

    else

        self.GotoState("LightsOn")

    endIf

endFunction

 

function RegisterForSingleUpdateGameTimeAt(float GameTime)

{Registers for a single UpdateGameTime event at the next occurrence of the specified GameTime (in hours since midnight)}

 

    float CurrentTime = AutomaticLightSwitchScript.GetCurrentHourOfDay()

    if GameTime < CurrentTime

        GameTime += 24 as float

    endIf

    self.RegisterForSingleUpdateGameTime(GameTime - CurrentTime)

endFunction

 

;-- State -------------------------------------------

state lightson

 

    function OnBeginState()

 

        self.Enable(false)

        self.RegisterForSingleUpdateGameTimeAt(LightsOffTime)

    endFunction

 

    function OnUpdateGameTime()

 

        self.GotoState("LightsOff")

    endFunction

endState

 

;-- State -------------------------------------------

state lightsoff

 

    function OnBeginState()

 

        self.Disable(false)

        self.RegisterForSingleUpdateGameTimeAt(LightsOnTime)

    endFunction

 

    function OnUpdateGameTime()

 

        self.GotoState("LightsOn")

    endFunction

endState

 

 

so that thing turn on or off light, even if i am in solstheim

don't know why he didn't used an hour check on onload(), that load a registerforsingleupdate one hour later, and is unregisterforupdate on onunload()

 

you don't need mods to get that kind of fail script

 

 

FOQ7KN9.jpg

 

 

qf_dialogcity that's the script to check if it's time to replace a jarl

swapjobalias is from hearthfire, another useless waste of cpu ressource

and dunyngolglow... is from yngol barrow, if the fast exist door don't open, you may have damaged your save, go back to an earlier save and kill that script before trying again

 

but it's faster to break your save by adding more of that crap

if you have autoloot, with some scripts of sofia, ssassisttools, bedroll, requiem... it won't be long to have problems

 

your script don't survive stack dumps, and when the game load a broken script

-either it skip it

-either you ctd

-either you freeze (script wait for event 4 to be load, game don't have any problem with that, but event 4 will never come since you are at event 8 now)

Posted

Fix the cause of stack dumbs? This is like saying cars also don't fly after crashing into a wall and blame the constructors of the road.

 

If you are knowledgeable about papyrus, have a look at the scripts and let me know what part doesn't survives a stack dumb. 

 

 

Posted

 

If you are knowledgeable about papyrus, have a look at the scripts and let me know what part doesn't survives a stack dumb.

 

i am not knowledgeable about papyrus

but i know enought to understand if oncellattach do its stuff but oncelldetach don't do its stuff, or if ontriggerenter do its stuff but ontriggerleave don't do its stuff, that can be troubles

 

 

 

Scriptname SHESON_DynDOLOD_Firstborn extends ObjectReference

;speedrunning is bad mmmkay

 

ObjectReference MyMaster = None

ObjectReference MyBrother = None

ObjectReference MyBrotherMinion = None

String MyWorld = "None"

String MyImportFileName = "None"

String MyModName = "DynDOLOD.esp"

String MyFormID = "None"

String MyFirstbornList = "None"

String MyMinionList = "None"

Bool MyMasterEnable = FALSE

Bool MyObjectEnable = FALSE

 

 

Event onTriggerEnter(objectReference triggerRef)

    if (triggerRef == Game.GetPLayer())

        if (Game.GetPlayer().GetActorValue("SpeedMult") <= 500)

            if (SKSE.GetVersion() > 0)

                if (PapyrusUtil.GetVersion() >= 26)

                    MyWorld = StringUtil.Substring(self.GetWorldspace() as string, 13, StringUtil.Find(self.GetWorldspace() as string, "(") - 14)

                    if (JsonUtil.GetStringValue("DynDOLOD_Worlds", MyWorld, 0) as bool)

                        MyImportFileName = "DynDOLOD_" + JsonUtil.GetStringValue("DynDOLOD_Worlds", MyWorld, "None") as string

                        if (MyImportFileName == "DynDOLOD_None")

                            Debug.Notification("DynDOLOD can not read data from DynDOLOD_Worlds.json")

                            StorageUtil.SetStringValue(None, "DynDOLOD_Last_Message", "Can not read data from DynDOLOD_Worlds.json")

                        else

                            MyFormID = Math.LogicalAnd(0x00FFFFFF, self.GetFormID()) as string

                            if (JsonUtil.StringListGet(MyImportFileName, MyFormID, 0) as bool)

                                MyFirstbornList = JsonUtil.StringListGet(MyImportFileName, MyFormID, 0)

                                MyMinionList = JsonUtil.StringListGet(MyImportFileName, MyFormID, 1)

                                MyMaster = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, "master", 0), MyModName) As ObjectReference

                                if (MyMaster != None)

                                    if (!MyMasterEnable) && (StorageUtil.GetIntValue(MyMaster, "DynDOLOD_Active", 1) == 1)

                                        StorageUtil.SetFormValue(MyMaster, "DynDOLOD_MyCurrentFirstborn", self)

                                        (MyMaster as SHESON_DynDOLOD_Master).IBowToThee(self, MyFirstbornList, MyMinionList, TRUE)

                                        MyMasterEnable = TRUE

                                    endIf

                                else

                                    Debug.Notification("DynDOLOD can not find master data in " + MyImportFileName + ".json")

                                    StorageUtil.SetStringValue(None, "DynDOLOD_Last_Message", "Can not find master data in " + MyImportFileName + ".json")

                                endIf

                            else

                                Debug.Notification("DynDOLOD can not read data from " + MyImportFileName + ".json")

                                StorageUtil.SetStringValue(None, "DynDOLOD_Last_Message", "Can not read data from " + MyImportFileName + ".json")

                            endIf

                        endIf

                    else

                        Debug.Notification("DynDOLOD can not read data from DynDOLOD_Worlds.json")

                        StorageUtil.SetStringValue(None, "DynDOLOD_Last_Message", "Can not read data from DynDOLOD_Worlds.json")

                    endIf

                else

                    Debug.MessageBox("DynDOLOD requires PapyrusUtil")

                endIf

            else

                Debug.MessageBox("DynDOLOD requires SKSE")

            endIf

        endIf

    endIf

endEvent

 

Event onTriggerLeave(objectReference triggerRef)

    if (triggerRef == Game.GetPLayer()) && (MyMasterEnable)

        MyMasterEnable = FALSE

        MyWorld = StringUtil.Substring(self.GetWorldspace() as string, 13, StringUtil.Find(self.GetWorldspace() as string, "(") - 14)

        MyImportFileName = "DynDOLOD_" + JsonUtil.GetStringValue("DynDOLOD_Worlds", MyWorld, MyWorld)

        MyFormID = Math.LogicalAnd(0x00FFFFFF, self.GetFormID()) as string

        MyFirstbornList = JsonUtil.StringListGet(MyImportFileName, MyFormID, 0)

        MyMinionList = JsonUtil.StringListGet(MyImportFileName, MyFormID, 1)

        MyMaster = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, "master", 0), MyModName) As ObjectReference

        if (MyMaster != None)

            if (StorageUtil.GetFormValue(MyMaster, "DynDOLOD_MyActiveFirstborn", None) == self)

                Utility.Wait(3)

            endIf

            if (StorageUtil.GetFormValue(MyMaster, "DynDOLOD_MyActiveFirstborn", None) == self)

                ; cell attach can happen because of wait

                if (self.GetParentCell())

                    if (!self.GetParentCell().IsAttached())

                        (MyMaster as SHESON_DynDOLOD_Master).IBowToThee(self, MyFirstbornList, MyMinionList, FALSE)

                    endIf

                else

                    (MyMaster as SHESON_DynDOLOD_Master).IBowToThee(self, MyFirstbornList, MyMinionList, FALSE)

                endIf

            endIf

        endIf

    endIf

endEvent

 

Event OnCellAttach()

    StorageUtil.SetIntValue(self, "CellState", 1)

    if (Game.GetPlayer().GetActorValue("SpeedMult") <= 500)

        MyWorld = StringUtil.Substring(self.GetWorldspace() as string, 13, StringUtil.Find(self.GetWorldspace() as string, "(") - 14)

        MyImportFileName = "DynDOLOD_" + JsonUtil.GetStringValue("DynDOLOD_Worlds", MyWorld, MyWorld)

        MyFormID = Math.LogicalAnd(0x00FFFFFF, self.GetFormID()) as string

        MyMaster = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, "master", 0), MyModName) As ObjectReference

        if (MyMaster != None)

            MyBrother = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, MyFormID, 0), MyModName) As ObjectReference

            MyBrotherMinion = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, MyFormID, 1), MyModName) As ObjectReference

            if (StorageUtil.GetIntValue(MyMaster, "DynDOLOD_Active", 1) == 1)

                if (MyBrother == None)

                    Activate(self)

                else

                    StorageUtil.SetIntValue(MyBrother, "CellState", 1)

                    MyBrother.Activate(self)

                endIf

                if (MyBrotherMinion != None)

                    StorageUtil.SetIntValue(MyBrotherMinion, "CellState", 1)

                    MyBrotherMinion.Activate(self)

                endIf

                MyObjectEnable = TRUE

            endIf

        endIf

    endIf

endEvent

 

Event OnCellDetach()

    StorageUtil.SetIntValue(self, "CellState", 0)

    if (MyObjectEnable)

        MyWorld = StringUtil.Substring(self.GetWorldspace() as string, 13, StringUtil.Find(self.GetWorldspace() as string, "(") - 14)

        MyImportFileName = "DynDOLOD_" + JsonUtil.GetStringValue("DynDOLOD_Worlds", MyWorld, MyWorld)

        MyFormID = Math.LogicalAnd(0x00FFFFFF, self.GetFormID()) as string

        MyBrother = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, MyFormID, 0), MyModName) As ObjectReference

        MyBrotherMinion = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, MyFormID, 1), MyModName) As ObjectReference

        if (MyBrother == None)

            Activate(self)

        else

            StorageUtil.SetIntValue(MyBrother, "CellState", 0)

            MyBrother.Activate(self)

        endIf

        if (MyBrotherMinion != None)

            StorageUtil.SetIntValue(MyBrotherMinion, "CellState", 0)

            MyBrotherMinion.Activate(self)

        endIf

        MyObjectEnable = FALSE

    endIf

    if (MyMasterEnable)

        MyMasterEnable = FALSE

        MyWorld = StringUtil.Substring(self.GetWorldspace() as string, 13, StringUtil.Find(self.GetWorldspace() as string, "(") - 14)

        MyImportFileName = "DynDOLOD_" + JsonUtil.GetStringValue("DynDOLOD_Worlds", MyWorld, MyWorld)

        MyFormID = Math.LogicalAnd(0x00FFFFFF, self.GetFormID()) as string

        MyFirstbornList = JsonUtil.StringListGet(MyImportFileName, MyFormID, 0)

        MyMinionList = JsonUtil.StringListGet(MyImportFileName, MyFormID, 1)

        MyMaster = Game.GetFormFromFile(JsonUtil.IntListGet(MyImportFileName, "master", 0), MyModName) As ObjectReference

        if (MyMaster != None)

            if (StorageUtil.GetFormValue(MyMaster, "DynDOLOD_MyActiveFirstborn", None) == self)

                Utility.Wait(3)

            endIf

            if (StorageUtil.GetFormValue(MyMaster, "DynDOLOD_MyActiveFirstborn", None) == self)

                ; cell attach can happen because of wait

                if (self.GetParentCell())

                    if (!self.GetParentCell().IsAttached())

                        (MyMaster as SHESON_DynDOLOD_Master).IBowToThee(self, MyFirstbornList, MyMinionList, FALSE)

                    endIf

                else

                    (MyMaster as SHESON_DynDOLOD_Master).IBowToThee(self, MyFirstbornList, MyMinionList, FALSE)

                endIf

            endIf

        endIf

    endIf

endEvent

 

 

 

what's the purpose of that thing anyway?

you get in los, game load a lod

you get close to the lod, game replace it with whatever it is

why replace that with something that don't work?

Posted

The scripts are mostly if then else, do this. So by looking at it realistically, if a section can not complete for whatever reason you may end up with dynamic LOD in the wrong enabled/disabled state. Which fixes itself next time the if then else do this complete successfully. 

 

I am not sure I understand the question? The scripts enables/disables objects that have isFullLOD flag set. By disabling them at times they don't need to be enabled, resources are released and the engine has more time for other things.

 

If internal games data is corrupted by stack dumps, that is somewhat out of the scope of what papyrus scripts themselves can influence I guess. However, each section of my scripts checks variables are defined, so it tries to always have a defined state and only work with valid data/objects.

 

 

Posted

 

I am not sure I understand the question?

 

a question? where?

 

 

had a ctd in winterhold thanks to those scripts

one of them didn't survive a stack dump probably

so they were killed

 

that's a fact

you don't need to be einstein to understand if a problem disappear when you remove something, problem is that something

 

don't have random ctd, when i ctd, i will ctd again, and again, and again, until the problem is taken care of (but when the problem is gone, it's gone)

Posted

If you ever want to get serious, I suggest double checking heap memory and maybe check for missing/invalid nifs causing problems.

Since your CTD isn't random, it should be possible to actually find the cause ,

 

For a second I thought we could dig into some understanding of papyrus and how it deals with data - not something as simple as reproducible CTD. Sorry my mistake.

 

 

Posted

If you ever want to get serious, I suggest double checking heap memory and maybe check for missing/invalid nifs causing problems.

Since your CTD isn't random, it should be possible to actually find the cause ,

 

nice joke, checking heap memory for what? don't even know what that is

checking my nif? for what?

cruQOtv.jpg

everything is done

if i had a broken nif, i would have seen it (and fix it)

like i saw some nifs with a fail uv map, there's a mod on nexus for most of them (but not all of them)

 

and i already said that ctd was because of your script, have delete it, that ctd can no longer happen

Posted

:D Is this some kind of joke I am not getting?

 

 

Again, sorry my mistake, I can see the basic requirements for using DynDOLOD were not met. I really thought for second there is knowledge here - nice bait. I had a nice laugh  :P

Posted

I can see the basic requirements for using DynDOLOD were not met

 

and how are you supposed to check that?

trying to make others believe i am too stupid to install your mod right?

 

it took me some months to get a ctd with your script

because i check my logs when i quit the game

if i see a dump, after taking care of the problem, i restart from a save before it (the dump is a list of all scripts that were load, it's easy to fix, you look for the useless ones, and you delete them)

 

few do that, and that was not enought, i didn't saw the dump that broke that lod script

Posted

I installed DynDoLod, and it's pretty great. However I did run into one bit of weirdness -- it kept crashing (the dyndolod scripts in Tes5Edit, that is) when my hard disk was fragmented. After a thorough defrag, it ran fine and now Skyrim looks pretty.

 

My hard disk is fine, I did a thorough scan of it (since this kind of thing can be warning sign of hard disk failure). I can only assume that the DynDoLod scripts have some kind of race condition in them that falls apart when hard disk lag gets really high.

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...