This repository has been archived on 2026-10-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
HiNC-2025-win-desktop-Deploy/App/wwwroot/HiAPI-docsite/technique/simulation-performance/mesh-resolution.html
T
2026-09-09 18:06:21 +08:00

290 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Mesh Resolution | HiAPI-C# 2025 </title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="title" content="Mesh Resolution | HiAPI-C# 2025 ">
<link rel="icon" href="../../img/HiAPI.favicon.ico">
<link rel="stylesheet" href="../../public/docfx.min.css">
<link rel="stylesheet" href="../../public/main.css">
<meta name="docfx:navrel" content="../../toc.html">
<meta name="docfx:tocrel" content="toc.html">
<meta name="docfx:rel" content="../../">
<meta name="loc:inThisArticle" content="In this article">
<meta name="loc:searchResultsCount" content="{count} results for &quot;{query}&quot;">
<meta name="loc:searchNoResults" content="No results for &quot;{query}&quot;">
<meta name="loc:tocFilter" content="Filter by title">
<meta name="loc:nextArticle" content="Next">
<meta name="loc:prevArticle" content="Previous">
<meta name="loc:themeLight" content="Light">
<meta name="loc:themeDark" content="Dark">
<meta name="loc:themeAuto" content="Auto">
<meta name="loc:changeTheme" content="Change theme">
<meta name="loc:copy" content="Copy">
<meta name="loc:downloadPdf" content="Download PDF">
<script type="module" src="./../../public/docfx.min.js"></script>
<script>
const theme = localStorage.getItem('theme') || 'auto'
document.documentElement.setAttribute('data-bs-theme', theme === 'auto' ? (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light') : theme)
</script>
</head>
<body class="tex2jax_ignore" data-layout="" data-yaml-mime="">
<header class="bg-body border-bottom">
<nav id="autocollapse" class="navbar navbar-expand-md" role="navigation">
<div class="container-xxl flex-nowrap">
<a class="navbar-brand" href="../../index.html">
<img id="logo" class="svg" src="../../img/HiAPI.logo.png" alt="">
</a>
<button class="btn btn-lg d-md-none border-0" type="button" data-bs-toggle="collapse" data-bs-target="#navpanel" aria-controls="navpanel" aria-expanded="false" aria-label="Toggle navigation">
<i class="bi bi-three-dots"></i>
</button>
<div class="collapse navbar-collapse" id="navpanel">
<div id="navbar">
<form class="search" role="search" id="search">
<i class="bi bi-search"></i>
<input class="form-control" id="search-query" type="search" disabled placeholder="Search" autocomplete="off" aria-label="Search">
</form>
</div>
</div>
</div>
</nav>
</header>
<main class="container-xxl">
<div class="toc-offcanvas">
<div class="offcanvas-md offcanvas-start" tabindex="-1" id="tocOffcanvas" aria-labelledby="tocOffcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="tocOffcanvasLabel">Table of Contents</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#tocOffcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<nav class="toc" id="toc"></nav>
</div>
</div>
</div>
<div class="content">
<div class="actionbar">
<button class="btn btn-lg border-0 d-md-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#tocOffcanvas" aria-controls="tocOffcanvas" aria-expanded="false" aria-label="Show table of contents">
<i class="bi bi-list"></i>
</button>
<nav id="breadcrumb"></nav>
</div>
<article data-uid="Technique-MeshResolution">
<h1 id="mesh-resolution">Mesh Resolution</h1>
<p><a class="xref" href="../../api/Hi.MachiningProcs.SessionShell.html#Hi_MachiningProcs_SessionShell_MachiningResolution_mm">MachiningResolution_mm</a> is the edge length of the cubes the
workpiece is built from, and it is the single largest lever on how long a simulation takes. It is
also the setting most often set once and forgotten, which is expensive in both directions: too
fine and a run that should take minutes takes hours, too coarse and a feature the program is
supposed to cut is not there to be cut.</p>
<h2 id="choosing-a-value">Choosing a Value</h2>
<p>Work coarse first. An early run answers questions — does the path collide, is the force roughly
where it should be, does the optimizer have room — that do not need a fine mesh, and it answers
them in a fraction of the time. Refine only for the final optimization pass, where the geometry
that comes out is the deliverable.</p>
<p>As a planning figure, a simulation run takes somewhere between <strong>2% and 150% of the actual
machining time</strong>, spanning that whole range depending on the mesh and the step count. That is
wide because it is genuinely a choice, not a property of the machine.</p>
<p>Where the time actually goes, and which of the two costs is currently the bottleneck, is in
<a href="cpu-usage.html">CPU Usage During Simulation</a>. The short version: at the fine resolutions real NC
work needs, geometry removal dominates and a finer mesh is much slower; once the mesh is coarse
enough that removal is cheap, the per-step costs dominate and coarsening further buys nothing.</p>
<h2 id="what-value-you-actually-get">What Value You Actually Get</h2>
<p>The number you type is a request, not the width. The workpiece is carved out of a cube grid that
starts from one fixed root cube and is halved level by level, so every width the engine can
actually build is a power of two in millimetres:</p>
<pre><code>... 2 - 1 - 0.5 - 0.25 - 0.125 - 0.0625 - 0.03125 ...
</code></pre>
<p>A request that is not one of those is rounded <strong>to the next finer one</strong>, never to a coarser one,
so the mesh you get is never worse than the mesh you asked for. The consequence worth knowing is
that a value chosen off the ladder buys nothing:</p>
<table>
<thead>
<tr>
<th>Requested</th>
<th>Actually built</th>
</tr>
</thead>
<tbody>
<tr>
<td>0.5</td>
<td>0.5</td>
</tr>
<tr>
<td>0.4</td>
<td>0.25</td>
</tr>
<tr>
<td>0.3</td>
<td>0.25</td>
</tr>
<tr>
<td>0.25</td>
<td>0.25</td>
</tr>
<tr>
<td>0.2</td>
<td>0.125</td>
</tr>
<tr>
<td>0.125</td>
<td>0.125</td>
</tr>
</tbody>
</table>
<p><strong>0.4 mm and 0.25 mm produce the same mesh, at the same cost.</strong> 0.4 is 0.25 wearing a misleading
label: it reads as a coarse, cheap setting and runs as a fine, expensive one. If 0.25 mm is finer
than the run needs, the next value that changes anything is 0.5 mm — and going the other way,
0.125 mm is another eight times the voxels, not a small step.</p>
<p>The ladder bottoms out at <strong>0.001953125 mm</strong>. A finer request is clamped to it, so the finest entry
offered in the workpiece's Initial Resolution list builds the same mesh as the one above it.</p>
<h2 id="the-width-only-ever-goes-finer">The width only ever goes finer</h2>
<p>A mesh that exists cannot be coarsened. Every cut takes the <strong>finer</strong> of the width already built and
the width being asked for, so raising Machining Resolution above the mesh the workpiece was built at
does not simplify anything — the request is dropped and the run keeps the mesh it has.</p>
<p>This is why the two settings are not interchangeable. The workpiece's <strong>Initial Resolution</strong> is what
builds the mesh and is therefore the memory setting; <strong>Machining Resolution</strong> gates how fine a
<em>newly cut</em> surface may go, and can only ever refine. To make a run cheaper in memory, coarsen the
Initial Resolution — coarsening Machining Resolution alone changes nothing about the stock that is
already there.</p>
<p>It still changes the <em>time</em>, and by a lot, because the same number sizes two other things: the
tessellation of the cutter's own solid, and the number of engagement layers per step. Both are
per-step work that is thrown away again, so a coarser Machining Resolution can cut the run time
several-fold while the memory figure does not move at all. A run that got faster without getting
smaller is this, not a mystery.</p>
<p>Pick from the ladder and the number shown in the mission row is the number the run used. That
matters beyond tidiness: a recorded mesh is built at whatever resolution is in force when the
record runs, so an off-ladder value is silently baked into the cache as its rounded neighbour.</p>
<h2 id="what-it-costs-in-memory">What It Costs in Memory</h2>
<p>Far less than it costs in time, which is the opposite of what four rungs of the ladder — sixteen
times finer, and so four thousand times the voxels — leads most people to expect. Measured by
sweeping one case across five rungs with the program and the step count held fixed — a cylindrical
blank, one roughing program, 199,242 steps every run:</p>
<table>
<thead>
<tr>
<th>Mesh width</th>
<th>Play time</th>
<th>Process memory outside the managed heap</th>
</tr>
</thead>
<tbody>
<tr>
<td>2 mm</td>
<td>10.5 s</td>
<td>665 MB</td>
</tr>
<tr>
<td>1 mm</td>
<td>15.3 s</td>
<td>688 MB</td>
</tr>
<tr>
<td>0.5 mm</td>
<td>31.2 s</td>
<td>722 MB</td>
</tr>
<tr>
<td>0.25 mm</td>
<td>76.6 s</td>
<td>826 MB</td>
</tr>
<tr>
<td>0.125 mm</td>
<td>242.9 s</td>
<td>1,456 MB</td>
</tr>
</tbody>
</table>
<p>Sixteen times finer costs <strong>23 times the time and 2.2 times the memory</strong>. Two things flatten that
second column, and it is worth separating them:</p>
<ul>
<li><strong>Most of the figure is a baseline the mesh does not set.</strong> The coarsest run in the sweep already
sits at 665 MB, and the whole sixteen-fold refinement adds 791 MB on top of it. Read the column as
increments rather than as totals: the ratio at the bottom of the table is diluted by everything in
the figure that would be there at any mesh width.</li>
<li><strong>The increments grow slowly at coarse widths and then accelerate.</strong> Halving the width added
23 MB, then 34, then 104, then 630 — each increment about 1.5, then 3.1, then 6.1 times the one
before it, a local exponent climbing from roughly 0.6 to 2.6. A cube stops subdividing as soon as
the surface inside it is a single flat facet, so while the mesh is coarser than the part's facets
and curvature, refining mostly buys nothing. The volume-scaling intuition is not wrong; it only
arrives once the width is below the feature scale, and by then it arrives fast.</li>
</ul>
<p>A big <em>workpiece</em> moves the same curve up: where the stock is a large imported solid rather than a
small procedural blank, there is far more surface to subdivide and the mesh-dependent part dominates
much earlier.</p>
<p><strong>Do not judge the mesh by the process's peak memory.</strong> On a long run most of that figure is the
per-step data the run accumulates, which lives on the managed heap, scales with the number of steps
and not with the mesh at all — and it moves the <em>other</em> way when the mesh is refined, because a
slower run allocates more slowly and the collector commits less. The two cancel: measured on a
larger case across a four-fold refinement, peak memory fell slightly while the mesh's own footprint
grew by nearly 40%. Read the two apart before concluding anything.</p>
<h2 id="what-the-mesh-does-not-change">What the Mesh Does Not Change</h2>
<p>For a representative test case — downward circular slot milling with varying width and depth —
the <strong>physical</strong> values move within about <strong>20%</strong> across the full range of mesh widths. The
simulated forces, torques and temperatures from a coarse first pass are therefore already
informative; they do not become a different answer when the mesh is refined.</p>
<p>The visible geometry is a different matter, and it is what the three runs below show. Workpiece
70 × 50 × 50 mm:</p>
<p><img src="mesh-resolution-img/mesh-width-0125.png" alt="Mesh width 0.125 mm">
Mesh width 0.125 mm</p>
<p><img src="mesh-resolution-img/mesh-width-05.jpg" alt="Mesh width 0.5 mm">
Mesh width 0.5 mm</p>
<p><img src="mesh-resolution-img/mesh-width-1.png" alt="Mesh width 1 mm">
Mesh width 1 mm</p>
<h2 id="the-failure-mode-worth-knowing">The Failure Mode Worth Knowing</h2>
<p><strong>A thin shell thinner than the mesh width can disappear entirely.</strong> The test case above has no
thin shell, which is why its physical values are so insensitive; a part that does have one behaves
differently, because the material the cutter should be meeting is not represented at all. Where
the workpiece has a wall, web or floor thinner than the mesh width, the mesh must be finer than
that feature before the run says anything about it.</p>
<p>The related and much smaller effect is quantization ripple in the per-step ratios, which a finer
mesh reduces — see <a class="xref" href="../milling-physics/machinability.html">Process Machinability</a>.</p>
<h2 id="see-also">See Also</h2>
<ul>
<li><a href="cpu-usage.html">CPU Usage During Simulation</a> — which of the two cost drivers a given mesh width puts in the way</li>
<li><a class="xref" href="../milling-physics/machinability.html">Process Machinability</a> — the mesh-quantization ripple in the availability ratios, and why it is an artifact rather than a signal</li>
<li><a href="../../manual/setup/workpiece.html">Workpiece</a> — where the initial resolution is set, on the branch carrying the stock it applies to</li>
</ul>
</article>
<div class="contribution d-print-none">
</div>
<div class="next-article d-print-none border-top" id="nextArticle"></div>
</div>
<div class="affix">
<nav id="affix"></nav>
</div>
</main>
<div class="container-xxl search-results" id="search-results"></div>
<footer class="border-top text-secondary">
<div class="container-xxl">
<div class="flex-fill">
<span> Copyright © 2025 <a href='https://superhightech.com.tw'>Tech Coordinate</a>. All rights reserved. <a href='https://superhightech.com.tw'>超級高科技股份有限公司</a> © 2025 版權所有 </span>
</div>
</div>
</footer>
</body>
</html>