-
Notifications
You must be signed in to change notification settings - Fork 7
/
cpu-limit.html
171 lines (150 loc) · 17.1 KB
/
cpu-limit.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<!DOCTYPE html>
<html lang="zh-cn">
<head prefix="og: http://ogp.me/ns#">
<meta charset="utf-8">
<title>有关 CPU 限制 | Screeps 中文文档</title>
<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Canonical links -->
<link rel="canonical" href="http://screeps-cn.github.io/cpu-limit.html">
<!-- Alternative links -->
<link rel="alternative" hreflang="en" href="http://screeps-cn.github.io/cpu-limit.html">
<link rel="alternative" hreflang="zh-tw" href="http://screeps-cn.github.io/zh-tw/cpu-limit.html">
<link rel="alternative" hreflang="zh-cn" href="http://screeps-cn.github.io/zh-cn/cpu-limit.html">
<link rel="alternative" hreflang="ru" href="http://screeps-cn.github.io/ru/cpu-limit.html">
<link rel="alternative" hreflang="ko" href="http://screeps-cn.github.io/ko/cpu-limit.html">
<!-- Icon -->
<link rel="apple-touch-icon" sizes="57x57" href="/icon/apple-touch-icon-57x57.png">
<link rel="apple-touch-icon" sizes="114x114" href="/icon/apple-touch-icon-114x114.png">
<link rel="apple-touch-icon" sizes="72x72" href="/icon/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="144x144" href="/icon/apple-touch-icon-144x144.png">
<link rel="apple-touch-icon" sizes="60x60" href="/icon/apple-touch-icon-60x60.png">
<link rel="apple-touch-icon" sizes="120x120" href="/icon/apple-touch-icon-120x120.png">
<link rel="apple-touch-icon" sizes="76x76" href="/icon/apple-touch-icon-76x76.png">
<link rel="apple-touch-icon" sizes="152x152" href="/icon/apple-touch-icon-152x152.png">
<link rel="icon" type="image/png" href="/icon/favicon-196x196.png" sizes="196x196">
<link rel="icon" type="image/png" href="/icon/favicon-160x160.png" sizes="160x160">
<link rel="icon" type="image/png" href="/icon/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/png" href="/icon/favicon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/icon/favicon-32x32.png" sizes="32x32">
<meta name="msapplication-TileColor" content="#2f83cd">
<meta name="msapplication-TileImage" content="/icon/mstile-144x144.png">
<!-- CSS -->
<!-- build:css build/css/navy.css -->
<link rel="stylesheet" href="/css/navy.css?1">
<link rel="stylesheet" href="/css/prism.css">
<!-- endbuild -->
<link href="https://fonts.googleapis.com/css?family=Lato:300,400,700" rel="stylesheet" type="text/css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css">
<!-- RSS -->
<link rel="alternate" href="/atom.xml" title="Screeps 中文文档">
<!-- Open Graph -->
<meta name="description" content="Screeps 游戏引擎有两种运行模式:一种是基于浏览器的单机模式,比如主页上的 sim 。另一种是基于服务器的联机模式。尽管两种模式以游戏的角度看来没有差别的,且所能调用的 api 都是一模一样的,但执行玩家代码的方法不同。单机模式下,代码都是由浏览器本地执行的,并不需要任何云端服务器的参与。
而在联机模式下,代码的执行完全由云端的服务器负责而非本地浏览器,为了方便管理,我们提供了名为 CPU">
<meta property="og:type" content="website">
<meta property="og:title" content="有关 CPU 限制">
<meta property="og:url" content="http://screeps-cn.github.io/cpu-limit.html">
<meta property="og:site_name" content="Screeps 中文文档">
<meta property="og:description" content="Screeps 游戏引擎有两种运行模式:一种是基于浏览器的单机模式,比如主页上的 sim 。另一种是基于服务器的联机模式。尽管两种模式以游戏的角度看来没有差别的,且所能调用的 api 都是一模一样的,但执行玩家代码的方法不同。单机模式下,代码都是由浏览器本地执行的,并不需要任何云端服务器的参与。
而在联机模式下,代码的执行完全由云端的服务器负责而非本地浏览器,为了方便管理,我们提供了名为 CPU">
<meta property="og:image" content="http://screeps-cn.github.io/img/cpu-bucket.png">
<meta property="og:updated_time" content="2024-09-20T13:38:58.408Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="有关 CPU 限制">
<meta name="twitter:description" content="Screeps 游戏引擎有两种运行模式:一种是基于浏览器的单机模式,比如主页上的 sim 。另一种是基于服务器的联机模式。尽管两种模式以游戏的角度看来没有差别的,且所能调用的 api 都是一模一样的,但执行玩家代码的方法不同。单机模式下,代码都是由浏览器本地执行的,并不需要任何云端服务器的参与。
而在联机模式下,代码的执行完全由云端的服务器负责而非本地浏览器,为了方便管理,我们提供了名为 CPU">
<meta name="twitter:image" content="http://screeps-cn.github.io/img/cpu-bucket.png">
<!-- Google Analytics -->
</head>
<body>
<div id="container">
<header id="header" class="wrapper">
<div id="header-inner" class="inner">
<h1 id="logo-wrap">
<a href="https://screeps.com" id="logo">Screeps</a>
<a href="/index.html" id="logo-docs">docs</a>
</h1>
<a id="mobile-nav-toggle">
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
<span class="mobile-nav-toggle-bar"></span>
</a>
<div id="header-main"></div>
</div>
</header>
<div id="content-wrap">
<div id="content" class="wrapper">
<div id="content-inner">
<article class="article-container" itemscope itemtype="http://schema.org/Article">
<div class="article-inner">
<div class="article">
<div class="inner">
<header class="article-header">
<h1 class="article-title" itemprop="name" id="top">有关 CPU 限制</h1>
<a href="https://github.com/screeps-cn/docs/edit/master/source/cpu-limit.md" class="article-edit-link" title="改进本文"><i class="fa fa-pencil"></i></a>
</header>
<div class="article-content" itemprop="articleBody">
<p>Screeps 游戏引擎有两种运行模式:一种是基于浏览器的<strong>单机模式</strong>,比如主页上的 <a href="https://screeps.com/a/#!/sim" target="_blank" rel="external">sim</a> 。另一种是基于服务器的<strong>联机模式</strong>。尽管两种模式以游戏的角度看来没有差别的,且所能调用的 api 都是一模一样的,但执行玩家代码的方法不同。单机模式下,代码都是由浏览器本地执行的,并不需要任何云端服务器的参与。</p>
<p>而在联机模式下,代码的执行完全由云端的服务器负责而非本地浏览器,为了方便管理,我们提供了名为 CPU 时间的资源,您可以由此使用游戏服务器上的 CPU 资源。</p>
<p>在<a href="/game-loop.html">理解游戏循环、游戏时间、 ticks</a> 中,我们提过这个游戏是由很多 tick 构成的。每一 tick ,游戏引擎会执行所有玩家的代码。但 tick 的时长并不固定的——只有当所有玩家的代码被执行后,服务器才会结束这 tick。</p>
<h2 id="CPU-限制" class="article-heading"><a href="#CPU-限制" class="headerlink" title="CPU 限制"></a>CPU 限制<a class="article-anchor" href="#CPU-限制" aria-hidden="true"></a></h2><p>为了避免玩家的代码执行时间过长而影响游戏的流畅性,我们引入了 <strong>CPU 限额</strong>。其本质是以毫秒为单位来限制代码执行时长, 100 CPU 意味着玩家的代码最多可以执行 100 毫秒,当 100 毫秒到后,无论代码是否执行完全都会被强行终止。玩家默认有 20 CPU ,但可通过<a href="/subscription.html">订阅</a>增加 CPU ,具体增量跟玩家的 <a href="/control.html">GCL</a> 挂钩。</p>
<h2 id="库存" class="article-heading"><a href="#库存" class="headerlink" title="库存"></a>库存<a class="article-anchor" href="#库存" aria-hidden="true"></a></h2><p>方便起见,玩家每 tick 所省下的 CPU 会被存在 <code>bucket</code> 中以备不时之需。这样,玩家仍可执行超过其 CPU 限制的代码。</p>
<p><img src="img/cpu-bucket.png" alt=""></p>
<p>如果玩家的代码在 CPU 限制内执行完了,那么其剩余的 CPU 便会被存起来。玩家最多可以存 10,000 CPU ,但每 tick 最多可用 500 CPU 。</p>
<p>举例来说,如果玩家的 CPU 限制为 150,但其代码每 tick 只要 100 CPU 就执行完了,那么剩下的 50 CPU 则会被存在 <code>bucket</code> 中。因此,用省下的 CPU ,玩家可以每 5 tick 执行一个需要 250 CPU 的大型代码,或每 200 tick 连续执行五个各需要 500 CPU 的超大型代码。</p>
<p><a href="/api/#Game.cpu"><code>Game.cpu.tickLimit</code></a> 便为玩家此 tick 最多使用的 CPU 量。当玩家的 <a href="/api/#Game.cpu"><code>Game.cpu.bucket</code></a> 存满了后, <a href="/api/#Game.cpu"><code>Game.cpu.tickLimit</code></a> 便为上限 500 。这个最多多用量只会在玩家 <a href="/api/#Game.cpu"><code>Game.cpu.bucket</code></a> 快见底后减少,且 <a href="/api/#Game.cpu"><code>Game.cpu.tickLimit</code></a> 永远不会小于你的 CPU 限制 (<a href="/api/#Game.cpu"><code>Game.cpu.limit</code></a>)</p>
<p>因此,玩家根据 CPU 储量,可以保证其需要消耗大量时间的代码(比如寻路代码)不被中断。</p>
</div>
<footer class="article-footer">
<time class="article-footer-updated" datetime="2024-09-20T13:38:58.408Z" itemprop="dateModified">上次更新:9月 20, 2024</time>
<a href="/simultaneous-actions.html" class="article-footer-prev"><i class="fa fa-chevron-left"></i><span>同步操作</span></a><a href="/architecture.html" class="article-footer-next"><span>服务器架构</span><i class="fa fa-chevron-right"></i></a>
</footer>
</div>
</div>
<aside id="article-toc" role="navigation">
<div id="article-toc-inner">
<strong class="sidebar-title">目录</strong>
<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#CPU-限制"><span class="toc-text">CPU 限制</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#库存"><span class="toc-text">库存</span></a></li></ol>
<a href="#" id="article-toc-top">回到顶部</a>
</div>
</aside>
</div>
</article>
<aside id="sidebar" role="navigation">
<div class="inner"><a href="/api/" class=api-link><span>API Reference</span><img src="/img/link-external.svg"></a><a href="/index.html" class="sidebar-link">总览</a><strong class="sidebar-title">游戏环境</strong><a href="/introduction.html" class="sidebar-link">简介</a><a href="/creeps.html" class="sidebar-link">Creeps</a><a href="/control.html" class="sidebar-link">控制</a><a href="/defense.html" class="sidebar-link">防御</a><a href="/respawn.html" class="sidebar-link">重生</a><a href="/start-areas.html" class="sidebar-link">初始区域</a><a href="/resources.html" class="sidebar-link">资源</a><a href="/market.html" class="sidebar-link">市场</a><a href="/invaders.html" class="sidebar-link">NPC 入侵者</a><a href="/power.html" class="sidebar-link">超能</a><strong class="sidebar-title">脚本</strong><a href="/scripting-basics.html" class="sidebar-link">脚本基础</a><a href="/global-objects.html" class="sidebar-link">全局对象</a><a href="/modules.html" class="sidebar-link">模块</a><a href="/debugging.html" class="sidebar-link">调试</a><a href="/game-loop.html" class="sidebar-link">游戏循环</a><a href="/commit.html" class="sidebar-link">外部提交</a><a href="/simultaneous-actions.html" class="sidebar-link">同步操作</a><a href="/cpu-limit.html" class="sidebar-link current">CPU 限制</a><strong class="sidebar-title">其他</strong><a href="/architecture.html" class="sidebar-link">服务器架构</a><a href="/ptr.html" class="sidebar-link">公开测试区域 (PTR)</a><a href="/third-party.html" class="sidebar-link">第三方工具</a><a href="/auth-tokens.html" class="sidebar-link">验证令牌</a><a href="/community-servers.html" class="sidebar-link">社区服务器</a><a href="/tos.html" class="sidebar-link">服务条款</a><a href="/privacy-policy.html" class="sidebar-link">隐私政策</a><strong class="sidebar-title">资源</strong><a href="http://blog.screeps.com" class="sidebar-link">博客</a><a href="http://blog.screeps.com/categories/Changelogs/" class="sidebar-link">修改日志</a><a href="http://chat.screeps.com" class="sidebar-link">聊天室</a><a href="https://screeps.com/forum/" class="sidebar-link">论坛</a><strong class="sidebar-title">贡献文章</strong><a href="/contributed/rules.html" class="sidebar-link">贡献规则</a><a href="/contributed/advanced_grunt.html" class="sidebar-link">高级 Grunt 使用</a><a href="/contributed/modifying-prototypes.html" class="sidebar-link">修改原型</a><a href="/contributed/caching-overview.html" class="sidebar-link">缓存概述</a><a href="/contributed/ps_ubuntu.html" class="sidebar-link">私有服务器 MongoDB</a></div>
</aside>
</div>
</div>
</div>
<footer id="footer" class="wrapper">
<div class="inner">
<div id="footer-copyright">
© 2024 <a href="https://screeps.com/" target="_blank">Screeps</a><br>
Documentation licensed under <a href="http://creativecommons.org/licenses/by/4.0/" target="_blank">CC BY 4.0</a>.
</div>
<div id="footer-links">
<a href="https://github.com/screeps-cn/docs" class="footer-link" target="_blank"><i class="fa fa-github-alt"></i></a>
</div>
</div>
</footer>
</div>
<div id="mobile-nav-dimmer"></div>
<nav id="mobile-nav">
<div id="mobile-nav-inner">
<a href="/api/" class=api-link><span>API Reference</span><img src="/img/link-external.svg"></a><a href="/index.html" class="mobile-nav-link">总览</a><strong class="mobile-nav-title">游戏环境</strong><a href="/introduction.html" class="mobile-nav-link">简介</a><a href="/creeps.html" class="mobile-nav-link">Creeps</a><a href="/control.html" class="mobile-nav-link">控制</a><a href="/defense.html" class="mobile-nav-link">防御</a><a href="/respawn.html" class="mobile-nav-link">重生</a><a href="/start-areas.html" class="mobile-nav-link">初始区域</a><a href="/resources.html" class="mobile-nav-link">资源</a><a href="/market.html" class="mobile-nav-link">市场</a><a href="/invaders.html" class="mobile-nav-link">NPC 入侵者</a><a href="/power.html" class="mobile-nav-link">超能</a><strong class="mobile-nav-title">脚本</strong><a href="/scripting-basics.html" class="mobile-nav-link">脚本基础</a><a href="/global-objects.html" class="mobile-nav-link">全局对象</a><a href="/modules.html" class="mobile-nav-link">模块</a><a href="/debugging.html" class="mobile-nav-link">调试</a><a href="/game-loop.html" class="mobile-nav-link">游戏循环</a><a href="/commit.html" class="mobile-nav-link">外部提交</a><a href="/simultaneous-actions.html" class="mobile-nav-link">同步操作</a><a href="/cpu-limit.html" class="mobile-nav-link current">CPU 限制</a><strong class="mobile-nav-title">其他</strong><a href="/architecture.html" class="mobile-nav-link">服务器架构</a><a href="/ptr.html" class="mobile-nav-link">公开测试区域 (PTR)</a><a href="/third-party.html" class="mobile-nav-link">第三方工具</a><a href="/auth-tokens.html" class="mobile-nav-link">验证令牌</a><a href="/community-servers.html" class="mobile-nav-link">社区服务器</a><a href="/tos.html" class="mobile-nav-link">服务条款</a><a href="/privacy-policy.html" class="mobile-nav-link">隐私政策</a><strong class="mobile-nav-title">资源</strong><a href="http://blog.screeps.com" class="mobile-nav-link">博客</a><a href="http://blog.screeps.com/categories/Changelogs/" class="mobile-nav-link">修改日志</a><a href="http://chat.screeps.com" class="mobile-nav-link">聊天室</a><a href="https://screeps.com/forum/" class="mobile-nav-link">论坛</a><strong class="mobile-nav-title">贡献文章</strong><a href="/contributed/rules.html" class="mobile-nav-link">贡献规则</a><a href="/contributed/advanced_grunt.html" class="mobile-nav-link">高级 Grunt 使用</a><a href="/contributed/modifying-prototypes.html" class="mobile-nav-link">修改原型</a><a href="/contributed/caching-overview.html" class="mobile-nav-link">缓存概述</a><a href="/contributed/ps_ubuntu.html" class="mobile-nav-link">私有服务器 MongoDB</a>
</div>
</nav>
<!-- Scripts -->
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<!-- build:js build/js/main.js -->
<script src="/js/lang_select.js"></script>
<script src="/js/scrollingelement.js"></script>
<script src="/js/toc.js"></script>
<script src="/js/mobile_nav.js"></script>
<script src="/js/custom.js"></script>
<!-- endbuild -->
<script src="https://cdn.jsdelivr.net/retinajs/1.3.0/retina.min.js" async></script>
<!-- Algolia -->
</body>
</html>