ゴールデンウィークにTwitchでゲーム配信を始めた話|古いMacBook Pro・PS4・OBSで配信環境を作ってみた

Image
古いMacBook ProでもTwitch配信はできる?PS4・Switch2用にOBS配信環境を作ってみた ゴールデンウィークで時間があったので、以前から少し興味があったTwitchでのゲーム配信を始めてみました。 アカウントは うえはら000 。 主にストリートファイター6や、趣味で遊んでいるゲームを配信しながら、だらだら話すようなスタイルで配信しています。 この記事では、実際にTwitch配信を始めるまでに用意した機材、古いMacBook Proで配信してみた感想、配信を始めて分かったことをまとめます。 これから「家庭用ゲーム機で配信を始めてみたい」「古いMacでも配信できるのか知りたい」という人の参考になれば嬉しいです。 配信を始めたきっかけ もともと格闘ゲームは好きで、ストリートファイター4シリーズをそれなりに遊んでいました。 スーパーストリートファイターIV AE Ver.2012の頃は、家庭用でやり込みつつ、休みの日に新宿のタイトーステーションにも遊びに行っていました。 当時は、AE時代と比べて大幅に弱体化された後のユンを使っていて、一瞬だけグランドマスターに到達したことがあります。 とはいえ、グランドマスターだった期間は本当に一瞬で、実際にはマスター上位からグランドマスターに届くか届かないかくらいの位置にいることが多かったです。 ちなみに、強かった頃のユンはほとんど触っていません。スパ4AEの頃はまだライトゲーマーで、フェイロンを使っていました。 その後、Ver.2012でユン・ヤンが大きく弱体化されたのですが、対戦しているうちに「弱くなったとはいえ、まだかなり強くないか?」と思うようになり、試しに使い始めました。 使ってみると思った以上に自分に合っていたので、そのまま使い続けて、最終的にグランドマスターに届くところまでやり込みました。 その後、ウルトラストリートファイターIVが発表され、ユンに有利なシステム(赤セビ)やキャラ自体の強化も追加されました。ユンは再び強キャラの一角に戻ったのですが、当時は大学受験の時期と重なってしまい、ほとんどプレイできませんでした。 受験が終わった後も、大学生活や社会人生活がそれなりに忙しく、気づけばストリートファイターからはかなり離れていました。 他のゲームはちょくちょく遊んでいたものの、ストリートファイターを本格的...

「問題解決力を鍛える!アルゴリズムとデータ構造」とLeetCodeで学ぶ再帰と動的計画法(メモ化)

再帰とメモ化

問題解決力を鍛える!アルゴリズムとデータ構造
というアルゴリズムとデータ構造を学ぶのに良い本があります。

LeetCodeの問題を解いていた時に、この本の中で解説されていた例とすごく被っている内容があったので、記事にしてみようと思いました。

問題

1137. N-th Tribonacci Number

難易度はEasy。
再帰の入門にうってつけです。

問題解決力を鍛える!アルゴリズムとデータ構造の4章の解説にもある通り、再帰関数のテンプレートは

(戻り値の型) func(引数){
	if(ベースケース){
		return ベースケースに対する値;
	}
	func(次の引数)
	return 答え
}

問題解決力を鍛える!アルゴリズムとデータ構造 第4章 設計技法(2):再帰と分割統治法より引用

といったものです。

今回解く問題は、

トリボナッチ数列Tnは次のように定義される。

T0 = 0, T1 = 1, T2 = 1, そして n >= 0 で Tn+3 = Tn + Tn+1 + Tn+2 となる。

nが与えられたとき、Tnの値を返す。

という内容です。

では、こちらをPythonでかつ再帰で解いてみましょう。

class Solution:
    def tribonacci(self, n: int) -> int:
        if n == 0:
            return 0
        elif n == 1 or n == 2:
            return 1
        return self.tribonacci(n-1) + self.tribonacci(n-2) + self.tribonacci(n-3)
# Time Limit Exceeded

しかし、これだとnが 30の時に時間切れとなり、正解とは認められません。

これは再帰で同じ処理が重複し、関数の呼び出し回数がとてつもない回数になっているためです。

ではこれを解決してみましょう。

class Solution:
    def tribonacci(self, n: int) -> int:
        memo = collections.defaultdict(int)
        memo[0], memo[1], memo[2] = 0,1,1
        for i in range(3,n+1):
            memo[i] = memo[i-1] + memo[i-2] + memo[i-3]
        return memo[n]
# Runtime: 28 ms, faster than 80.87% of Python3 online submissions for N-th Tribonacci Number.
# Memory Usage: 14.3 MB, less than 13.79% of Python3 online submissions for N-th Tribonacci Number.

この解法では一度計算したものをmemoという変数に保存し、仮に計算済みであれば関数を呼び出すのではなく値を直接返すようにしています。これをキャッシュといい、高速化するための手法です。

どうでしょうか。

これ以外にも問題を解決するための思考法などが満載の素晴らしい本なので、問題解決力を鍛える!アルゴリズムとデータ構造を買って実際に勉強されてみるといいかと思います。

今回はここまで。お疲れ様でした。

Comments

Popular posts from this blog

【OSLog】How to log a Swift project

Principles of UX/UI Designでこんなことを学んでいるよ 第一週 User-centerd design①

Swiftで使うQueueのテンプレート