1<!DOCTYPE html> 2<html lang="en-us"> 3 <head><meta charset='utf-8'> 4<meta name='viewport' content='width=device-width, initial-scale=1'><meta name='description' content='ä»å¤©ççæ¼è®²æ¯å ³äºæ°æ®é©±å¨è®¾è®¡ï¼ Data-oriented Design, DoD ï¼çï¼ç令æå¤§å¼ç¼çãè¿ä¸ªè®¾è®¡æè·¯çæ§è½æ¶çå¾é«ï¼å¯è¯»æ§ä¹å¾å¥½ï¼å®å¨åºè¯¥æ¾ä¸ªæºä¼ç ç è½å®å°å·¥ä½ä¸ã 5Vittorioçæ¼è®²é£æ ¼æºå¹²ç»çï¼talk is cheapï¼å ¨ç¨å´ç»ä¸ä¸ªå°Demoæ¥æ¼ç»å¦ä½éè¿DoDå®ç°å·¨å¤§çæ§è½ä¼åã 61 ä¸ä¸ªç®åçDemo Demoæ¯ä¸ä¸ªç®åçåºæ¯æ¨¡æï¼è¦æ±å¨å±å¹ä¸é£è¿ä¸äº å¯ä»¥å·å°ç²å ç ç«ç® ï¼å¹¶ä¸ºäºæ´å è´´è¿å®é ï¼éå äºå ç¹éæ±ï¼ 7è¿å¨æ¨¡æï¼ç«ç®éè¦æ¨¡æåºä½ç½®ãé度ãå éåº¦ç ææï¼ä¸åç±»åçç²åååå°å¨ï¼æ¯æèªå®ä¹åæ°ï¼éæåº¦ã大å°ãæè½¬è§çï¼ å®ä½ï¼ä¸ºäºä¾¿äºæ§å¶å个å®ä½ï¼ç论ä¸å¯ä»¥å»ºæ¨¡ä¸ºä¾å¦ç«ç®+åå°å¨ æ©å±æ§ï¼ä¾¿äºå¢å æ°çå®ä½æææ ä¸ä¸ªç®åçå»ºæ¨¡ä¼æ¯è¿æ ·çï¼å ¶ä¸æ·±èè²ä¸ºå®ä½ç±»ï¼æµ èè²ä¸ºæ½è±¡ç±»ï¼ï¼ 8åºæ¯ä¸ææçå¯¹è±¡é½æ¯ä¸ä¸ª å®ä½ Entity åå°å¨åç²åå¯ä»¥æä¸åç±»åï¼å¦ç«ç°åå°å¨&çé¾åå°å¨ï¼å¯¹åºç«ç°ç²å&çé¾ç²å 对象çå®ç°å¯è½æ¯è¿æ ·çï¼ç»å个人çè§£ï¼å¯¹å£°æé¡ºåºè¿è¡äºè°æ´ï¼ä»¥ä¾¿åç°æè·¯ï¼å ¶ä½ä»£ç ç»èå䏿¼è®²ä¿æä¸è´ï¼ï¼ 9struct Entity { // 1 é¦å å®ä½å¨æä»¬çè®¾è®¡ä¸æ¯ä¸ä¸ªæ½è±¡ç±»ï¼é常éè¦èææå½æ° virtual ~Entity() = default; // 2 å®ä½éè¦éµå¾ªç©çè§å¾ï¼å æ¤æä¾ä¸äºç©ç屿§ï¼ä½ç½®ãé度ãå éåº¦ï¼ sf::Vector2f position; sf::Vector2f velocity; sf::Vector2f acceleration; // 3 å®ä½éè¦æ´æ°å渲æ virtual void update(float dt) { position += velocity * dt; velocity += acceleration * dt; } virtual void draw(sf::RenderTarget&); // 4 å®ä½éè¦æç¥å«çå®ä½ï¼å æ¤ä¼å¼ç¨ä¸ç对象ï¼åæ¶ï¼åè¯ä¸çèªèº«æ¯å¦è¿åæ´» World& world; bool alive = true; }; ç²åçå®ç°ï¼å¨å®ä½åºç¡ä¸å¢å äºå¤§å°ãéæåº¦åæè½¬è§ï¼åæ¶å½éæåº¦é为 0 æ¶ï¼ä¼èªå¨éæ¯ï¼ 10'><title>ãcppcon25ãPratical Data-Oriented Design in C++</title> 11 12<link rel='canonical' href='https://xrg.fj.cn/p/cppcon25pratical-data-oriented-design-in-c-/'> 13 14<link rel="stylesheet" href="/scss/style.min.744aa3042babb8291bcb36af694eb272f909f9b1e9c66387395b00d22da84726.css">
14<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
14 15
16<script> 17 18 $(window).scroll(function() { 19 if ($(this).scrollTop()) { 20 $('#back-to-top').fadeIn(); 21 } else { 22 $('#back-to-top').fadeOut(); 23 } 24 }); 25 26 27 $('#back-to-top').click(function() { 28 $('html, body').animate({scrollTop: 0}, 1000); 29 return false; 30 }); 31</script>
31 32 33<meta property='og:title' content='ãcppcon25ãPratical Data-Oriented Design in C++'> 34<meta property='og:description' content='ä»å¤©ççæ¼è®²æ¯å ³äºæ°æ®é©±å¨è®¾è®¡ï¼ Data-oriented Design, DoD ï¼çï¼ç令æå¤§å¼ç¼çãè¿ä¸ªè®¾è®¡æè·¯çæ§è½æ¶çå¾é«ï¼å¯è¯»æ§ä¹å¾å¥½ï¼å®å¨åºè¯¥æ¾ä¸ªæºä¼ç ç è½å®å°å·¥ä½ä¸ã 35Vittorioçæ¼è®²é£æ ¼æºå¹²ç»çï¼talk is cheapï¼å ¨ç¨å´ç»ä¸ä¸ªå°Demoæ¥æ¼ç»å¦ä½éè¿DoDå®ç°å·¨å¤§çæ§è½ä¼åã 361 ä¸ä¸ªç®åçDemo Demoæ¯ä¸ä¸ªç®åçåºæ¯æ¨¡æï¼è¦æ±å¨å±å¹ä¸é£è¿ä¸äº å¯ä»¥å·å°ç²å ç ç«ç® ï¼å¹¶ä¸ºäºæ´å è´´è¿å®é ï¼éå äºå ç¹éæ±ï¼ 37è¿å¨æ¨¡æï¼ç«ç®éè¦æ¨¡æåºä½ç½®ãé度ãå éåº¦ç ææï¼ä¸åç±»åçç²åååå°å¨ï¼æ¯æèªå®ä¹åæ°ï¼éæåº¦ã大å°ãæè½¬è§çï¼ å®ä½ï¼ä¸ºäºä¾¿äºæ§å¶å个å®ä½ï¼ç论ä¸å¯ä»¥å»ºæ¨¡ä¸ºä¾å¦ç«ç®+åå°å¨ æ©å±æ§ï¼ä¾¿äºå¢å æ°çå®ä½æææ ä¸ä¸ªç®åçå»ºæ¨¡ä¼æ¯è¿æ ·çï¼å ¶ä¸æ·±èè²ä¸ºå®ä½ç±»ï¼æµ èè²ä¸ºæ½è±¡ç±»ï¼ï¼ 38åºæ¯ä¸ææçå¯¹è±¡é½æ¯ä¸ä¸ª å®ä½ Entity åå°å¨åç²åå¯ä»¥æä¸åç±»åï¼å¦ç«ç°åå°å¨&çé¾åå°å¨ï¼å¯¹åºç«ç°ç²å&çé¾ç²å 对象çå®ç°å¯è½æ¯è¿æ ·çï¼ç»å个人çè§£ï¼å¯¹å£°æé¡ºåºè¿è¡äºè°æ´ï¼ä»¥ä¾¿åç°æè·¯ï¼å ¶ä½ä»£ç ç»èå䏿¼è®²ä¿æä¸è´ï¼ï¼ 39struct Entity { // 1 é¦å å®ä½å¨æä»¬çè®¾è®¡ä¸æ¯ä¸ä¸ªæ½è±¡ç±»ï¼é常éè¦èææå½æ° virtual ~Entity() = default; // 2 å®ä½éè¦éµå¾ªç©çè§å¾ï¼å æ¤æä¾ä¸äºç©ç屿§ï¼ä½ç½®ãé度ãå éåº¦ï¼ sf::Vector2f position; sf::Vector2f velocity; sf::Vector2f acceleration; // 3 å®ä½éè¦æ´æ°å渲æ virtual void update(float dt) { position += velocity * dt; velocity += acceleration * dt; } virtual void draw(sf::RenderTarget&); // 4 å®ä½éè¦æç¥å«çå®ä½ï¼å æ¤ä¼å¼ç¨ä¸ç对象ï¼åæ¶ï¼åè¯ä¸çèªèº«æ¯å¦è¿åæ´» World& world; bool alive = true; }; ç²åçå®ç°ï¼å¨å®ä½åºç¡ä¸å¢å äºå¤§å°ãéæåº¦åæè½¬è§ï¼åæ¶å½éæåº¦é为 0 æ¶ï¼ä¼èªå¨éæ¯ï¼ 40'> 41<meta property='og:url' content='https://xrg.fj.cn/p/cppcon25pratical-data-oriented-design-in-c-/'> 42<meta property='og:site_name' content='XR_G's Blog'> 43<meta property='og:type' content='article'><meta property='article:section' content='Post' /><meta property='article:tag' content='ææ¯' /><meta property='article:published_time' content='2025-09-27T00:00:00+00:00'/><meta property='article:modified_time' content='2025-09-27T00:00:00+00:00'/> 44<meta name="twitter:title" content="ãcppcon25ãPratical Data-Oriented Design in C++"> 45<meta name="twitter:description" content="ä»å¤©ççæ¼è®²æ¯å ³äºæ°æ®é©±å¨è®¾è®¡ï¼ Data-oriented Design, DoD ï¼çï¼ç令æå¤§å¼ç¼çãè¿ä¸ªè®¾è®¡æè·¯çæ§è½æ¶çå¾é«ï¼å¯è¯»æ§ä¹å¾å¥½ï¼å®å¨åºè¯¥æ¾ä¸ªæºä¼ç ç è½å®å°å·¥ä½ä¸ã 46Vittorioçæ¼è®²é£æ ¼æºå¹²ç»çï¼talk is cheapï¼å ¨ç¨å´ç»ä¸ä¸ªå°Demoæ¥æ¼ç»å¦ä½éè¿DoDå®ç°å·¨å¤§çæ§è½ä¼åã 471 ä¸ä¸ªç®åçDemo Demoæ¯ä¸ä¸ªç®åçåºæ¯æ¨¡æï¼è¦æ±å¨å±å¹ä¸é£è¿ä¸äº å¯ä»¥å·å°ç²å ç ç«ç® ï¼å¹¶ä¸ºäºæ´å è´´è¿å®é ï¼éå äºå ç¹éæ±ï¼ 48è¿å¨æ¨¡æï¼ç«ç®éè¦æ¨¡æåºä½ç½®ãé度ãå éåº¦ç ææï¼ä¸åç±»åçç²åååå°å¨ï¼æ¯æèªå®ä¹åæ°ï¼éæåº¦ã大å°ãæè½¬è§çï¼ å®ä½ï¼ä¸ºäºä¾¿äºæ§å¶å个å®ä½ï¼ç论ä¸å¯ä»¥å»ºæ¨¡ä¸ºä¾å¦ç«ç®+åå°å¨ æ©å±æ§ï¼ä¾¿äºå¢å æ°çå®ä½æææ ä¸ä¸ªç®åçå»ºæ¨¡ä¼æ¯è¿æ ·çï¼å ¶ä¸æ·±èè²ä¸ºå®ä½ç±»ï¼æµ èè²ä¸ºæ½è±¡ç±»ï¼ï¼ 49åºæ¯ä¸ææçå¯¹è±¡é½æ¯ä¸ä¸ª å®ä½ Entity åå°å¨åç²åå¯ä»¥æä¸åç±»åï¼å¦ç«ç°åå°å¨&çé¾åå°å¨ï¼å¯¹åºç«ç°ç²å&çé¾ç²å 对象çå®ç°å¯è½æ¯è¿æ ·çï¼ç»å个人çè§£ï¼å¯¹å£°æé¡ºåºè¿è¡äºè°æ´ï¼ä»¥ä¾¿åç°æè·¯ï¼å ¶ä½ä»£ç ç»èå䏿¼è®²ä¿æä¸è´ï¼ï¼ 50struct Entity { // 1 é¦å å®ä½å¨æä»¬çè®¾è®¡ä¸æ¯ä¸ä¸ªæ½è±¡ç±»ï¼é常éè¦èææå½æ° virtual ~Entity() = default; // 2 å®ä½éè¦éµå¾ªç©çè§å¾ï¼å æ¤æä¾ä¸äºç©ç屿§ï¼ä½ç½®ãé度ãå éåº¦ï¼ sf::Vector2f position; sf::Vector2f velocity; sf::Vector2f acceleration; // 3 å®ä½éè¦æ´æ°å渲æ virtual void update(float dt) { position += velocity * dt; velocity += acceleration * dt; } virtual void draw(sf::RenderTarget&); // 4 å®ä½éè¦æç¥å«çå®ä½ï¼å æ¤ä¼å¼ç¨ä¸ç对象ï¼åæ¶ï¼åè¯ä¸çèªèº«æ¯å¦è¿åæ´» World& world; bool alive = true; }; ç²åçå®ç°ï¼å¨å®ä½åºç¡ä¸å¢å äºå¤§å°ãéæåº¦åæè½¬è§ï¼åæ¶å½éæåº¦é为 0 æ¶ï¼ä¼èªå¨éæ¯ï¼ 51"> 52 <link rel="shortcut icon" href="/favicon.ico" /> 53 54 </head> 55 <body class=" 56 article-page has-toc 57"> 58 <div id="loading-box"> 59 60 <div class="loading-left-bg"></div> 61 <div class="loading-right-bg"></div> 62 63 <div class="spinner-box"> 64 <div class="configure-border-1"> 65 <div class="configure-core"></div> 66 </div> 67 <div class="configure-border-2"> 68 <div class="configure-core"></div> 69 </div> 70 <div class="loading-word">å è½½ä¸...</div> 71 </div> 72 </div> 73 74
74<script> 75 $(document).ready(function () { 76 77 document.getElementById('loading-box').classList.add("loaded") 78 }) 79 </script>
79 80 81
81<script> 82 (function() { 83 const colorSchemeKey = 'StackColorScheme'; 84 if(!localStorage.getItem(colorSchemeKey)){ 85 localStorage.setItem(colorSchemeKey, "auto"); 86 } 87 })(); 88 </script>
88<script> 89 (function() { 90 const colorSchemeKey = 'StackColorScheme'; 91 const colorSchemeItem = localStorage.getItem(colorSchemeKey); 92 const supportDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches === true; 93 94 if (colorSchemeItem == 'dark' || colorSchemeItem === 'auto' && supportDarkMode) { 95 96 97 document.documentElement.dataset.scheme = 'dark'; 98 } else { 99 document.documentElement.dataset.scheme = 'light'; 100 } 101 })(); 102</script>
102 103<div class="container main-container flex 104 105 extended 106 107"> 108 109 <div id="article-toolbar"> 110 <a href="/" class="back-home"> 111 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-left" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 112 <path stroke="none" d="M0 0h24v24H0z"/> 113 <polyline points="15 6 9 12 15 18" /> 114</svg> 115 116 117 118 <span>è¿å</span> 119 </a> 120 </div> 121 122<main class="main full-width"> 123 <article class="main-article"> 124 <header class="article-header"> 125 126 <div class="article-details"> 127 128 129 <h2 class="article-title"> 130 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/">ãcppcon25ãPratical Data-Oriented Design in C++</a> 131 </h2> 132 133 134 135 136 <footer class="article-time"> 137 138 <div> 139 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-calendar-time" width="56" height="56" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 140 <path stroke="none" d="M0 0h24v24H0z"/> 141 <path d="M11.795 21h-6.795a2 2 0 0 1 -2 -2v-12a2 2 0 0 1 2 -2h12a2 2 0 0 1 2 2v4" /> 142 <circle cx="18" cy="18" r="4" /> 143 <path d="M15 3v4" /> 144 <path d="M7 3v4" /> 145 <path d="M3 11h16" /> 146 <path d="M18 16.496v1.504l1 1" /> 147</svg> 148 <time class="article-time--published">Sep 27, 2025</time> 149 </div> 150 151 <div> 152 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-clock" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 153 <path stroke="none" d="M0 0h24v24H0z"/> 154 <circle cx="12" cy="12" r="9" /> 155 <polyline points="12 7 12 12 15 15" /> 156</svg> 157 158 159 160 <time class="article-time--reading"> 161 é 读æ¶é¿: 6 åé 162 </time> 163 </div> 164 165 </footer> 166 167</div> 168</header> 169 170 <section class="article-content"> 171 <p>ä»å¤©ççæ¼è®²æ¯å ³äºæ°æ®é©±å¨è®¾è®¡ï¼ <em>Data-oriented Design, DoD</em> ï¼çï¼ç令æå¤§å¼ç¼çãè¿ä¸ªè®¾è®¡æè·¯çæ§è½æ¶çå¾é«ï¼å¯è¯»æ§ä¹å¾å¥½ï¼å®å¨åºè¯¥æ¾ä¸ªæºä¼ç ç è½å®å°å·¥ä½ä¸ã</p> 172<p>Vittorioçæ¼è®²é£æ ¼æºå¹²ç»çï¼talk is cheapï¼å ¨ç¨å´ç»ä¸ä¸ªå°Demoæ¥æ¼ç»å¦ä½éè¿DoDå®ç°å·¨å¤§çæ§è½ä¼åã</p> 173<h3 id="1-ä¸ä¸ªç®åçdemo">1 ä¸ä¸ªç®åçDemo</h3> 174<p>Demoæ¯ä¸ä¸ªç®åçåºæ¯æ¨¡æï¼è¦æ±å¨å±å¹ä¸é£è¿ä¸äº <em>å¯ä»¥å·å°ç²å</em> ç <em>ç«ç®</em> ï¼å¹¶ä¸ºäºæ´å è´´è¿å®é ï¼éå äºå ç¹éæ±ï¼</p> 175<ul> 176<li>è¿å¨æ¨¡æï¼ç«ç®éè¦æ¨¡æåºä½ç½®ãé度ãå é度ç</li> 177<li>ææï¼ä¸åç±»åçç²åååå°å¨ï¼æ¯æèªå®ä¹åæ°ï¼éæåº¦ã大å°ãæè½¬è§çï¼</li> 178<li>å®ä½ï¼ä¸ºäºä¾¿äºæ§å¶å个å®ä½ï¼ç论ä¸å¯ä»¥å»ºæ¨¡ä¸ºä¾å¦ç«ç®+åå°å¨</li> 179<li>æ©å±æ§ï¼ä¾¿äºå¢å æ°çå®ä½æææ</li> 180</ul> 181<p><figure 182 183 class="gallery-image" 184 style=" 185 flex-grow: 137; 186 flex-basis: 329px" 187 > 188 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/1.png" data-size="1067x778"> 189 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/1.png" 190 width="1067" 191 height="778" 192 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/1_hu5410305169650136899.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/1_hu10257298369898371339.png 1024w" 193 loading="lazy" 194 > 195 </a> 196 197</figure></p> 198<p>ä¸ä¸ªç®åçå»ºæ¨¡ä¼æ¯è¿æ ·çï¼å ¶ä¸æ·±èè²ä¸ºå®ä½ç±»ï¼æµ èè²ä¸ºæ½è±¡ç±»ï¼ï¼</p> 199<p><figure 200 201 class="gallery-image" 202 style=" 203 flex-grow: 181; 204 flex-basis: 436px" 205 > 206 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/2.png" data-size="1502x826"> 207 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/2.png" 208 width="1502" 209 height="826" 210 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/2_hu2386365465619707563.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/2_hu17582678550926521366.png 1024w" 211 loading="lazy" 212 > 213 </a> 214 215</figure></p> 216<ul> 217<li>åºæ¯ä¸ææçå¯¹è±¡é½æ¯ä¸ä¸ª <em>å®ä½</em> <code>Entity</code></li> 218<li>åå°å¨åç²åå¯ä»¥æä¸åç±»åï¼å¦ç«ç°åå°å¨&çé¾åå°å¨ï¼å¯¹åºç«ç°ç²å&çé¾ç²å</li> 219</ul> 220<p>对象çå®ç°å¯è½æ¯è¿æ ·çï¼ç»å个人çè§£ï¼å¯¹å£°æé¡ºåºè¿è¡äºè°æ´ï¼ä»¥ä¾¿åç°æè·¯ï¼å ¶ä½ä»£ç ç»èå䏿¼è®²ä¿æä¸è´ï¼ï¼</p> 221<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Entity</span> <span class="p">{</span> 222</span></span><span class="line"><span class="cl"> <span class="c1">// 1 é¦å å®ä½å¨æä»¬çè®¾è®¡ä¸æ¯ä¸ä¸ªæ½è±¡ç±»ï¼é常éè¦èææå½æ° 223</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">virtual</span> <span class="o">~</span><span class="n">Entity</span><span class="p">()</span> <span class="o">=</span> <span class="k">default</span><span class="p">;</span> 224</span></span><span class="line"><span class="cl"> 225</span></span><span class="line"><span class="cl"> <span class="c1">// 2 å®ä½éè¦éµå¾ªç©çè§å¾ï¼å æ¤æä¾ä¸äºç©ç屿§ï¼ä½ç½®ãé度ãå éåº¦ï¼ 226</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">position</span><span class="p">;</span> 227</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">velocity</span><span class="p">;</span> 228</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">acceleration</span><span class="p">;</span> 229</span></span><span class="line"><span class="cl"> 230</span></span><span class="line"><span class="cl"> <span class="c1">// 3 å®ä½éè¦æ´æ°å渲æ 231</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">virtual</span> <span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> 232</span></span><span class="line"><span class="cl"> <span class="p">{</span> 233</span></span><span class="line"><span class="cl">
233 <span class="n">position</span> <span class="o">+=</span> <span class="n">velocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 234</span></span><span class="line"><span class="cl"> <span class="n">velocity</span> <span class="o">+=</span> <span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 235</span></span><span class="line"><span class="cl"> <span class="p">}</span> 236</span></span><span class="line"><span class="cl"> <span class="k">virtual</span> <span class="kt">void</span> <span class="nf">draw</span><span class="p">(</span><span class="n">sf</span><span class="o">::</span><span class="n">RenderTarget</span><span class="o">&</span><span class="p">);</span> 237</span></span><span class="line"><span class="cl"> 238</span></span><span class="line"><span class="cl"> <span class="c1">// 4 å®ä½éè¦æç¥å«çå®ä½ï¼å æ¤ä¼å¼ç¨ä¸ç对象ï¼åæ¶ï¼åè¯ä¸çèªèº«æ¯å¦è¿åæ´» 239</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">World</span><span class="o">&</span> <span class="n">world</span><span class="p">;</span> 240</span></span><span class="line"><span class="cl"> <span class="kt">bool</span> <span class="n">alive</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span> 241</span></span><span class="line"><span class="cl"><span class="p">};</span> 242</span></span></code></pre></div><p>ç²åçå®ç°ï¼å¨å®ä½åºç¡ä¸å¢å äºå¤§å°ãéæåº¦åæè½¬è§ï¼åæ¶å½éæåº¦é为 <code>0</code> æ¶ï¼ä¼èªå¨éæ¯ï¼</p> 243<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Particle</span> <span class="o">:</span> <span class="n">Entity</span> <span class="p">{</span> 244</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">scale</span><span class="err">ï¼</span> <span class="n">scaleRate</span><span class="p">;</span> 245</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">opacity</span><span class="p">,</span> <span class="n">opacityChange</span><span class="p">;</span> 246</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">rotation</span><span class="p">,</span> <span class="n">angularVelocity</span><span class="p">;</span> 247</span></span><span class="line"><span class="cl"> 248</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> <span class="k">override</span> 249</span></span><span class="line"><span class="cl"> <span class="p">{</span> 250</span></span><span class="line"><span class="cl"> <span class="n">Entity</span><span class="o">::</span><span class="n">update</span><span class="p">(</span><span class="n">dt</span><span class="p">);</span> 251</span></span><span class="line"><span class="cl"> <span class="n">scale</span> <span class="o">+=</span> <span class="n">scaleRate</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 252</span></span><span class="line"><span class="cl"> <span class="n">opacity</span> <span class="o">+=</span> <span class="n">opacityChange</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 253</span></span><span class="line"><span class="cl"> <span class="n">rotation</span> <span class="o">+=</span> <span class="n">angularVelocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 254</span></span><span class="line"><span class="cl"> 255</span></span><span class="line"><span class="cl"> <span class="n">alive</span> <span class="o">=</span> <span class="n">opacity</span> <span class="o">></span> <span class="mf">0.0f</span><span class="p">;</span> 256</span></span><span class="line"><span class="cl"> <span class="p">}</span> 257</span></span><span class="line"><span class="cl"><span class="p">};</span> 258</span></span></code></pre></div><p>å ·ä½ç²åçå®ç°ï¼å¦çé¾ç²åï¼åªæ¯ä½¿ç¨ç¹å®çº¹çå®ç°äºæ¸²æè½åï¼æ¼
258è®²ä¸æ²¡æç»åºå ·ä½å®ç°ï¼</p> 259<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">SmokeParticle</span> <span class="o">:</span> <span class="n">Particle</span> <span class="p">{</span> 260</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">draw</span><span class="p">(</span><span class="n">sf</span><span class="o">::</span><span class="n">RenderTarget</span><span class="o">&</span> <span class="n">target</span><span class="p">)</span> <span class="k">override</span> 261</span></span><span class="line"><span class="cl"> <span class="p">{</span> 262</span></span><span class="line"><span class="cl"> <span class="c1">// ... draw using smoke texture ... 263</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> 264</span></span><span class="line"><span class="cl"><span class="p">};</span> 265</span></span></code></pre></div><p>ææçå®ä½ä¿åå¨ä¸çä¸ï¼ä¸ç对象ä¼ç®¡çææå®ä½ï¼å¹¶è°ç¨æ¯ä¸ªå®ä½çæ´æ°åæ¸²ææ¹æ³ï¼</p> 266<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">World</span> <span class="p">{</span> 267</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">unique_ptr</span><span class="o"><</span><span class="n">Entity</span><span class="o">>></span> <span class="n">entities</span><span class="p">;</span> 268</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> 269</span></span><span class="line"><span class="cl"> <span class="p">{</span> 270</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">entity</span> <span class="p">:</span> <span class="n">entities</span><span class="p">)</span> 271</span></span><span class="line"><span class="cl"> <span class="n">entity</span><span class="o">-></span><span class="n">update</span><span class="p">(</span><span class="n">dt</span><span class="p">);</span> 272</span></span><span class="line"><span class="cl"> <span class="p">}</span> 273</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">draw</span><span class="p">(</span><span class="n">sf</span><span class="o">::</span><span class="n">RenderTarget</span><span class="o">&</span> <span class="n">target</span><span class="p">)</span> 274</span></span><span class="line"><span class="cl"> <span class="p">{</span> 275</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">entity</span> <span class="p">:</span> <span class="n">entities</span><span class="p">)</span> 276</span></span><span class="line"><span class="cl"> <span class="n">entity</span><span class="o">-></span><span class="n">draw</span><span class="p">(</span><span class="n">target</span><span class="p">);</span> 277</span></span><span class="line"><span class="cl"> <span class="p">}</span> 278</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">cleanup</span><span class="p">()</span> 279</span></span><span class="line"><span class="cl"> <span class="p">{</span> 280</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">erase_if</span><span class="p">(</span><span class="n">entities</span><span class="p">,</span> <span class="p">[](</span><span class="k">const</span> <span class="k">auto</span><span class="o">&</span> <span class="n">entity</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="o">!</span><span class="n">entity</span><span class="o">-></span><span class="n">
280alive</span><span class="p">;</span> <span class="p">});</span> 281</span></span><span class="line"><span class="cl"> <span class="p">}</span> 282</span></span><span class="line"><span class="cl"><span class="p">};</span> 283</span></span></code></pre></div><p>åå°å¨çåè½å°±æ¯å®æåå°ç²åï¼èå ·ä½åå°å¨çå®ç°ï¼å¦çé¾åå°å¨ï¼åªæ¯çæä¸ä¸ªç²å对象ï¼å¹¶æ·»å å°ä¸çä¸ï¼</p> 284<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Emitter</span> <span class="o">:</span> <span class="n">Entity</span> <span class="p">{</span> 285</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">spawnTimer</span><span class="p">,</span> <span class="n">spawnRate</span><span class="p">;</span> 286</span></span><span class="line"><span class="cl"> 287</span></span><span class="line"><span class="cl"> <span class="k">virtual</span> <span class="kt">void</span> <span class="nf">spawnParticle</span><span class="p">()</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> 288</span></span><span class="line"><span class="cl"> 289</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> <span class="k">override</span> 290</span></span><span class="line"><span class="cl"> <span class="p">{</span> 291</span></span><span class="line"><span class="cl"> <span class="c1">// ... periodically call `spawnParticle()` ... 292</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> 293</span></span><span class="line"><span class="cl"><span class="p">};</span> 294</span></span><span class="line"><span class="cl"> 295</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">SmokeEmitter</span> <span class="o">:</span> <span class="n">Emitter</span> <span class="p">{</span> 296</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">spawnParticle</span><span class="p">()</span> <span class="k">override</span> 297</span></span><span class="line"><span class="cl"> <span class="p">{</span> 298</span></span><span class="line"><span class="cl"> <span class="c1">// è¿éç代ç åæ¼è®²éç代ç ç¨æä¸åï¼æè®¤ä¸ºè¿ä¸ªå®ç°æå¯¹ 299</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// æ¼è®²ç代ç éæ `world` 彿éç¨ï¼ä½å®é ä¸å¨ Entity çå®ä¹ä¸ï¼ `world` æ¯ä¸ä¸ªå¼ç¨ 300</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">world</span><span class="p">.</span><span class="n">entities</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o"><</span><span class="n">SmokeParticle</span><span class="o">></span><span class="p">());</span> 301</span></span><span class="line"><span class="cl"> <span class="p">}</span> 302</span></span><span class="line"><span class="cl"><span class="p">};</span> 303</span></span></code></pre></div><p>æåä¸ä¸ªå®ä½æ¯ç«ç®ï¼å®ååå°å¨çå ³ç³»æ¯ç»åå ³ç³»ï¼å®çç§»å¨ä¼å¸¦çåå°å¨ç§»å¨ï¼</p> 304<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Rocket</span> <span class="o">:</span> <span class="n">Entity</span> <span class="p">{</span> 305</span></span><span class="line"><span class="cl"> <span class="c1">// å 为è½å¤ä¿è¯çå½å¨æï¼æä»¥è¿é使ç¨è£¸æé 306</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">SmokeEmitter</span> <span class="o">*</span><span class="n">smokeEmitter</span> <span class="o">=</span> <span class="k">nullptr</span><span class="p">;</span> 307</span></span><span class="line"><span class="cl"> <span class="n">FireEmitter</span> <span class="o">*</span><span class="n">fireEmitter</span> <span class="o">=</span> <span class="k">nullptr</span><span class="p">;</span> 308</span></span><span class="line"><span class="cl"> 309</span></span><span class="line"><span class="cl"> <span class="n">Rocket</span><span class="p">()</span> 310</span></span><span class="line"><span class="cl"> <span class="p">{</span> 311</span></span><span class="line"><span class="cl">
311 <span class="c1">// ... create emitters ... 312</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> 313</span></span><span class="line"><span class="cl"> 314</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> <span class="k">override</span> 315</span></span><span class="line"><span class="cl"> <span class="p">{</span> 316</span></span><span class="line"><span class="cl"> <span class="c1">// ... move emitters with rocket ... 317</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span> 318</span></span><span class="line"><span class="cl"><span class="p">};</span> 319</span></span></code></pre></div><blockquote> 320<p>ä¸è¿°çå®ç°æäºå°æ¹ä¹ç¦ä¸èµ·ä¸¥æ ¼æ¨æ²ï¼ä¾å¦ <code>Entity::update</code> å®ç°äºç§»å¨ï¼ä½ <code>Emitter::update</code> è¡ä¸ºåå®çåºç±»å®å ¨ä¸ä¸æ ·â¦ whateverï¼è¿ä¸ªå®ç°è¿æ¯æ¯è¾OOP styleç</p> 321</blockquote> 322<p>ä½è çbenckmarkæµè¯ç»æå¦ä¸ï¼æ¨ªè½´ä¸ºä¸åå®ä½æ°éï¼çºµè½´ä¸ºupdateæ¶èçæ¶é´ï¼</p> 323<p><figure 324 325 class="gallery-image" 326 style=" 327 flex-grow: 179; 328 flex-basis: 430px" 329 > 330 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/3.png" data-size="1522x849"> 331 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/3.png" 332 width="1522" 333 height="849" 334 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/3_hu6696551923100701951.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/3_hu4248200274122669967.png 1024w" 335 loading="lazy" 336 > 337 </a> 338 339</figure></p> 340<p>çä¸å»è¿å¯ä»¥ç表ç°ï¼ä½åèèå°ä¸¤ä¸ªæ°æ®ï¼</p> 341<ul> 342<li><code>60FPS = ~16.67ms</code></li> 343<li><code>144FPS = ~6.94ms</code></li> 344</ul> 345<p>ð²ð¥²ï¼è¿æ ·çæ¥ï¼ä¸ºäºæµç è¿è¡ï¼æ¯ä¸å¸§çç»å¼åè çæ¶é´ççé常çï¼å¸¸è§å®ç°çæ§è½é®é¢é叏乿¾èã</p> 346<h3 id="2-é¢å¤è¯å ååcache">2 é¢å¤è¯ï¼å ååCache</h3> 347<p>è¿ä¸è䏿ç®è·çæ¼è®²è¯¦ç»è®°å½ï¼ä» æå½ä¸äºéè¦çç¹ã</p> 348<ul> 349<li><em>Cache line</em> æ¯æå°çå åä¼ è¾åå ï¼å³ä½¿æä»¬åªéè¦ä¸ä¸ªåèçæ°æ®ï¼å å乿¯æç §æ´è¡è¯»å ¥çï¼å æ¤æ´å®ä½¿ç¨è¿ç»å åï¼ä¸æç §å©äºCPU颿µçæ¹å¼è¿è¡æ°æ®è®¿é®ï¼</li> 350</ul> 351<p><figure 352 353 class="gallery-image" 354 style=" 355 flex-grow: 182; 356 flex-basis: 436px" 357 > 358 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/4.png" data-size="1511x830"> 359 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/4.png" 360 width="1511" 361 height="830" 362 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/4_hu3006604439347195105.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/4_hu11840952683576943485.png 1024w" 363 loading="lazy" 364 > 365 </a> 366 367</figure></p> 368<h3 id="3-oopå®ç°çæ§è½é®é¢åæ">3 OOPå®ç°çæ§è½é®é¢åæ</h3> 369<ol> 370<li>ä¸ç对象ä¸ä½¿ç¨çæ¯å®ä½çæéï¼å³ï¼å åä¸å®ä½çåå¸å¯è½æ¯åæ£çï¼è¿å¯¼è´äºå 乿¯æ¬¡è¿ä»£é½å¯è½äº§çCache Miss</li> 371<li>æ¯æ¬¡è°ç¨å®ä½ç <code>update</code> æ¹æ³é½éè¦è¿è¡è彿°ç卿ååï¼è¿è¡æ¶å¤æï¼ä¾èµèè¡¨æ¥æ¾çæ£çå®ç°ï¼</li> 372<li>è¾å¤çå åç³è¯·/éæ¾</li> 373</ol> 374<p><figure 375 376 class="gallery-image" 377 style=" 378 flex-grow: 179; 379 flex-basis: 430px" 380 > 381 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/5.png" data-size="1518x846"> 382 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/5.png" 383 width="1518" 384 height="846" 385 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/5_hu7351305689579101415.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/5_hu2237564057126370495.png 1024w" 386 loading="lazy" 387 > 388 </a> 389 390</figure></p> 391<h3 id="4-设计å²å¦ç对æ¯">4 设计å²å¦ç对æ¯</h3> 392<p>ä»è®¾è®¡å²å¦æ¥çï¼æåçå®ç°è½ç¶å卿§è½é®é¢ï¼ä½åºæ¬ä¸å·²ç»ç¬¦åOOPç设计å²å¦ï¼</p> 393<p><figure 394 395 class="gallery-image" 396 style=" 397 flex-grow: 180; 398 flex-basis: 432px" 399 > 400 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/6.png" data-size="1507x836"> 401 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/6.png" 402 width="1507" 403 height="836" 404 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/6_hu13626525986782113667.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/6_hu15220238138771443978.png 1024w" 405 loading="lazy" 406 > 407 </a> 408 409</figure></p> 410<ul> 411<li>ä¸çç±å¯¹è±¡ç»æ</li> 412<li>éè¿æ¶æ¯ä¼ éè¿è¡äº¤æµ</li> 413<li>æ´é²è¡ä¸ºãéèæ°æ®</li> 414<li>è§åæªç¥çéæ±</li> 415</ul> 416<blockquote> 417<p>Vittorio说è¿ä¸ª <em>bet</em> ï¼èµæ³¨ï¼ä¸è¯æ¯ä»ç²¾å¿å®æçï¼æä¸å®ç¨åº¦ä¸åæãOOPçåºç±»ï¼æ¯ä¸ä¸ªæ¹æ³é½å¨èµèªå·±å¯¹äºä¸ççæè¿°æ¯æ£ç¡®çï¼åç»æ©å±åºæ¥çåç±»ï¼æ»¡è¶³åºç±»ç设计åç大欢åï¼ä¸æ»¡è¶³åºç±»çè®¾è®¡åææ³¥å¸¦æ°´å°æ¹å¨ãè¿ä¸æ¯è¯´OOPæ¬èº«æé®é¢ï¼èæ¯å¨å®è·µä¸è¿å¤ªè¿äºèéªå¼å人åç设计水平ï¼è°åè½è¦æ±æ¯ä¸ªäººé½æ¯å¤§proå¢ï¼</p> 418</blockquote> 419<p>ç¸æ¯ä¹ä¸ï¼é¢åæ°æ®ç设计å²å¦å¯è½æ¯è¿æ ·çï¼</p> 420<p><figure 421 422 class="gallery-image" 423 style=" 424 flex-grow: 180; 425 flex-basis: 432px" 426 > 427 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/7.png" data-size="1503x835"> 428 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/7.png" 429 width="1503" 430 height="835" 431 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/7_hu2318994575623631177.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/7_hu17420241732183230488.png 1024w" 432 loading="lazy" 433 > 434 </a> 435 436</figure></p> 437<ul> 438<li>ä¸çç±æ°æ®ç»æï¼ä»£ç çä½ç¨æ¯ææ°æ®ä»ä¸ä¸ªç¶æè½¬æ¢å°å¦ä¸ä¸ªç¶æ</li> 439<li>ç´æ¥æä½æ¹éæ°æ®</li> 440<li>æ´é²æ°æ®ï¼éä¸è¡ä¸º</li> 441<li>è§åå½ä¸</li> 442</ul> 443<p>转åæè·¯çå ³é®ï¼</p> 444<p><figure 445 446 class="gallery-image" 447 style=" 448 flex-grow: 176; 449 flex-basis: 423px"
450 > 451 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/8.png" data-size="1434x812"> 452 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/8.png" 453 width="1434" 454 height="812" 455 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/8_hu10384310888831867967.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/8_hu10081852515287269042.png 1024w" 456 loading="lazy" 457 > 458 </a> 459 460</figure></p> 461<ul> 462<li>认è¯å°ä»£ç çå¯ä¸ä½ç¨å°±æ¯è¿è¡æ°æ®è½¬æ¢</li> 463<li>认è¯å°æ°æ®æ¯æ ¸å¿ï¼è䏿¯éè¦éèèµ·æ¥çä¸è¥¿</li> 464<li>认è¯å°è®¡ç®æºæ´å欢ç®åãå¯é¢æµçå·¥ä½ï¼åè®¡ç®æºæä¾å¤§æ®µè¿ç»çæ°æ®</li> 465<li>认è¯å°è®¾è®¡æå¡äºæºå¨ï¼èéé®é¢ç建模</li> 466</ul> 467<blockquote> 468<p>çç¡®æ¯è¾æ¯èåè©ï¼å°¤å ¶æ¯âDesign for the machineâï¼å®å ¨æ¯å¯¹ä¹ æ¯äºOOPç人çä¸å¤§å²å»</p> 469</blockquote> 470<h3 id="5-对demoçä¼å">5 对Demoçä¼å</h3> 471<h4 id="51-ä¼å1">5.1 ä¼å1</h4> 472<ul> 473<li>é¿å åç¬çå å请æ±ï¼å¹²ææé</li> 474<li>æå¹³æ¶æï¼å¹²æç»§æ¿</li> 475<li>æ°æ®åé»è¾è§£è¦ï¼å®ä½åªæ¯ä¸äºæ°æ®ï¼ä¸çå³å®è¡ä¸º</li> 476<li>å°ä¸åçç±»ååå¨åèªçè¿ç»çæ°ç»ä¸ï¼ä»ä¸ä¸ªåºç±»æéæ°ç»åæ¢å°è¥å¹²å®é å¯¹è±¡çæ°ç»</li> 477</ul> 478<p>talk is cheapï¼</p> 479<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// å½ååå°å¨åç²åéè¦åºåçé¾åç«ç° 480</span></span></span><span class="line"><span class="cl"><span class="c1">// *æä¸* éè¿ä¸ä¸ª `type` 屿§æ¥åºåï¼åé¢ä¼ç»§ç»ä¼å 481</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">enum</span> <span class="k">class</span> <span class="nc">ParticleType</span> <span class="p">{</span> 482</span></span><span class="line"><span class="cl"> <span class="n">Smoke</span><span class="p">,</span> 483</span></span><span class="line"><span class="cl"> <span class="n">Fire</span> 484</span></span><span class="line"><span class="cl"><span class="p">};</span> 485</span></span><span class="line"><span class="cl"> 486</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Emitter</span> <span class="p">{</span> 487</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">position</span><span class="p">;</span> 488</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">velocity</span><span class="p">;</span> 489</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">acceleration</span><span class="p">;</span> 490</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">spawnTimer</span><span class="p">,</span> <span class="n">spawnRate</span><span class="p">;</span> 491</span></span><span class="line"><span class="cl"> 492</span></span><span class="line"><span class="cl"> <span class="n">ParticleType</span> <span class="n">type</span><span class="p">;</span> 493</span></span><span class="line"><span class="cl"><span class="p">};</span> 494</span></span><span class="line"><span class="cl"> 495</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Particle</span> <span class="p">{</span> 496</span></span><span class="line"><span class="cl"> <span class="c1">// æ°æ®ä¹é´ä¸åæç»§æ¿å ³ç³»ï¼å°½ç®¡è¿æ ·ä¼å¸¦æ¥ç©çè¦ç´ çéå¤ï¼ä½æ²¡å¤ªå¤§å ³ç³» 497</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">position</span><span class="p">;</span> 498</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">velocity</span><span class="p">;</span> 499</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">acceleration</span><span class="p">;</span> 500</span></span><span class="line"><span class="cl"> 501</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">scale</span><span class="p">;</span> 502</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">opacity</span><span class="p">;</span> 503</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">rotation</span><span class="p">;</span> 504</span></span><span class="line"><span class="cl"> 505</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">scaleRate</span><span class="p">;</span> 506</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">opacityChange</span><span class="p">;</span> 507</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">rotationVelocity</span><span class="p">;</span> 508</span></span><span class="line"><span class="cl"> 509</span></span><span class="line"><span class="cl"> <span class="n">ParticleType</span> <span class="n">type</span><span class="p">;</span> 510</span></span><span class="line"><span class="cl"><span class="p">};</span> 511</span></span><span class="line"><span class="cl"> 512</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Rocket</span> <span class="p">{</span> 513</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">position</span><span class="p">;</span> 514</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">velocity</span><span class="p">;</span> 515</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">acceleration</span><span class="p">;</span> 516</span></span><span class="line"><span class="cl"> 517</span></span><span class="line"><span class="cl"> <span class="c1">// ç«ç®ä¸åéè¿æéæ¥ç®¡çåå°å¨ï¼èæ¯éè¿ç´¢å¼æ¥å ³è 518</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">
518size_t</span> <span class="n">smokeEmitterIndex</span><span class="p">;</span> 519</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">size_t</span> <span class="n">fireEmitterIndex</span><span class="p">;</span> 520</span></span><span class="line"><span class="cl"><span class="p">};</span> 521</span></span></code></pre></div><p>ä¸ç对象ç°å¨ç®¡çæ°æ®ï¼</p> 522<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">World</span> <span class="p">{</span> 523</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Particle</span><span class="o">></span> <span class="n">particles</span><span class="p">;</span> 524</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Rocket</span><span class="o">></span> <span class="n">rockets</span><span class="p">;</span> 525</span></span><span class="line"><span class="cl"> <span class="c1">// è¦ç¹ï¼ç±äºæä»¬çrocketéè¿ç´¢å¼å ³èåå°å¨ 526</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// å½åå°å¨ç§»é¤ï¼ä¸åºéæå åï¼èåªæ¯å°å¯¹åºæ§½ä½ç½®ä¸ºæ æï¼å æ¤è¿é使ç¨optional 527</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>></span> <span class="n">emitters</span><span class="p">;</span> 528</span></span><span class="line"><span class="cl"> 529</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">addRocket</span><span class="p">(</span><span class="k">const</span> <span class="n">Rocket</span> <span class="o">&</span><span class="n">rocket</span><span class="p">);</span> 530</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">size_t</span> <span class="n">addEmitter</span><span class="p">(</span><span class="k">const</span> <span class="n">Emitter</span> <span class="o">&</span><span class="n">emitter</span><span class="p">);</span> 531</span></span><span class="line"><span class="cl"> 532</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span><span class="err">ï¼</span> 533</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="n">draw</span><span class="p">(</span><span class="n">sf</span><span class="o">::</span><span class="n">RenderTarget</span> <span class="o">&</span><span class="n">target</span><span class="p">);</span> 534</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">cleanup</span><span class="p">();</span> 535</span></span><span class="line"><span class="cl"><span class="p">};</span> 536</span></span></code></pre></div><p>ä¸ç对象ç <code>update</code> æ¹æ³ï¼</p> 537<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">World</span><span class="o">::</span><span class="n">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> 538</span></span><span class="line"><span class="cl"><span class="p">{</span> 539</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">Particle</span> <span class="o">&</span><span class="nl">particle</span> <span class="p">:</span> <span class="n">particles</span><span class="p">)</span> <span class="p">{</span> 540</span></span><span class="line"><span class="cl">
540 <span class="n">particle</span><span class="p">.</span><span class="n">position</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">velocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 541</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">velocity</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 542</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">scale</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">scaleRate</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 543</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">opacity</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">opacityChange</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 544</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">rotation</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">rotationVelocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 545</span></span><span class="line"><span class="cl"> <span class="p">}</span> 546</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">></span> <span class="o">&</span><span class="nl">e</span> <span class="p">:</span> <span class="n">emitters</span><span class="p">)</span> <span class="p">{</span> 547</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">e</span><span class="p">.</span><span class="n">has_value</span><span class="p">())</span> 548</span></span><span class="line"><span class="cl"> <span class="k">continue</span><span class="p">;</span> 549</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">position</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">velocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 550</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">velocity</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 551</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnRate</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 552</span></span><span class="line"><span class="cl"> 553</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(;</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">>=</span> <span class="mf">1.f</span><span class="p">;</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">-=</span> <span class="mf">1.f</span><span class="p">)</span> 554</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">-></span><span class="n">type</span> <span class="o">==</span> <span class="n">ParticleType</span><span class="o">::</span><span class="n">Smoke</span><span class="p">)</span> 555</span></span><span class="line"><span class="cl">
555 <span class="n">particles</span><span class="p">.</span><span class="n">push_back</span><span class="p">({...});</span> 556</span></span><span class="line"><span class="cl"> <span class="k">else</span> <span class="nf">if</span> <span class="p">(</span><span class="n">e</span><span class="o">-></span><span class="n">type</span> <span class="o">==</span> <span class="n">ParticleType</span><span class="o">::</span><span class="n">Fire</span><span class="p">)</span> 557</span></span><span class="line"><span class="cl"> <span class="n">particles</span><span class="p">.</span><span class="n">push_back</span><span class="p">({...});</span> 558</span></span><span class="line"><span class="cl"> 559</span></span><span class="line"><span class="cl"> <span class="p">}</span> 560</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">Rocket</span> <span class="o">&</span><span class="nl">rocket</span> <span class="p">:</span> <span class="n">rockets</span><span class="p">)</span> <span class="p">{</span> 561</span></span><span class="line"><span class="cl"> <span class="n">rocket</span><span class="p">.</span><span class="n">position</span> <span class="o">+=</span> <span class="n">rocket</span><span class="p">.</span><span class="n">velocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 562</span></span><span class="line"><span class="cl"> <span class="n">rocket</span><span class="p">.</span><span class="n">velocity</span> <span class="o">+=</span> <span class="n">rocket</span><span class="p">.</span><span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 563</span></span><span class="line"><span class="cl"> 564</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">></span> <span class="o">&</span><span class="n">se</span> <span class="o">=</span> <span class="n">emitters</span><span class="p">[</span><span class="n">rocket</span><span class="p">.</span><span class="n">smokeEmitterIndex</span><span class="p">])</span> 565</span></span><span class="line"><span class="cl"> <span class="n">se</span><span class="o">-></span><span class="n">position</span> <span class="o">=</span> <span class="n">rocket</span><span class="p">.</span><span class="n">position</span> <span class="o">-</span> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span><span class="p">(</span><span class="mf">12.f</span><span class="p">,</span> <span class="mf">0.f</span><span class="p">);</span> 566</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">></span> <span class="o">&</span><span class="n">fe</span> <span class="o">=</span> <span class="n">emitters</span><span class="p">[</span><span class="n">rocket</span><span class="p">.</span><span class="n">fireEmitterIndex</span><span class="p">])</span> 567</span></span><span class="line"><span class="cl"> <span class="n">fe</span><span class="o">-></span><span class="n">position</span> <span class="o">=</span> <span class="n">rocket</span><span class="p">.</span><span class="n">position</span> <span class="o">-</span> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span><span class="p">(</span><span class="mf">12.f</span><span class="p">,</span> <span class="mf">0.f</span><span class="p">);</span> 568</span></span><span class="line"><span class="cl"> <span class="p">}</span> 569</span></span><span class="line"><span class="cl"><span class="p">}</span> 570</span></span></code></pre></div><p>æ·»å åå°å¨ï¼</p> 571<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">
571size_t</span> <span class="n">World</span><span class="o">::</span><span class="n">addEmitter</span><span class="p">(</span><span class="k">const</span> <span class="n">Emitter</span> <span class="o">&</span><span class="n">emitter</span><span class="p">)</span> 572</span></span><span class="line"><span class="cl"><span class="p">{</span> 573</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">emitters</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> 574</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">emitters</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">has_value</span><span class="p">())</span> <span class="p">{</span> 575</span></span><span class="line"><span class="cl"> <span class="n">emitters</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">emitter</span><span class="p">;</span> 576</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">i</span><span class="p">;</span> 577</span></span><span class="line"><span class="cl"> <span class="p">}</span> 578</span></span><span class="line"><span class="cl"> <span class="n">emitters</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">emitter</span><span class="p">);</span> 579</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">emitters</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> 580</span></span><span class="line"><span class="cl"><span class="p">}</span> 581</span></span></code></pre></div><p>æ¸ çï¼</p> 582<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">World</span><span class="o">::</span><span class="n">cleanup</span><span class="p">()</span> 583</span></span><span class="line"><span class="cl"><span class="p">{</span> 584</span></span><span class="line"><span class="cl"> <span class="c1">// æ¸ çç²å 585</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">erase_if</span><span class="p">(</span><span class="n">particles</span><span class="p">,</span> <span class="p">[](</span><span class="k">const</span> <span class="n">Particle</span> <span class="o">&</span><span class="n">p</span><span class="p">)</span> <span class="p">{</span> 586</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">p</span><span class="p">.</span><span class="n">opacity</span> <span class="o"><=</span> <span class="mf">0.f</span><span class="p">;</span> 587</span></span><span class="line"><span class="cl"> <span class="p">});</span> 588</span></span><span class="line"><span class="cl"> <span class="c1">// æ¸ çç«ç®ï¼åå°å¨ççå½å¨æè·çç«ç® 589</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">erase_if</span><span class="p">(</span><span class="n">rockets</span><span class="p">,</span> <span class="p">[](</span><span class="k">const</span> <span class="n">Rocket</span> <span class="o">&</span><span class="n">r</span><span class="p">)</span> <span class="p">{</span> 590</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="n">r</span><span class="p">.</span><span class="n">position</span><span class="p">.</span><span class="n">x</span> <span class="o"><</span> <span class="n">bounds</span><span class="p">.</span><span class="n">x</span><span class="p">)</span> 591</span></span><span class="line"><span class="cl">
591 <span class="k">return</span> <span class="nb">false</span><span class="p">;</span> 592</span></span><span class="line"><span class="cl"> 593</span></span><span class="line"><span class="cl"> <span class="c1">// æ¸ ç对åºçåå°å¨ 594</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">emitters</span><span class="p">[</span><span class="n">r</span><span class="p">.</span><span class="n">smokeEmitterIndex</span><span class="p">].</span><span class="n">reset</span><span class="p">();</span> 595</span></span><span class="line"><span class="cl"> <span class="n">emitters</span><span class="p">[</span><span class="n">r</span><span class="p">.</span><span class="n">fireEmitterIndex</span><span class="p">].</span><span class="n">reset</span><span class="p">();</span> 596</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span> <span class="c1">// è¶ åºå±å¹èå´ 597</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">})</span><span class="err">ï¼</span> 598</span></span><span class="line"><span class="cl"><span class="p">}</span> 599</span></span></code></pre></div><p>å¯æçæ§è½æåð²ð«¡ï¼</p> 600<p><figure 601 602 class="gallery-image" 603 style=" 604 flex-grow: 179; 605 flex-basis: 430px" 606 > 607 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/9.png" data-size="1518x847"> 608 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/9.png" 609 width="1518" 610 height="847" 611 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/9_hu18302114455711385202.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/9_hu10654747247858193818.png 1024w" 612 loading="lazy" 613 > 614 </a> 615 616</figure></p> 617<hr> 618<p><strong>æ©å±æ§</strong></p> 619<p>å¨æäºæ©å±éæ±åºæ¯ä¸ï¼DoDè¿ææ¾èçä¼å¿ã</p> 620<p>ä¾å¦ï¼å½æä»¬éè¦è·è¸ªç«ç®çæ°éæ¶ï¼OOP䏿¯å¤ªæ ¢ãå°±æ¯ä¼æç ´åç§é¢å对象çååï¼èDoDä¸è¡ç§äºï¼</p> 621<p><figure 622 623 class="gallery-image" 624 style=" 625 flex-grow: 178; 626 flex-basis: 427px" 627 > 628 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/10.png" data-size="1511x848"> 629 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/10.png" 630 width="1511" 631 height="848" 632 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/10_hu839920638594494017.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/10_hu7936819700054189616.png 1024w" 633 loading="lazy" 634 > 635 </a> 636 637</figure> <figure 638 639 class="gallery-image" 640 style=" 641 flex-grow: 180; 642 flex-basis: 432px" 643 > 644 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/11.png" data-size="1513x840"> 645 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/11.png" 646 width="1513" 647 height="840" 648 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/11_hu10294139693594287059.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/11_hu3443738303422378384.png 1024w" 649 loading="lazy" 650 > 651 </a> 652 653</figure></p> 654<p>ä¾å¦ï¼å¯¹å¤çº¿ç¨çæ¯æãOOPçå®ç°å®é ä¸å¾é¾æ¯æå¹¶åï¼æ¯ç«æ¯ä¸ªå¯¹è±¡é½å¯¹å ¨å±ç对象产çå½±åï¼èDoDçæ´ç´ å¾ªç¯å¤©ç¶æ¯æå¹¶åæä½ï¼</p> 655<p><figure 656 657 class="gallery-image" 658 style=" 659 flex-grow: 178; 660 flex-basis: 429px" 661 > 662 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/14.png" data-size="1520x850"> 663 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/14.png" 664 width="1520" 665 height="850" 666 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/14_hu12858367930504213327.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/14_hu13471575707855015029.png 1024w" 667 loading="lazy" 668 > 669 </a> 670 671</figure> <figure 672 673 class="gallery-image" 674 style=" 675 flex-grow: 178; 676 flex-basis: 429px" 677 > 678 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/15.png" data-size="1516x847"> 679 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/15.png" 680 width="1516" 681 height="847" 682 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/15_hu958766615921814844.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/15_hu16196223889278836658.png 1024w" 683 loading="lazy" 684 > 685 </a> 686 687</figure></p> 688<p><strong>å¯è¯»æ§</strong></p> 689<p>è³äºä»£ç çå¯è¯»æ§ï¼DoDçä»£ç æ¯OOPæ´ç´ç½ï¼æ´æ¾è¦åï¼æ´æç»´æ¤ã</p> 690<p><figure 691 692 class="gallery-image" 693 style=" 694 flex-grow: 179; 695 flex-basis: 430px" 696 > 697 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/12.png" data-size="1516x845"> 698 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/12.png" 699 width="1516" 700 height="845" 701 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/12_hu10419330792162832265.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/12_hu17981198533867461022.png 1024w" 702 loading="lazy" 703 > 704 </a> 705 706</figure> <figure 707 708 class="gallery-image" 709 style=" 710 flex-grow: 179; 711 flex-basis: 429px" 712 > 713 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/13.png" data-size="1522x850"> 714 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/13.png" 715 width="1522" 716 height="850" 717 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/13_hu11801942938935829101.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/13_hu17883041461787745195.png 1024w" 718 loading="lazy" 719 > 720 </a> 721 722</figure></p> 723<blockquote> 724<p>âï¸ææï¼å¨å·¥ä½ä¸çç¡®åç°OOPç代ç å¨å¤æçç»§æ¿å ³ç³»åºç°æ¶ä¼åæä¸å¨ãæ¥è§¦æ°åè½æ¨¡åæ¶ç¹åºä¸ä¸ªæ½è±¡ç±»çææåç±»ä¸ä¸ªä¸ªçè¿å»ï¼è¿è¦å¨ä¸è¾¹æ¶å»è®°çè°ç¨ç¹çä¸ä¸æï¼ä¸ç¥éå¸¦èµ°äºæå¤å°ä¸ªèç»è⦠ð¶âð«ï¸</p> 725</blockquote> 726<h4 id="52-ä¼å2">5.2 ä¼å2</h4> 727<ul> 728<li>å¨é«é¢å¾ªç¯ä¸é¿å 忝ï¼ä»¥å ç¼åå½ä¸çä¸é</li> 729<li>åå°å ¬å ±ç±»åçä½ç§¯ï¼ä½¿å¾ç¼åå¯ä»¥å¡ä¸æ´å¤ç对象</li> 730</ul> 731<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// ã5.2ãç¸æ¯äº5.1ï¼ä¸åéè¦åå°å¨/ç²åç±»åï¼å°ç±ä¸ç对象æ¥åç±» 732</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">struct</span> <span class="nc">Emitter</span> <span class="p">{</span> 733</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">position</span><span class="p">;</span> 734</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">velocity</span><span class="p">;</span> 735</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">acceleration</span><span class="p">;</span> 736</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">spawnTimer</span><span class="p">,</span> <span class="n">spawnRate</span><span class="p">;</span> 737</span></span><span class="line"><span class="cl"><span class="p">};</span> 738</span></span><span class="line"><span class="cl"> 739</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Particle</span> <span class="p">{</span> 740</span></span><span class="line"><span class="cl"> <span class="c1">// æ°æ®ä¹é´ä¸åæç»§æ¿å ³ç³»ï¼å°½ç®¡è¿æ ·ä¼å¸¦æ¥å段çéå¤ï¼ä½æ²¡å¤ªå¤§å ³ç³» 741</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">position</span><span class="p">;</span> 742</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">velocity</span><span class="p">;</span> 743</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">acceleration</span><span class="p">;</span> 744</span></span><span class="line"><span class="cl"> 745</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">scale</span><span class="p">;</span> 746</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">opacity</span><span class="p">;</span> 747</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">rotation</span><span class="p">;</span> 748</span></span><span class="line"><span class="cl"> 749</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">scaleRate</span><span class="p">;</span> 750</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">opacityChange</span><span class="p">;</span> 751</span></span><span class="line"><span class="cl"> <span class="kt">float</span> <span class="n">rotationVelocity</span><span class="p">;</span> 752</span></span><span class="line"><span class="cl"><span class="p">};</span> 753</span></span><span class="line"><span class="cl"> 754</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">Rocket</span> <span class="p">{</span> 755</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">position</span><span class="p">;</span> 756</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">velocity</span><span class="p">;</span> 757</span></span><span class="line"><span class="cl"> <span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span> <span class="n">acceleration</span><span class="p">;</span> 758</span></span><span class="line"><span class="cl"> 759</span></span><span class="line"><span class="cl"> <span class="c1">// ã5.2ãä½è æåº5.1ç size_t å ç¨ç大å°å¤ªå¤§ï¼64æ¯ç¹ï¼ï¼å®é åªéè¦ u16 760</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// 说å®è¯ï¼ææè§65536个åå°å¨å¥½å䏿»¡è¶³benchmarkä¸ç¾ä¸ä¸ªç«ç®çéè¦ï¼ 761</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// å¯è½æ¯å 为ä¸ä¸ªå±æ²¡åæ³åæ¶åå¨è¿ä¹å¤æ°æ®ï¼å åæ¯å¾ªç¯å©ç¨çï¼æè½åè¿ç§æ¹é ï¼ 762</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="kt">uint16_t</span> <span class="n">smokeEmitterIndex</span><span class="p">;</span> 763</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="kt">uint16_t</span> <span class="n">fireEmitterIndex</span><span class="p">;</span> 764</span></span><span class="line"><span class="cl"><span class="p">};</span> 765</span></span></code></pre></div><p>ç±äºæä»¬ä¸åè¿è¡åå°å¨/ç²åçåç±»ï¼ä¸çå¯¹è±¡çæ°æ®ç®¡çä¼åå¾ç²¾ç»ï¼</p> 766<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">World</span> <span class="p">{</span> 767</span></span><span class="line"><span class="cl"> <span class="c1">// ã5.2ãç¸æ¯äº5.1ï¼è¿é对æ°ç»çç®¡çæ´ç» 768</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Particle</span><span class="o">></span> <span class="n">smokeParticles</span><span class="p">;</span> 769</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Particle</span><span class="o">></span> <span class="n">fireParticles</span><span class="p">;</span> 770</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Rocket</span><span class="o">></span> <span class="n">rockets</span><span class="p">;</span> 771</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>></span> <span class="n">smokeEmitters</span><span class="p">;</span> 772</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>></span> <span class="n">fireEmitters</span><span class="p">;</span> 773</span></span><span class="line"><span class="cl"> 774</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">addRocket</span><span class="p">(</span><span class="k">const</span> <span class="n">Rocket</span> <span class="o">&</span><span class="n">rocket</span><span class="p">);</span> 775</span></span><span class="line"><span class="cl"> <span class="c1">// // ã5.2ãç¸æ¯äº5.1ï¼è¿éæ¯ææå®è¦æ·»å çæ°ç» 776</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">
776size_t</span> <span class="n">addEmitter</span><span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="n">targetVec</span><span class="p">,</span> <span class="k">const</span> <span class="n">Emitter</span> <span class="o">&</span><span class="n">emitter</span><span class="p">);</span> 777</span></span><span class="line"><span class="cl"> 778</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span><span class="err">ï¼</span> 779</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="n">draw</span><span class="p">(</span><span class="n">sf</span><span class="o">::</span><span class="n">RenderTarget</span> <span class="o">&</span><span class="n">target</span><span class="p">);</span> 780</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">cleanup</span><span class="p">();</span> 781</span></span><span class="line"><span class="cl"><span class="p">};</span> 782</span></span></code></pre></div><p>ä¼ååçæ´æ°å½æ°ï¼</p> 783<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">World</span><span class="o">::</span><span class="n">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> 784</span></span><span class="line"><span class="cl"><span class="p">{</span> 785</span></span><span class="line"><span class="cl"> <span class="k">auto</span> <span class="n">updateParticles</span> <span class="o">=</span> <span class="p">[</span><span class="o">&</span><span class="p">](</span><span class="n">Particle</span><span class="o">&</span> <span class="n">particles</span><span class="p">)</span> <span class="p">{</span> 786</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">position</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">velocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 787</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">velocity</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 788</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">scale</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">scaleRate</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 789</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">opacity</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">opacityChange</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 790</span></span><span class="line"><span class="cl"> <span class="n">particle</span><span class="p">.</span><span class="n">rotation</span> <span class="o">+=</span> <span class="n">particle</span><span class="p">.</span><span class="n">rotationVelocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 791</span></span><span class="line"><span class="cl"> <span class="p">};</span> 792</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">Particle</span> <span class="o">&</span><span class="nl">particle</span> <span class="p">:</span> <span class="n">smokeParticles</span><span class="p">)</span> <span class="n">updateParticles</span><span class="p">(</span><span class="n">particle</span><span class="p">);</span> 793</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">Particle</span> <span class="o">&</span><span class="nl">particle</span> <span class="p">:</span> <span class="n">fireParticles</span><span class="p">)</span> <span class="n">updateParticles</span><span class="p">(</span><span class="n">particle</span><span class="p">);</span> 794</span></span><span class="line"><span class="cl"> 795</span></span><span class="line"><span class="cl"> <span class="k">auto</span> <span class="n">updateEmitter</span> <span class="o">=</span> <span class="p">[</span><span class="o">&</span><span class="p">](</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>&</span> <span class="n">e</span><span class="p">,</span> <span class="k">auto</span><span class="o">&&</span> <span class="n">fSpawn</span><span class="p">)</span> 796</span></span><span class="line"><span class="cl"> <span class="p">{</span> 797</span></span><span class="line"><span class="cl">
797 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">e</span><span class="p">.</span><span class="n">has_value</span><span class="p">())</span> 798</span></span><span class="line"><span class="cl"> <span class="k">return</span><span class="p">;</span> 799</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">position</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">velocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 800</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">velocity</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 801</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnRate</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 802</span></span><span class="line"><span class="cl"> 803</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(;</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">>=</span> <span class="mf">1.f</span><span class="p">;</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">-=</span> <span class="mf">1.f</span><span class="p">)</span> 804</span></span><span class="line"><span class="cl"> <span class="n">fSpawn</span><span class="p">();</span> 805</span></span><span class="line"><span class="cl"> <span class="p">};</span> 806</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>&</span> <span class="nl">e</span> <span class="p">:</span> <span class="n">smokeEmitters</span><span class="p">)</span> 807</span></span><span class="line"><span class="cl"> <span class="n">updateEmitter</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="p">[</span><span class="o">&</span><span class="p">]</span> <span class="p">{</span> <span class="n">smokeParticles</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(...);</span> <span class="p">});</span> 808</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>&</span> <span class="nl">e</span> <span class="p">:</span> <span class="n">fireEmitters</span><span class="p">)</span> 809</span></span><span class="line"><span class="cl"> <span class="n">updateEmitter</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="p">[</span><span class="o">&</span><span class="p">]</span> <span class="p">{</span> <span class="n">fireParticles</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(...);</span> <span class="p">});</span> 810</span></span><span class="line"><span class="cl"><span class="p">}</span> 811</span></span></code></pre></div><p>æ§è½æåå¹¶ä¸å¾å¤§ï¼åå æ¯å¯¹äºä½è çbenchmarkæµè¯æ¥è¯´ï¼æ§è½ç¶é¢å·²ç»ä¸å¨äºæ°æ®ç宿ï¼èå¨äºæ´æ°particleãä½è èªéï¼ä¼ååçæ°æ®ç»æå¨æ¸²ææ¶å¸¦æ¥äº12%çæ§è½æåã</p> 812<p><figure 813 814 class="gallery-image" 815 style=" 816 flex-grow: 178; 817 flex-basis: 428px" 818 > 819 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/16.png" data-size="1518x850"> 820 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/16.png" 821 width="1518" 822 height="850" 823 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/16_hu18069446886534235613.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/16_hu233018878266016890.png 1024w" 824 loading="lazy" 825 > 826 </a> 827 828</figure></p> 829<h4 id="53-ä¼å3">5.3 ä¼å3</h4> 830<ul> 831<li>ä» <em>Array of Structs</em> ï¼å¯¹è±¡æ°ç»ï¼æ¹æ <em>Struct of Arrays</em> ï¼æ°ç»å¯¹è±¡ï¼</li> 832</ul> 833<p>䏿²ä»£ç äºï¼</p> 834<p><figure 835 836 class="gallery-image" 837 style=" 838 flex-grow: 179; 839 flex-basis: 431px" 840 > 841 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/17.png" data-size="1511x841"> 842 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/17.png" 843 width="1511" 844 height="841" 845 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/17_hu2444119559110335323.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/17_hu6560399056473588303.png 1024w" 846 loading="lazy" 847 > 848 </a> 849 850</figure></p> 851<p>ç¸æ¯äºAoSï¼SoAåå¨å¦ä¸æ¹é¢çæåï¼</p> 852<p><figure 853 854 class="gallery-image" 855 style=" 856 flex-grow: 178; 857 flex-basis: 429px" 858 > 859 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/18.png" data-size="1513x846"> 860 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/18.png" 861 width="1513" 862 height="846" 863 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/18_hu17402534095562776053.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/18_hu15862703896513886581.png 1024w" 864 loading="lazy" 865 > 866 </a> 867 868</figure></p> 869<ul> 870<li>没æå¯¹è±¡å é¨ç <em>padding</em> ãæä»¬ç¥éä¸ä¸ªæ°æ®ç»æå é¨çåæ®µä¸çé¿ï¼å æ¤AoSåå ä¹é´ä¼ç±äºæ¯ä¸ªå¯¹è±¡å é¨ç对é½ï¼åå¨ä¸äºç©ºå å</li> 871<li>æ´çµæ´»çåæ®µå è½½ã彿们åªéè¦è®¿é®ä¸ä¸ªå¯¹è±¡çä¸ä¸ªå段æ¶ï¼AoSä¼éè¦é个å è½½æ´ä¸ªå¯¹è±¡ï¼èSoAè½å¤æ¹éå è½½ææå¯¹è±¡çè¿ä¸ªå段ï¼ä¸éè¦å è½½å ¶ä½æ å ³åæ®µãï¼æ³¨ãæççè§£ï¼è¿å®é ä¸éè¦åæ°æ®å¤çé»è¾é¨å深度èç³»ï¼å³ï¼å¯è½éè¦å®ç°å段级å«çæ¹å¤çæ¶ï¼è¿ç§ç¹æ§çä¼å¿ä¼æ¯è¾ææ¾ï¼åä¹åæ¯å£å¿ï¼</li> 872<li>æ´å¥½å°æ¯æåéåæä½ãè¿é主è¦ä¹æ¯æä¾¿äºè¿è¡å段级å«çæ¹å¤çï¼å¨è¿ç§åºç¨åºæ¯ä¸SIMDï¼åæä»¤å¤æ°æ®ï¼ä¼è¿ä¸æ¥å¸¦æ¥æ§è½æå</li> 873</ul> 874<blockquote> 875<p>æå±é 读ï¼</p> 876<p>[1] çè§£SIMDææ¯ï¼é«æå¹¶è¡è®¡ç®çå©å¨,https://blog.csdn.net/qq_34068440/article/details/139636268</p> 877</blockquote> 878<p>æ¹é 为SoAçå®ç°å¦ä¸ï¼</p> 879<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">ParticleSoA</span> <span class="p">{</span> 880</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span><span class="o">></span> <span class="n">positions</span><span class="p">;</span> 881</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span><span class="o">></span> <span class="n">velocitys</span><span class="p">;</span> 882</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">sf</span><span class="o">::</span><span class="n">Vector2f</span><span class="o">></span> <span class="n">accelerations</span><span class="p">;</span> 883</span></span><span class="line"><span class="cl"> 884</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">scales</span><span class="p">;</span> 885</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">opacities</span><span class="p">;</span> 886</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">rotations</span><span class="p">;</span> 887</span></span><span class="line"><span class="cl"> 888</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">scaleRates</span><span class="p">;</span> 889</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">opacityChanges</span><span class="p">;</span> 890</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">float</span><span class="o">></span> <span class="n">rotationVelocities</span><span class="p">;</span> 891</span></span><span class="line"><span class="cl"> 892</span></span><span class="line"><span class="cl"> <span class="kt">void</span> <span class="nf">forAllVectors</span><span class="p">(</span><span class="k">auto</span><span class="o">&&</span> <span class="n">f</span><span class="p">)</span> <span class="p">{</span> 893</span></span><span class="line"><span class="cl">
893 <span class="n">f</span><span class="p">(</span><span class="n">positions</span><span class="p">);</span> 894</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">velocitys</span><span class="p">);</span> 895</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">accelerations</span><span class="p">);</span> 896</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">scales</span><span class="p">);</span> 897</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">opacities</span><span class="p">);</span> 898</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">rotations</span><span class="p">);</span> 899</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">scaleRates</span><span class="p">);</span> 900</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">opacityChanges</span><span class="p">);</span> 901</span></span><span class="line"><span class="cl"> <span class="n">f</span><span class="p">(</span><span class="n">rotationVelocities</span><span class="p">);</span> 902</span></span><span class="line"><span class="cl"> <span class="p">}</span> 903</span></span><span class="line"><span class="cl"><span class="p">};</span> 904</span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">World</span> <span class="p">{</span> 905</span></span><span class="line"><span class="cl"> <span class="c1">// ã5.3ãç¸æ¯äº5.2ï¼è¿éç²åç±»å使ç¨äºSoA 906</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">ParticleSoA</span> <span class="n">smokeParticles</span><span class="p">;</span> 907</span></span><span class="line"><span class="cl"> <span class="n">ParticleSoA</span> <span class="n">fireParticles</span><span class="p">;</span> 908</span></span><span class="line"><span class="cl"> 909</span></span><span class="line"><span class="cl"> <span class="c1">// ã5.3ãè¿éä¸åæ¹é çåå æ¯æ§è½ç¶é¢ä¸å¨è¿é 910</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">Rocket</span><span class="o">></span> <span class="n">rockets</span><span class="p">;</span> 911</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>></span> <span class="n">smokeEmitters</span><span class="p">;</span> 912</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>></span> <span class="n">fireEmitters</span><span class="p">;</span> 913</span></span><span class="line"><span class="cl"> 914</span></span><span class="line"><span class="cl"> <span class="c1">// ... 915</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">};</span> 916</span></span></code></pre></div><p>æ¹é åçæ´æ°å½æ°ï¼</p> 917<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">World</span><span class="o">::</span><span class="n">update</span><span class="p">(</span><span class="kt">float</span> <span class="n">dt</span><span class="p">)</span> 918</span></span><span class="line"><span class="cl"><span class="p">{</span> 919</span></span><span class="line"><span class="cl"> <span class="c1">// ã5.3ãç¸æ¯äº5.2ï¼è¿é使ç¨äºSoA 920</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">auto</span> <span class="n">updateParticles</span> <span class="o">=</span> <span class="p">[</span><span class="o">&</span><span class="p">](</span><span class="n">ParticleSoA</span><span class="o">&</span> <span class="n">soa</span><span class="p">)</span> <span class="p">{</span> 921</span></span><span class="line"><span class="cl">
921 <span class="k">const</span> <span class="k">auto</span> <span class="n">nParticles</span> <span class="o">=</span> <span class="n">soa</span><span class="p">.</span><span class="n">positions</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> 922</span></span><span class="line"><span class="cl"> <span class="c1">// è¿ä»£éé¢çæä½æ¯æ··åçï¼ä¸»è¦æ¯Vittorioåçå®éªåç°è¿éæ··åè¿ä»£æ§è½è¾å¥½ 923</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">nParticles</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> 924</span></span><span class="line"><span class="cl"> <span class="n">soa</span><span class="p">.</span><span class="n">velocitys</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">soa</span><span class="p">.</span><span class="n">accelerations</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 925</span></span><span class="line"><span class="cl"> <span class="n">soa</span><span class="p">.</span><span class="n">positions</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">soa</span><span class="p">.</span><span class="n">velocitys</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 926</span></span><span class="line"><span class="cl"> <span class="n">soa</span><span class="p">.</span><span class="n">scales</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">soa</span><span class="p">.</span><span class="n">scaleRates</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 927</span></span><span class="line"><span class="cl"> <span class="n">soa</span><span class="p">.</span><span class="n">opacities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">soa</span><span class="p">.</span><span class="n">opacityChanges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 928</span></span><span class="line"><span class="cl"> <span class="n">soa</span><span class="p">.</span><span class="n">rotations</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">soa</span><span class="p">.</span><span class="n">rotationVelocities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 929</span></span><span class="line"><span class="cl"> <span class="p">}</span> 930</span></span><span class="line"><span class="cl"> <span class="p">};</span> 931</span></span><span class="line"><span class="cl"> <span class="n">updateParticles</span><span class="p">(</span><span class="n">smokeParticles</span><span class="p">);</span> 932</span></span><span class="line"><span class="cl"> <span class="n">updateParticles</span><span class="p">(</span><span class="n">fireParticles</span><span class="p">);</span> 933</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">optional</span><span class="o"><</span><span class="n">Emitter</span><span class="o">>&</span> <span class="nl">e</span> <span class="p">:</span> <span class="n">smokeEmitters</span><span class="p">)</span> <span class="p">{</span> 934</span></span><span class="line"><span class="cl">
934 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">e</span><span class="p">.</span><span class="n">has_value</span><span class="p">())</span> 935</span></span><span class="line"><span class="cl"> <span class="k">continue</span><span class="p">;</span> 936</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">position</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">velocity</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 937</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">velocity</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">acceleration</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 938</span></span><span class="line"><span class="cl"> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">+=</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnRate</span> <span class="o">*</span> <span class="n">dt</span><span class="p">;</span> 939</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="p">(;</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">>=</span> <span class="mf">1.f</span><span class="p">;</span> <span class="n">e</span><span class="o">-></span><span class="n">spawnTimer</span> <span class="o">-=</span> <span class="mf">1.f</span><span class="p">)</span> <span class="p">{</span> 940</span></span><span class="line"><span class="cl"> <span class="c1">// ã5.3ãè¿éä¸å¾ä¸åå«å¯¹æ¯ä¸ªå段åç¬æ·»å ï¼æ¯è¾æ¶å¿ä½æ²¡åæ³ ð«¥ 941</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="c1">// ä¹è®¸SoA对象èªè¡å°è£ ä¸ä¸ªemplace彿°ï¼æ¥å®æè¿ä¸ªæä½ä¼æ´å¥½ï¼ä¸éè¦~ 942</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">smokeParticles</span><span class="p">.</span><span class="n">positions</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(...);</span> 943</span></span><span class="line"><span class="cl"> <span class="n">smokeParticles</span><span class="p">.</span><span class="n">velocitys</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(...);</span> 944</span></span><span class="line"><span class="cl"> <span class="c1">// ... 945</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="n">smokeParticles</span><span class="p">.</span><span class="n">rotationVelocities</span><span class="p">.</span><span class="n">emplace_back</span><span class="p">(...);</span> 946</span></span><span class="line"><span class="cl"> <span class="p">}</span> 947</span></span><span class="line"><span class="cl"> <span class="p">}</span> 948</span></span><span class="line"><span class="cl"><span class="p">}</span> 949</span></span></code></pre></div><p>æ¸ ç彿°ä¹æ¯å¸¦æSoA飿 ¼çï¼</p> 950<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// é¦å å®ä¹ä¸ä¸ªç®åç叮婿¹æ³ 951</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">void</span> <span class="nf">soaEraseIf</span><span class="p">(</span><span class="n">ParticleSoA</span><span class="o">&</span> <span class="n">soa</span><span class="p">,</span> <span class="k">auto</span><span class="o">&&</span> <span class="n">predicate</span><span class="p">)</span> 952</span></span><span class="line"><span class="cl"><span class="p">{</span> 953</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">
953size_t</span> <span class="n">n</span> <span class="o">=</span> <span class="n">soa</span><span class="p">.</span><span class="n">positions</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> 954</span></span><span class="line"><span class="cl"> <span class="n">std</span><span class="o">::</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0u</span><span class="p">;</span> 955</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="p">(</span><span class="n">i</span> <span class="o"><</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> 956</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">predicate</span><span class="p">(</span><span class="n">soa</span><span class="p">,</span> <span class="n">i</span><span class="p">))</span> 957</span></span><span class="line"><span class="cl"> <span class="p">{</span> 958</span></span><span class="line"><span class="cl"> <span class="o">++</span><span class="n">i</span><span class="p">;</span> 959</span></span><span class="line"><span class="cl"> <span class="k">continue</span><span class="p">;</span> 960</span></span><span class="line"><span class="cl"> <span class="p">}</span> 961</span></span><span class="line"><span class="cl"> <span class="c1">// ðè¿éå¾å¦ï¼éç»å 962</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="o">--</span><span class="n">n</span><span class="p">;</span> 963</span></span><span class="line"><span class="cl"> <span class="n">soa</span><span class="p">.</span><span class="n">forAllVectors</span><span class="p">([</span><span class="o">&</span><span class="p">](</span><span class="k">auto</span><span class="o">&</span> <span class="n">vec</span><span class="p">)</span> <span class="p">{</span> <span class="n">vec</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">vec</span><span class="p">[</span><span class="n">n</span><span class="p">];</span> <span class="p">});</span> 964</span></span><span class="line"><span class="cl"> <span class="p">}</span> 965</span></span><span class="line"><span class="cl"> <span class="n">soa</span><span class="p">.</span><span class="n">forAllVectors</span><span class="p">([</span><span class="o">&</span><span class="p">](</span><span class="k">auto</span><span class="o">&</span> <span class="n">vec</span><span class="p">)</span> <span class="p">{</span> <span class="n">vec</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="p">});</span> 966</span></span><span class="line"><span class="cl"><span class="p">}</span> 967</span></span><span class="line"><span class="cl"> 968</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">World</span><span class="o">::</span><span class="n">cleanup</span><span class="p">()</span> 969</span></span><span class="line"><span class="cl"><span class="p">{</span> 970</span></span><span class="line"><span class="cl"> <span class="k">auto</span> <span class="n">hasNegativeOpacity</span> <span class="o">=</span> <span class="p">[](</span><span class="k">const</span> <span class="n">ParticleSoA</span><span class="o">&</span> <span class="n">soa</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">size_t</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span> 971</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">soa</span><span class="p">.</span><span class="n">opacities</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o"><=</span> <span class="mf">0.f</span><span class="p">;</span> 972</span></span><span class="line"><span class="cl"> <span class="p">};</span> 973</span></span><span class="line"><span class="cl"> <span class="n">soaEraseIf</span><span class="p">(</span><span class="n">smokeParticles</span><span class="p">,</span> <span class="n">hasNegativeOpacity</span><span class="p">);</span> 974</span></span><span class="line"><span class="cl"> <span class="n">soaEraseIf</span><span class="p">(</span><span class="n">fireParticles</span><span class="p">,</span> <span class="n">hasNegativeOpacity</span><span class="p">);</span> 975</span></span><span class="line"><span class="cl"> <span class="c1">// ... 976</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span> 977</span></span></code></pre></div><p>æ¶ç乿¯é常çamazingï¼</p> 978<p><figure 979 980 class="gallery-image" 981 style=" 982 flex-grow: 178; 983 flex-basis: 429px" 984 > 985 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/19.png" data-size="1516x847"> 986 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/19.png" 987 width="1516" 988 height="847" 989 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/19_hu2484940084883594255.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/19_hu10252215922456562818.png 1024w" 990 loading="lazy" 991 > 992 </a> 993 994</figure></p> 995<p>对äºSoAå为å¤ä¸ªæ°ç»å段æå¸¦æ¥çä¸æç»´æ¤é®é¢ï¼Vittorioæä¾äºä¸äºåå°å®ç°ï¼</p> 996<p><figure 997 998 class="gallery-image" 999 style=" 1000 flex-grow: 178; 1001 flex-basis: 429px" 1002 > 1003 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/20.png" data-size="1512x845"> 1004 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/20.png" 1005 width="1512" 1006 height="845" 1007 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/20_hu4569994164053250784.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/20_hu12051097503537907757.png 1024w" 1008 loading="lazy" 1009 > 1010 </a> 1011 1012</figure></p> 1013<p>
1013å¹¶æåè¿äºå®ç°å°å¨C++26æçæ£ç宿¹æ¯æ~ð²</p> 1014<h4 id="54-one-more-thing">5.4 one more thing</h4> 1015<ul> 1016<li>DoDåSoA并没æç´æ¥èç³»ï¼SoAåªæ¯ä¸ç§ä¼åçç¥èéç»æçæ¡</li> 1017</ul> 1018<p><figure 1019 1020 class="gallery-image" 1021 style=" 1022 flex-grow: 187; 1023 flex-basis: 450px" 1024 > 1025 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/21.png" data-size="1477x787"> 1026 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/21.png" 1027 width="1477" 1028 height="787" 1029 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/21_hu8230816338949601031.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/21_hu9981513575824479441.png 1024w" 1030 loading="lazy" 1031 > 1032 </a> 1033 1034</figure></p> 1035<ul> 1036<li>DoDä¹å¹¶éç»æçæ¡ï¼OOP卿´ä¸å±çä¸å¡ä¸ä»èµ·å°ä¼ç§çæ½è±¡ä½ç¨ï¼æ³¨ãOOPæ¯å¤å£³ï¼DoDæ¯å¼æï¼è¿å¥è¯ä¸ªäººè§å¾éå¸¸å¥½å°æè¿°äºä¸¤è çåéçå ³ç³»ï¼</li> 1037</ul> 1038<p><figure 1039 1040 class="gallery-image" 1041 style=" 1042 flex-grow: 182; 1043 flex-basis: 436px" 1044 > 1045 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/22.png" data-size="1504x826"> 1046 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/22.png" 1047 width="1504" 1048 height="826" 1049 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/22_hu6524415594779468322.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/22_hu5508765578805549557.png 1024w" 1050 loading="lazy" 1051 > 1052 </a> 1053 1054</figure></p> 1055<h3 id="6-æ»ç»">6 æ»ç»</h3> 1056<ul> 1057<li>èéæ§è½äºæå</li> 1058<li>æå¹³ãç²¾ç®çæ°æ®ç»æ</li> 1059<li>妥å½çåç±»èéåç§ç±»åæ è¯</li> 1060<li>å¨éè¦æ¹å¤çæ¶èèSoA</li> 1061</ul> 1062<p><figure 1063 1064 class="gallery-image" 1065 style=" 1066 flex-grow: 182; 1067 flex-basis: 438px" 1068 > 1069 <a href="/p/cppcon25pratical-data-oriented-design-in-c-/23.png" data-size="1506x825"> 1070 <img src="/p/cppcon25pratical-data-oriented-design-in-c-/23.png" 1071 width="1506" 1072 height="825" 1073 srcset="/p/cppcon25pratical-data-oriented-design-in-c-/23_hu11643206164514503739.png 480w, /p/cppcon25pratical-data-oriented-design-in-c-/23_hu11282351607161604186.png 1024w" 1074 loading="lazy" 1075 > 1076 </a> 1077 1078</figure></p> 1079<p><em>Data drives design</em></p> 1080<ul> 1081<li>æ°æ®æ¯è®¾è®¡çæ ¸å¿é©±å¨åãè¿æå³çå¨è¿è¡ç³»ç»æä»£ç 设计æ¶ï¼åºä»¥å®é çæ°æ®ç»æãæ°æ®æµå使ç¨åºæ¯ä¸ºä¾æ®ï¼è䏿¯å空æ³è±¡æéµå¾ªåºå®æ¨¡å¼ã</li> 1082</ul> 1083<p><em>Target the machine</em></p> 1084<ul> 1085<li>ç¼ç¨çç®æ æ¯è®©æºå¨é«æè¿è¡ã强è°è¦å ³æ³¨åºå±ç¡¬ä»¶åæ§è¡æçï¼ç¼åè½å¤è¢«æºå¨é«ææ§è¡ç代ç ï¼é¿å è¿åº¦æ½è±¡æä¸å¿ è¦çå¼éã</li> 1086</ul> 1087<p><em>Itâs a spectrum, not dogma</em></p> 1088<ul> 1089<li>软件å¼åä¸çåç§æ¹æ³åææ¯æ¯ä¸ä¸ªè¿ç»è°±ç³»ï¼èééé»å³ç½çææ¡ãé¼å±çµæ´»éæ©éåå½ååºæ¯çææ¯æ¹æ¡ï¼ä¸ç²ç®è¿½éæç§âæä½³å®è·µâã</li> 1090</ul> 1091<p><em>Embrace Modern C++</em></p> 1092<ul> 1093<li>积æéç¨ç°ä»£C++ï¼å¦C++11å以ä¸çæ¬ï¼çæ°ç¹æ§ï¼ä¾å¦æºè½æéãlambda表达å¼ãèå´for循ç¯çï¼ä»¥æå代ç çå®å ¨æ§ãå¯è¯»æ§åæ§è½ã</li> 1094</ul> 1095<p><em>Pragmatism wins</em></p> 1096<ul> 1097<li>å®ç¨ä¸»ä¹èåºãæç»å³å®å ç´ æ¯å®é ææï¼æ¯å¦è§£å³äºé®é¢ãæ¯å¦æäºç»´æ¤ãæ¯å¦é«æç¨³å®ãä¸è¦ä¸ºäºè¿½æ±âä¼é âèçºç²å®ç¨æ§ã</li> 1098</ul> 1099<h3 id="7-qa">7 Q&A</h3> 1100<blockquote> 1101<p>Q&Aç¯èï¼ä¸äºé®é¢ä¹é¢æå¯åï¼æµ åè®°å½ï¼è®°å½æçè§£å°çææèéå¿ å®å°ç¿»è¯é®ç对è¯ï¼ã</p> 1102</blockquote> 1103<p>Q:æè®¤ä¸ºä¸äºä¹ äºé¢å对象çç¨åºåä¼è®¤ä¸ºDoD丢失äºä¸äºå¯¹è±¡é´çèç³»ï¼ä¾å¦å¨OOPä¸ <code>Rocket</code> å <code>Emitter</code> æçæ¸ æ°çèç³»ï¼èDoDä¸è¿ç§è系似ä¹ä¸¢å¤±äºã对æ¤ä½ æä¹çï¼</p> 1104<p>A:ä» ä» è§å¯æ°æ®æ¬èº«çè¯ï¼æè½getå°è¿ä¸ªé®é¢ç¹ãææ³æåºè½ç¶æä»¬å¨ç¤ºä¾ä¸ä½¿ç¨æ´åç´¢å¼è¿è¡å ³èæ§ç表达ï¼ä½å®é ä¹å¯ä»¥ä½¿ç¨ä¸äº <code>handle</code> æå¼ºç±»åå®ä¹æ¥ä½¿å¾å ³èæ§çè¡¨è¾¾æ´æ¸ æ°ãå¦ä¸æ¹é¢ï¼æè§å¾å½æä»¬æä½æ°æ®æ¶ï¼è¿ç§èç³»å®é 䏿¯åæ¸ æ°èéå
1104å¼±ï¼å½æä»¬é 读 <code>update</code> ä¸çå¾ªç¯æ¶ï¼æä»¬ä¸æ¢ç¥é <code>Emitter</code> å <code>Rocket</code> ä¹é´åå¨èç³»ï¼è¿ç¥éè¿ç§èç³»æ¯ä¸ºäºä»ä¹ã产çäºä»ä¹ä½ç¨ãå æ¤ï¼å¨è¿ç§è§è§ä¸æä»¬å¾å¤§äºå¤±ã</p> 1105<hr> 1106<p>Q:ä½ å¦ä½æ¯è¾DoDåOOPäºè ä¹é´ç坿µè¯æ§ï¼ <em>testability</em> ï¼ï¼</p> 1107<p>A:æè®¤ä¸ºDoDï¼ç»å¯æµè¯æ§ï¼å¸¦æ¥äºä¸äºå¾å¥½çæ¶çï¼ä¾å¦ç±äºæä»¬çä¸åé½åªæ¯æ°æ®ï¼æä»¬å¯ä»¥å¾ç®åå°æé ãåå¨ãå è½½ä¸åçæµè¯æ°æ®ï¼èOOPç¸å¯¹æ¥è¯´å°±æ²¡æé£ä¹ç®åå°è½å¯¹å¯¹è±¡è¿è¡åºåå/ååºååçæä½ãç¶èOOPä»å¨ä¸äºå°æ¹è¡¨ç°æ´å¥½ï¼ä¾å¦mockingæä¾èµæ³¨å ¥ãå æ¤éè¦å°OOPåºç¨å¨åéçå±çº§ï¼å³å颿å°çè¾é«çå±çº§ï¼ã</p> 1108<hr> 1109<p>Q:ææè§å°ä¼¼ä¹æ¹éå¤çåç任塿´è½åå¾DoDçææçå¤ï¼ä½ å¦ä½çå¾ éæ¹éå¤çåçä»»å¡ï¼ä¾å¦éæºè®¿é®æä» å¤çå°æ°éºå±å¼çå®ä½ï¼</p> 1110<p>A:ä¾ç¶åå³äºä½ çéæ±ï¼æ£å¦æ¼è®²ä¸æè¯´ï¼ä¹æå¾å¤é常æåçæ¸¸ææåºç¨ä¸å¿ å ³æ³¨è¿äºä¸è¥¿ï¼æDoDï¼ãå¨è¿ç¨DoDæ¶ï¼å¦æä½ çæ°æ®å¤©ç¶æ¯ä¸ç§å¾æç±»ä¼¼çç»æï¼å¤çèµ·æ¥å°±éè¦æ´å·§å¦ä¸äºï¼å 为å®ä»¬ä¸åæä»¬çdemoé£ä¹ç®åä¸ç¬¦åç´è§ï¼ä½DoDä»ç¶æå°æ¹æ½å±èº«æãä¾å¦å½ä½ å¨å±åºéå䏿£µæ çæ¶åï¼èç¹å¯è½å¯ä»¥ç»ç»ä¸ºä¸ä¸ªæ°ç»ï¼ä»¥å¾å°æ§è½æ¶çï¼ï¼å 为éåçé¡ºåºæ¯æç¡®çãæç建议ä»ç¶æ¯å½æ§è½æ¯ä¸é¡¹å ³é®éæ±ï¼ä¸ä½ å¸æç¡®ä¿ä½ çæ¶ææ¯é«æçï¼æ¤æ¶åºèèæ°æ®è®¿é®çæ¹å¼ï¼å¹¶ææ°æ®ç»ç»ä¸ºä½¿å¾ç¼åå½ä¸çå çæå¤§åçå½¢å¼ã</p> 1111<hr> 1112<p>Q:å½ä½ ææ°æ®ç»ç»ä¸ºæå¹³å½¢å¼ï¼å®é 䏿¯äº§çäºä¸äºé夿°æ®ï¼èä¼¼ä¹ä¸å¦ç®åå°ç»§æ¿èªåºç±»ãæ¤ç§åæ³æ¯å¦æå¼ç«¯ï¼æ¯ç«åè ä½¿å¾æ°æ®æ²¡æéå¤ï¼å ååªæä¸ä»½ã</p> 1113<p>A:è¿ä¼åå³äºä½ å¸æè¡¨è¾¾å°å¤æ¸ æ°ã妿æç´æ¥çä¸ä¸ªç»æï¼æå¸æè½å¤ç´æ¥çå°è¿ä¸ªä¸è¥¿å°±æè¿ä¹å¤å段ï¼èå¦æä½ ç»§æ¿äºï¼é è¯»ä»£ç æ¶å°±éè¦åå¾ä¸ç¿»ä¸å±ï¼è½é®é¢ä¸å¤§ï¼æ¯ç«ä¹æ¯ä¸ä¸ªé¢å¤æ¥éª¤ãå¦ä¸æ¹é¢æ¯ï¼ä¸æ¦å¼å ¥ç»§æ¿å ³ç³»ï¼å°±æäººå¯è½å¼å§ä¾èµè¿å±å ³ç³»ï¼ä½¿å¾ä½ 对继æ¿ä½ç³»ä¸ç代ç ä¿®æ¹åå¾å°é¾ï¼å¼å ¥äºä¸å®çè¦åã</p> 1114 1115</section> 1116 1117 1118 1119 <footer class="article-footer"> 1120 1121 <section class="article-tags"> 1122 1123 <a href="/tags/%E6%8A%80%E6%9C%AF/">ææ¯</a> 1124 1125 </section> 1126 1127 1128 </footer> 1129 1130 1131 1132 1133</article> 1134 1135 1136 1137 <aside class="related-contents--wrapper"> 1138 1139 1140</aside> 1141 1142 1143 1144 1145 <div id="gitalk-container"></div> 1146 1147<link rel="stylesheet" href="/resources/gitalk.css">
1148<script src="/resources/gitalk.min.js"></script>
1148 1149
1150<script> 1151 const gitalk = new Gitalk({ 1152 clientID: "60cf432a89bc92763c12", 1153 clientSecret: "6725615388bdb06c4050a0f6f3fa47d017fcc8d9", 1154 repo: "BlogComments", 1155 owner: "SGS4ever", 1156 admin: ["SGS4ever"], 1157 distractionFreeMode: false, 1158 id: '', 1159 }); 1160 (function () { 1161 if ( 1162 ["localhost", "127.0.0.1"].indexOf(window.location.hostname) != -1 1163 ) { 1164 document.getElementById("gitalk-container").innerHTML = 1165 "Gitalk comments not available by default when the website is previewed locally."; 1166 return; 1167 } 1168 gitalk.render("gitalk-container"); 1169 })(); 1170</script>
1170 1171 1172 1173 1174 1175 1176 <footer class="site-footer"> 1177 <section class="copyright"> 1178 © 1179 1180 2020 - 1181 1182 2025 XR_G's Blog 1183 </section> 1184 1185 <section class="powerby"> 1186 1187 ææèªè¿æ¹æ¥ï¼ä¸äº¦è¯´ä¹ï¼ <br/> 1188 <br /> 1189 1190 </section> 1191</footer> 1192 1193 1194 1195<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true"> 1196 1197 1198 <div class="pswp__bg"></div> 1199 1200 1201 <div class="pswp__scroll-wrap"> 1202 1203 1204 <div class="pswp__container"> 1205 <div class="pswp__item"></div> 1206 <div class="pswp__item"></div> 1207 <div class="pswp__item"></div> 1208 </div> 1209 1210 1211 <div class="pswp__ui pswp__ui--hidden"> 1212 1213 <div class="pswp__top-bar"> 1214 1215 1216 1217 <div class="pswp__counter"></div> 1218 1219 <button class="pswp__button pswp__button--close" title="Close (Esc)"></button> 1220 1221 <button class="pswp__button pswp__button--share" title="Share"></button> 1222 1223 <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button> 1224 1225 <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button> 1226 1227 1228 1229 <div class="pswp__preloader"> 1230 <div class="pswp__preloader__icn"> 1231 <div class="pswp__preloader__cut"> 1232 <div class="pswp__preloader__donut"></div> 1233 </div> 1234 </div> 1235 </div> 1236 </div> 1237 1238 <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap"> 1239 <div class="pswp__share-tooltip"></div> 1240 </div> 1241 1242 <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)"> 1243 </button> 1244 1245 <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)"> 1246 </button> 1247 1248 <div class="pswp__caption"> 1249 <div class="pswp__caption__center"></div> 1250 </div> 1251 1252 </div> 1253 1254 </div> 1255 1256</div>
1256<script 1257 src="https://cdn.jsdelivr.net/npm/[email protected]/dist/photoswipe.min.js"integrity="sha256-ePwmChbbvXbsO02lbM3HoHbSHTHFAeChekF1xKJdleo="crossorigin="anonymous" 1258 defer="true" 1259 > 1260 </script>
1260<script 1261 src="https://cdn.jsdelivr.net/npm/[email protected]/dist/photoswipe-ui-default.min.js"integrity="sha256-UKkzOn/w1mBxRmLLGrSeyB4e1xbrp4xylgAWb3M42pU="crossorigin="anonymous" 1262 defer="true" 1263 > 1264 </script>
1264<link 1265 rel="stylesheet" 1266 href="https://cdn.jsdelivr.net/npm/[email protected]/dist/default-skin/default-skin.css"integrity="sha256-c0uckgykQ9v5k+IqViZOZKc47Jn7KQil4/MP3ySA3F8="crossorigin="anonymous" 1267 ><link 1268 rel="stylesheet" 1269 href="https://cdn.jsdelivr.net/npm/[email protected]/dist/photoswipe.css"integrity="sha256-SBLU4vv6CA6lHsZ1XyTdhyjJxCjPif/TRkjnsyGAGnE="crossorigin="anonymous" 1270 > 1271 1272 </main> 1273 1274 <aside class="sidebar right-sidebar sticky"> 1275 <section class="widget archives"> 1276 <div class="widget-icon"> 1277 <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-hash" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> 1278 <path stroke="none" d="M0 0h24v24H0z"/> 1279 <line x1="5" y1="9" x2="19" y2="9" /> 1280 <line x1="5" y1="15" x2="19" y2="15" /> 1281 <line x1="11" y1="4" x2="7" y2="20" /> 1282 <line x1="17" y1="4" x2="13" y2="20" /> 1283</svg> 1284 1285 1286 1287 </div> 1288 <h2 class="widget-title section-title">ç®å½</h2> 1289 1290 <div class="widget--toc"> 1291 <nav id="TableOfContents"> 1292 <ul> 1293 <li><a href="#1-ä¸ä¸ªç®åçdemo">1 ä¸ä¸ªç®åçDemo</a></li> 1294 <li><a href="#2-é¢å¤è¯å ååcache">2 é¢å¤è¯ï¼å ååCache</a></li> 1295 <li><a href="#3-oopå®ç°çæ§è½é®é¢åæ">3 OOPå®ç°çæ§è½é®é¢åæ</a></li> 1296 <li><a href="#4-设计å²å¦ç对æ¯">4 设计å²å¦ç对æ¯</a></li> 1297 <li><a href="#5-对demoçä¼å">5 对Demoçä¼å</a> 1298 <ul> 1299 <li><a href="#51-ä¼å1">5.1 ä¼å1</a></li> 1300 <li><a href="#52-ä¼å2">5.2 ä¼å2</a></li> 1301 <li><a href="#53-ä¼å3">5.3 ä¼å3</a></li> 1302 <li><a href="#54-one-more-thing">5.4 one more thing</a></li> 1303 </ul> 1304 </li> 1305 <li><a href="#6-æ»ç»">6 æ»ç»</a></li> 1306 <li><a href="#7-qa">7 Q&A</a></li> 1307 </ul> 1308</nav> 1309 </div> 1310 </section> 1311 1312 1313 1314 <a id="back-to-top" href="#"> 1315 <img src="/img/top_hu10958439986251666570.png" /> 1316 </a> 1317 </aside> 1318 1319 1320 </div> 1321
1321<script 1322 src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vibrant.min.js"integrity="sha256-5NovOZc4iwiAWTYIFiIM7DxKUXKWvpVEuMEPLzcm5/g="crossorigin="anonymous" 1323 defer="false" 1324 > 1325 </script>
1325<script type="text/javascript" src="/ts/main.js" defer></script>
1325 1326 1327 1328<link rel="preconnect" href="https://fonts.googleapis.com"> 1329<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 1330<link href="https://fonts.googleapis.com/css2?family=Long+Cang&family=Ma+Shan+Zheng&family=Noto+Sans+SC:wght@300&family=Noto+Serif+SC:wght@300&family=Zhi+Mang+Xing&display=swap" rel="stylesheet"> 1331 1332 </body> 1333</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.