From bd0a7737701f0426b20718e667819efcebd04aeb Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Thu, 4 Apr 2013 18:26:17 -0700 Subject: [PATCH] Memory management is now dynamic, detected by device. LOD Bias is now an exponential function --- KREngine/kraken/KREngine.mm | 32 ++++++++++++++++++++++++++++ KREngine/kraken/KRLODGroup.cpp | 2 +- KREngine/kraken/KRRenderSettings.cpp | 2 +- KREngine/kraken/KRViewport.cpp | 2 +- 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/KREngine/kraken/KREngine.mm b/KREngine/kraken/KREngine.mm index 5deee9a..b4256ca 100644 --- a/KREngine/kraken/KREngine.mm +++ b/KREngine/kraken/KREngine.mm @@ -70,6 +70,37 @@ void kraken::set_parameter(const std::string ¶meter_name, float parameter_va { #if TARGET_OS_IPHONE + mach_port_t host_port = mach_host_self(); + mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t); + vm_size_t pagesize = 0; + vm_statistics_data_t vm_stat; + int total_ram = 256 * 1024 * 1024; + if(host_page_size(host_port, &pagesize) != KERN_SUCCESS) { + fprintf(stderr, "ERROR: Could not get VM page size.\n"); + } else if(host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) { + fprintf(stderr, "ERROR: Could not get VM stats.\n"); + } else { + total_ram = (vm_stat.wire_count + vm_stat.active_count + vm_stat.inactive_count + vm_stat.free_count) * pagesize; + } + + + KRContext::KRENGINE_MAX_VBO_HANDLES = 10000; + KRContext::KRENGINE_MAX_SHADER_HANDLES = 100; + KRContext::KRENGINE_MAX_TEXTURE_HANDLES = 10000; + KRContext::KRENGINE_MAX_TEXTURE_DIM = 2048; + KRContext::KRENGINE_MIN_TEXTURE_DIM = 64; + + KRContext::KRENGINE_MAX_TEXTURE_THROUGHPUT = 32000000; + + + KRContext::KRENGINE_MAX_VBO_MEM = total_ram * 2 / 4; + KRContext::KRENGINE_MAX_TEXTURE_MEM = total_ram * 1 / 4; + KRContext::KRENGINE_TARGET_TEXTURE_MEM_MAX = KRContext::KRENGINE_MAX_TEXTURE_MEM * 3 / 4; + KRContext::KRENGINE_TARGET_TEXTURE_MEM_MIN = KRContext::KRENGINE_MAX_TEXTURE_MEM / 2; + + + + /* BOOL isIpad = UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad; BOOL isRetina = [[UIScreen mainScreen] scale] >= 2.0; if(isIpad && isRetina) { @@ -95,6 +126,7 @@ void kraken::set_parameter(const std::string ¶meter_name, float parameter_va KRContext::KRENGINE_MIN_TEXTURE_DIM = 64; KRContext::KRENGINE_MAX_TEXTURE_THROUGHPUT = 32000000; } + */ #else KRContext::KRENGINE_MAX_VBO_HANDLES = 10000; KRContext::KRENGINE_MAX_VBO_MEM = 256000000; diff --git a/KREngine/kraken/KRLODGroup.cpp b/KREngine/kraken/KRLODGroup.cpp index 2c53383..9c04b17 100644 --- a/KREngine/kraken/KRLODGroup.cpp +++ b/KREngine/kraken/KRLODGroup.cpp @@ -87,7 +87,7 @@ bool KRLODGroup::getLODVisibility(const KRViewport &viewport) } else { // return (m_max_distance == 0); // FINDME, HACK - Test code to enable only the lowest LOD group float lod_bias = viewport.getLODBias(); - lod_bias = pow(2.0f, lod_bias); + lod_bias = pow(2.0f, -lod_bias); // Compare square distances as sqrt is expensive float sqr_distance = (viewport.getCameraPosition() - getWorldReferencePoint()).sqrMagnitude() * (lod_bias * lod_bias); float sqr_min_distance = m_min_distance * m_min_distance; diff --git a/KREngine/kraken/KRRenderSettings.cpp b/KREngine/kraken/KRRenderSettings.cpp index fedcf1c..6fc2966 100644 --- a/KREngine/kraken/KRRenderSettings.cpp +++ b/KREngine/kraken/KRRenderSettings.cpp @@ -73,7 +73,7 @@ KRRenderSettings::KRRenderSettings() dust_particle_intensity = 0.25f; dust_particle_enable = false; - m_lodBias = 1.0f; + m_lodBias = 0.0f; debug_display = KRENGINE_DEBUG_DISPLAY_NONE; } diff --git a/KREngine/kraken/KRViewport.cpp b/KREngine/kraken/KRViewport.cpp index 43fa5db..7ba0afa 100644 --- a/KREngine/kraken/KRViewport.cpp +++ b/KREngine/kraken/KRViewport.cpp @@ -19,7 +19,7 @@ KRViewport::KRViewport() m_size = KRVector2::One(); m_matProjection = KRMat4(); m_matView = KRMat4(); - m_lodBias = 1.0f; + m_lodBias = 0.0f; calculateDerivedValues(); }