C#のstringがクッソ重たい件 #高速化

 

構文解析する際に、

 

stringにcharを万単位で追加することがあって

 

text += c; を永遠と繰り返す単純なコードで10秒くらいかかってた。

 

そこでStringBuilderを使ってみる。

 

StringBuilder builder = new StringBuilder();

builder.Append(c); 

 

これだけで0.05秒になった。

 

とんでもなく爆速。

UnityのLow-Level Native Plugin Interface

Unityには、LowLevelNativePluginInterfaceというものがあって
C++で直に描画apiを叩けます。

https://docs.unity3d.com/Manual/NativePluginInterface.html

ですが、公式ではGL.issueplugineventのサンプルしかあらず
CommandBufferに乗せる方法やGameビューとシーンビュー両方表示する
機能が存在してなかったので、はっときます

ちなみに、カメラ毎に並列描画してないので、マルチスレッドの対策としては
issuplugineventの実行事に、DirectXでいうClearからPresentまでの処理を詰め込んで実行すればいい。
描画リソースに関してはゲーム側でReleaseされたとしても参照カウント形式で使い終わるまで保持すればいい。

それと描画の設計は、
1Frameで使うリソース × 遅延するフレームの数
を用意して、使ってないフレーム用リソースに書き込んでいって

一番古い順からissuplugineventで実行がいいんかね。

public class RenderingTest : MonoBehaviour
{
    private const CameraEvent RENDER_PASS = CameraEvent.BeforeForwardOpaque;
    
    public Camera camera_;
    public CommandBuffer command_;

    void Start()
    {
        camera_ = GetComponent<Camera>();
        command_ = new CommandBuffer();
        command_.name = "Use Rendering Plugin";
        command_.IssuePluginEvent(UseRenderingPlugin.GetRenderEventFunc(), 1);

        camera_.AddCommandBuffer(RENDER_PASS, command_);

        foreach (Camera sceneCamera in UnityEditor.SceneView.GetAllSceneCameras())
        {
            if (sceneCamera.cameraType == CameraType.SceneView)
            {
                sceneCamera.AddCommandBuffer(RENDER_PASS, command_);
            }
        }

    }

    public void OnDisable()
    {
        foreach (var sceneCamera in UnityEditor.SceneView.GetAllSceneCameras())
        {
            sceneCamera.RemoveCommandBuffer(RENDER_PASS, command_);
        }
        camera_.RemoveCommandBuffer(RENDER_PASS, command_);
    }


    void OnPostRender()
    {
        UseRenderingPlugin.SetTimeFromUnity(Time.timeSinceLevelLoad);
    }
    private void OnPreRender()
    {
        /**/
    }
}

ゲーム系専門学校の闇について

前置き

筆者はゲーム系専門学校卒業をしていて、

自分の実体験から語っています。

全てがこういった学校じゃないこともしってはいますが

それでも一括りにしてしまうほどに近年は危機感を持ってほしいと思いました・・。

間違った道を進むとみんな不幸になりますから・・。

 
専門学校ってどういう所

 

まず、ゲームの専門学校というと、大学とは違って専門性を重視といった形になるのが一般的だ。

専門性というのは、ゲーム作り全般のことを指す。

 

逆に大学は、ゲーム以外に数学、物理、一般教養を学ぶのが一般的だろう。

 

授業の質

ゲーム分野を目指すときに、自分に合った内容の授業、先生が居ることが

とても大切なことだと思います。

いくら技術のある先生でも、ちゃんと面倒見てくれないなら困るしな…

逆に授業の質という点ではどうだろうか。

 

大学も専門もやってることはそう変わらず。

いかにも技術!って感じの専門用語出してきて内容聞いたら言われたことを言われた通りやってただけとか、実はそんな難しいことしてなかったとかよくあるある

結局、その人のポテンシャル、将来性や基礎ができているかどうか

に尽きると思った。

 

 

学力低下

最近の学生はレベルがとてつもなく下がっている。

原因はUnityやUE4といった、苦労せずにそこそこ作れてしまうツールが

登場してしまったからなのは間違いない。

 

なぜ、それがレベル低下につながるのかというと、

実はプログラミングというのは一つ一つの作業はとてもシンプルで

組み合わせが複雑な故に難解化しがちなのである。

それらをうまく組み合わせられる力が必要なのに対して

Unity,UE4はそれらをすべてすっ飛ばして開発ができる。

 

ただし、これらのスキル不足はゲーム開発後半から響いてくる。

まず、マスターアップ直前の最適化。これは恐らく生半可なスキルでは無理だろう。

最近の子は何かと面倒な仕事をしたがらない。

やってないのだから、できるはずがないのである。…悲しい。

 

次に苦労するのが、他人のバグ修正

近年、コンシューマゲーム開発は膨大すぎる作業量故に、

効率化を測る会社が多い。ツール作りだ。

そのツールは、もうすでに退社してしまった者が作り出したコードの束だ。

一人ひとり考え方が違うように、その人なりのコーディングスタイルや構築技法がある。どんな中身でもきちんと動作して目的を果たしているのなら会社としては大きな成果物となる。

もちろん、それを保守するというのも大きな役目だ。

まず、それらのコードを読み解くのは自分でコードを書くよりも難しい。謎のマクロ、変数名、書き方の癖、それらと立ち向かうには

基本がないとどうしようもない。

Unityでゲーム作ってましたなんか言われても

プログラミングできないだろお前プログラマーじゃなくてプランナーだろとか言われようが仕方ない。

 

本題に

話がそれてしまったが、本題に戻る。

ゲーム系の専門学校は闇だ。

ただし、その闇をかいくぐる天才もまた存在する。

それは集団の法則から出来上がる各学校に1人は必ず存在する頂点的存在。

彼、彼女は指定校やAO入試といった学力がないのに学校に入ってしまった

生徒たちを跳ね除け、一人で黙々と勉強し、

一人でゲームジャムや社会交流を行い

最後までほぼ一人で完結していくやつのことを指す。

 

さらにその中でも、稀に、会社が欲しているスキルセットに合致する人が出てくる。

そういった人間だけが有名な会社に入っていくのである。

 

それ以外の学生はというと

・田舎に帰る(ニート?)

・年収が200万くらいのブラック会社

・コンビニ、居酒屋のアルバイト

 

が主な就職先である。

例外はあって、最近VRというものが流行りだして目先の資金はあるので

一時的に大量雇用が働いてるらしい。

今後続くかどうかはわからないけどね…(そういうものが長く続いたことはない... 社会人て40年近くあるのに20年しか続かなかったら終わりだよね)

 

 

以上、専門学校の闇でした

iPad6を買った。 控えめに言っても言わなくても最高

iPadを買いました

iPad6をついに購入してしまった。

 

ここ最近は何かとiOS, Macでの作業も多いので

思想設計を慣らす というのが目的だったが想定以上だった。

 

ディスプレイ、発色が超きれい

とてつもなくキレイ。

どのくらい綺麗かって、ディズニーランドに入園した瞬間のあの画面、視覚が切り替わるような

あの感覚。癖になる。

 

高速に動作する

一応、プログラマーなのでスペックはかなり気にするほうだ。

iPad6はA10というコアを備えている。

これはiPat6 proに比べると若干劣ってはいるが

その辺のPCと大してスペックは変わらない。

試しに3Dのアプリや文字入力、複数動作テストなどを行ってみたが

驚くほど快適に作業ができる。これは便利だ。

(筆者は過去にiPad2iPhone5を持っていたが、ここ数年で大きな改革があったように感じる。それくらいに使いやすい、持ちやすい、軽い、かるい)

充電が長持ちする

とてつもなく、充電が長持ちする。

SINoAliceなんかはマルチスレッドを使っていて充電の減りが早いはずなんだが

そんなこともない。1日遊んでいても充電が残っていた。最強か。

これ、課金ガチの人とかは古いiPad,iPhone使ってるなら買い替えたほうが絶対にいい。

アプリやってる時間を損してる。逆に言うなら、アプリがもっと楽しく感じる!

 

アプリの楽しさ

ゲームやってるとき、面白い、楽しいって感じる要素って色々あって

  • 音とゲームの動作が一致したとき
  • グラフィックスが超きれい
  • (グラフィックスが綺麗ってのは技術的に高度なのか、だましの技術で目がバカで綺麗に見えちゃうとかはまた別のお話)
  • ぬるぬる動作する
  • 充電でいちいち作業中断されないストレスフリー
  • 持ち運びしやすい
  • シナリオ、動き、作業に没頭できるか。(中毒性、反復したいって思わせる気持ち!)

色々あって、それぞれがどのくらいの割合を必要とするかは置いておいて

ゲーム以外の要素をゲーム側がどうにかすることはできない。

最高の音質、最高のグラフィックス、最高の動作環境

シンプルに3つにしたとき、この3つが成り立つのは、

全て動作環境次第なのである。端末がよくなきゃ音はショボいし見た目も嫌だ。

レスポンスが悪いと何度も遊びたいって欲求が消し飛ぶ。

これが一番のデバイス買い替えの要因かな。

 

金の問題

ケチるな。

ケチったら、その分損する。間違いない。

iPad6は今128GBで5万。新宿のappleストアのお姉さんも美人だ。

買うしかない。

 

 

以上、独り言です。

unity androidビルドできない問題

 

UnityでAndroidビルドに失敗する

最近、android sdkがandroidstudio付属になって

SDKManagerが消えちゃったみたいです。

 

しかもrequireなんちゃらってエラーが出てくる。

 

Unity2017でビルドしたい!
  1. まず、android-sdk_r24-windowsをダウンロードします。(r25以降はSDKManagerがない)
  2. 中にあるSDKManagerを起動
  3. android sdk build-tools 25.000以上をダウンロード
  4. jdk8u171をダウンロード。(最新ののjdk10は動かん)
  5. UnityのPreferenceでjdksdkのパス設定
  6. 完了
Unity2018でビルドしたい!
  1. 2017のやり方のSDKのバージョンを最新にすれば大体おk
  2. androidsdkの場所はC\:ユーザー名\appdataあたりに転がってたと思う。ネットで調べれば後の作業は補完できます

 

以上、作業メモ程度ですが

 

ほんと、AndroidStudioはコロコロ変わって不便ですねえ・・。

かといってXCodeもだるいし、モバイルめんどい!以上

GENieのビルド方法

Premakeとは

https://github.com/premake/premake-core

GENieとは

https://github.com/bkaradzic/genie/blob/master/docs/scripting-reference.md#scripting-reference

 

GENieはpremake4.4 beta5から派生しただけで、仕組みはほぼ一緒ですね。

 

ただし、GENieの方が、XCode9やSwitch, XBox,PS4とサポートされている
プラットフォームモジュールが多いですね。

 

------------------------------

 

では、Windowsビルド手順

 

手順1. WinGWのインストール

http://www.mingw.org/

ここからインストール。 するとセットアップマネージャがあるので
mingw32-base」と「mingw32-gcc-g++」にチェックを入れてインストール

 

 

環境変数のPathにC:\MinGW\bin;を追加。

 

https://github.com/bkaradzic/GENie

 

リポジトリを落としてきて、コマンドラインから、フォルダトップで

 

mingw32-make OS=windows

 

すると bin/に出来てる。

 

手順2.  luaファイルをまとめる

 bin/以下のexeが出来たフォルダーへ移動して

 

genie embed

 

これで、srcのscript.cの中に全てのluaファイルがまとめられる

 

手順3. 再度ビルド

再度、手順1の通り、コマンドを打つ。

 

mingw32-make OS=windows clean
mingw32-make OS=windows

 

 これでリビルド&.luaの書き換えが反映されたものが出来る。

 

以上!

Mac版ソースツリー GitlabからCloneで永遠とpasswordを聞かれる。 denined!

 

これは、

2段階認証のせいで、

private tokenがパスワードになるらしい。

 

Profile settingでキーがあるからそれをpasswordに入れれば動く。

 

 

かと、思いきや SourceTree 2.7.1では永遠とパスワードを効いてくる。


1.98版のソースツリーを持って来れば動きます。

 

一度Cloneしてしまえば、なんとVer2.7.1でも動くという

なんとも。。。