1. 程式人生 > >微信小遊戲子域踩坑記錄

微信小遊戲子域踩坑記錄

最近要在小遊戲裡面弄一個排行榜功能,記錄一下踩過的坑吧。

受限的開發資料域

微信是限制在遊戲主體裡面進行關係鏈資料的操作的,取而代之的是一個開放資料域的類沙盒環境。這是一個功能受限的Javascript沙盒,在開放資料域裡面:

  • 不能聯網
  • 只能使用本地或微信CDN的圖片
  • 不能向主域傳遞訊息
  • 不能設定sharedCanvas的尺寸
  • 不能呼叫canvas的toDataURL以及getImageData
  • 只能通過wx.onMessage接受主域訊息

頭像顯示問題

最先受到影響的是排行版中的頭像顯示,一開始很自然的使用了主域中的寫法

cc.loader.load(userGameData.avatarUrl, (err, texture)=>{
	if(err){
		console.warn(err);
		return;
	}
	avatar.spriteFrame = new cc.SpriteFrame(texture);
});

自然是不行的,原因在於loader在載入遠端資源的時候是要使用網路的,而子域中wx.request是無法使用的。因此需要使用wx.createImage來獲取圖片,下面這樣是可以的。

setAvatar(avatarUrl) {
    let image = wx.createImage();
    image.onload = () => {
        try {
            let texture = new cc.Texture2D();
            texture.initWithElement(image);
            texture.handleLoadedTexture();
            this.avatar.spriteFrame = new cc.SpriteFrame(texture);
        } catch (e) {
            console.warn(e);
        }
    };
    image.src = avatarUrl;
}

包體過大的問題

寫完之後,感覺可以了,便準備上傳小遊戲。然後...包體過大,無法上傳!!!是的,我已經把所有的資源都放在了遠端資源伺服器了。然而還是超了,這裡不得不吐槽下creator的包體太大了。一個10k不到的合圖檔案,一個場景檔案,兩個不到100行的js檔案,就已經1.3M了!!!然後,把專案中無用的模組全關了,重新打包,子域大小在730k左右。另外一個scrollview元件居然就有快30k的大小,實在無力吐槽。等專案有空的時候,還是用原生子域替換掉這個creator版本。

子域在主域的canvas上顯示的比例不對

  • 設定子域尺寸和主域繪製精靈尺寸一致
  • 不要都選精靈的trim

掉幀

子域的效能實在是不怎麼好,平均只有40幀不到,就算限制了update的頻率也沒有什麼提高==、好在只有一個排行版,勉強能看,有空研究下。

字型模糊

很多人說子域的字型會模糊,我這邊還沒什麼感受,可能和ui設計有關係吧 這裡有個討論,遇到的朋友可以去瞅瞅

總結

使用creator開發小遊戲總體來說還是蠻舒服的,不過也有一些問題,例如字型無法遠端載入、子域效率不行而且包體很大等等。不過現在引擎釋出速度還是很快的,一些問題的修復還是可以期待的。