# 游戲專題
SD近期為游戲開發者提供了很多助力,在游戲開發上提供了一些便利性組件,下面我們來看看SD是怎么為游戲開發者解決痛點的。
## 延遲隊列
游戲一般對消息隊列有一定的使用需求,但一般的開源消息隊列并沒有很好的處理延時消息的派發。比如rabbitmq雖然它是可以通過死信隊列來模擬延時隊列但是不僅難用還有很大的限制。
SD提供了一個簡單可靠的延遲消息隊列模塊[TimerCallBack](TimerCallBack.md)。
```
$token = yield TimerCallBack::addTimer(2,TestModel::class,'testTimerCall',[123]);
```
簡單的通過下面一段代碼就可以實現延遲2s執行TestModel中的testTimerCall函數。而且沒有任何副作用,即使重啟服務器延時隊列也會很好的完成使命。
## Actor
本篇文章將重點介紹下Actor,什么是Actor你可以把它當成一個運算單元,用于模擬任何的事與物,Actor存在于內存中分布在不同的進程,或者分布在不同的機器上,Actor間可以互相通訊,Controller,Model甚至Actor自身都可以創建一個Actor,Actor同樣也可以調用Model和Task。
拿棋牌舉例子,你可以為房間創建一個RoomActor,為房間里的每一個人創建一個PlayerActor,RoomActor負責處理一共有多少局,輪到誰出牌了,PlayerActor則可以負責玩家的一系列行為,甚至玩家掉線充當玩家的AI。
利用好Actor可以簡化你游戲的邏輯,使其更加擬人,邏輯表達更加的清晰,使用Actor的哲學就是萬物的交流靠通訊。
1. 創建Actor
```
$name = session_create_id();
Actor::create(TestActor::class, $name);
```
每一個Actor都必須是不重名的。
2. 與Actor通訊
```
$rpc = Actor::getRpc("Test2");
try {
$beginid = yield $rpc->beginCo();
$result = yield $rpc->test1();
$result = yield $rpc->test2();
//var_dump($result);
$result = yield $rpc->test3();
//var_dump($result);
} finally {
//var_dump("finally end");
$rpc->end();
}
```
與Actor通訊都是RPC形式,和調用一個函數一樣,支持事務。
3. 銷毀Actor
```
Actor::destroyActor($name);//銷毀某一個Actor
Actor::destroyAllActor();//銷毀所有Actor
```
4. Actor狀態機
Actor具有自動恢復的功能,即使服務器關閉,再次啟動時會自動恢復所有沒有被主動銷毀的Actor,當然記錄這個Actor的前提是該Actor使用了狀態機。
使用setStatus可以創建狀態,創建狀態的時候或者恢復狀態的時候會執行registStatusHandle方法,我們可以在次方法里處理狀態對應的邏輯。
```
$this->setStatus('status', 1);
public function registStatusHandle($key, $value);
```
5. Actor的定時器
```
public function tick($ms, $callback, $user_param = null);//定時器
public function after($ms, $callback, $user_param = null);//延時執行
public function clearTimer($id);//清除定時器
```
Actor銷毀的時候會自動銷毀全部的定時器。
6. Actor集群
在集群環境下Actor同樣可以執行,不同機器的Actor間可以相互通訊,還是要注意的一點就是一定要保證Actor名稱的唯一性,如果創建了2個名稱一樣的Actor,那么這2個Actor均會收到屬于這個名稱的所有消息。
7. 穩定性
SD已驗證了50W個Actor的創建與恢復,創建越多的Actor會消耗越多的內存。
## 結束語
使用好這些模塊,會加快你的游戲開發進程,SD之后也會推出更多的面向特定行業的優質模塊。
- Introduction
- SD 3.X文檔連接
- 導言
- 用戶案例
- 基于Swoole擴展分布式全棧開發框架
- 選擇SD框架助力企業開發
- 捐贈SwooleDistributed項目
- 框架性能報告
- 更新日志
- VIP服務福利
- 安裝與配置
- 【推薦】全自動安裝部署
- 環境要求
- 使用Composer安裝/更新SD框架
- 通過Docker安裝
- 代碼結構
- 啟動命令
- 服務器配置
- 服務器基礎配置server.php
- 客戶端協議配置client.php
- business.php
- log.php
- 微服務及集群配置consul.php
- fileHeader.php
- mysql.php
- redis.php
- 定時任務配置timerTask.php
- 服務器端口配置ports.php
- catCache.php
- 驗證服務啟動成功
- 微服務-Consul
- 日志工具-GrayLog
- 集群-Cluster
- 內核優化
- 入門教學
- 開發流程
- 開發前必讀
- 開發規范
- 基本流程
- 框架入口
- Model數據模型
- Controller控制器
- 協程
- 協程基礎
- 迭代器
- 調度器
- 使用協程的優勢
- 通過協程的方法屏蔽異步同步的區別
- Select多路選擇器
- 協程Sleep
- 通用協程方法
- 設置超時
- 設置無異常
- 設置降級函數
- initAsynPools
- dump
- 封裝器與路由器
- 封裝器
- sendToUid
- 路由器
- sendToUids
- 對象池
- 擴展組件
- 中間件
- Redis使用介紹
- RedisAsynPool
- Redis具體使用
- sendToAll
- RedisRoute
- Redis+Lua
- Mysql使用介紹
- MysqlAsynPool
- Mysql返回值
- 如何獲取構建的mysql語句
- 如何執行一個SQL
- 如何執行事務
- stopTask
- Mysql具體使用
- 異步客戶端
- Loader
- MqttClient
- model
- SdTcpRpcPool
- task
- HttpClientPool
- view
- TcpClientPool
- AMQP
- initialization
- Memory
- destory
- Cache
- Lock
- Pool
- EventDispatcher
- Process
- Cluster
- TimerTask
- Reload
- Consul
- Context
- 自定義進程
- 進程間RPC
- $http_input
- CatCache
- $http_output
- TimerCallBack
- 專題
- HTTP專欄
- TCP專欄
- 基礎知識
- WebSocket專欄
- 微服務
- Consul配置
- RPC
- REST
- AMQP異步任務系統
- MQTT簡易服務器
- Docker化以及資源編排
- 快速搭建公司內部統一的開發環境
- 使用HTTPS/WSS
- 訂閱/發布
- 游戲專題
- 類介紹
- AppServer
- clearState
- onOpenServiceInitialization
- SwooleDistributedServer
- get_instance
- kickUid
- bindUid
- unBindUid
- coroutineUidIsOnline
- coroutineCountOnline
- setTemplateEngine
- isWebSocket
- isTaskWorker
- getSocketName
- initAsynPools
- addAsynPool
- getAsynPool
- getServerAllTaskMessage
- Controller
- onExceptionHandle
- send
- sendToUid
- sendToUids
- sendToAll
- sendToGroup
- close
- getContext
- defaultMethod
- $redis_pool
- $mysql_pool
- $request_type
- $fd
- $uid
- $client_data
- $request
- $response
- $loader
- $logger
- $server
- $config
- Model
- initialization
- destory
- View
- Task
- stopTask
- HttpInput
- postGet
- post
- get
- getPost
- getAllPostGet
- getAllHeader
- getRawContent
- cookie
- getRequestHeader
- server信息
- getRequestMethod
- getRequestUri
- getPathInfo
- HttpOutput
- setStatusHeader
- setContentType
- setHeader
- end
- setCookie
- endFile
- 單元測試