読者です 読者をやめる 読者になる 読者になる

ScreenPocket - 画面の隙間

Unityエンジニアの日々の雑記。たまにpython3とDirectXも触ります

CEPHtmlEngineによる高い使用率による問題、の解決策ファイル(DL224.zip)のある場所

全くプログラム関係ないですが、新年早々イライラ案件があったのでメモ。

家のPCでやけにCPU使用率が高く、Adobe製品を立ち上げた覚えもないのに CEPHtmlEngine タスクの使用率が高いことがわかりました。
Photoshopのみインストール済み

で、見つけた記事がこちら。
helpx.adobe.com

解決策1の
>%USERPROFILE%\AppData\Local\Adobe\Creative Cloud Libraries\Logs
フォルダはなかったので、解決策2を参照。

指示通りにフォルダをバックアップを取って、DL224.zipをDLしようとしたら404が…。

どうせ日本語訳の際のリンク貼りミスだろう…、と思ったら案の定、元になったっぽいページから取得することが出来ました。
helpx.adobe.com
↑このページ内のDL224.zipリンクは生きてるっぽい

同じ探す苦労をする人が少しでも減ると良いですね;

Vector3に値を代入する速度を測ってみた

Unityエンジニアなら皆毎日使っているVector3。
値の代入方法は色々ありますが、
そういえば結局どれが早いのだろう?と気になったので測ってみました。

☆環境

  • Unity5.4.3f1
  • PCエディタで計測

☆試した方法

  • 下記4つを10,000,000回ずつ回した
    • new Vector3(x,y,z)を代入
    • Set(x,y,z)で値設定
    • .で直接値書き換え
    • [index]でxyzに値書き換え
	void Update ()
	{
		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test = new Vector3( Random.Range(0f,100f), Random.Range(0f, 100f), Random.Range(0f, 100f) );
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log( "new : " + stopWatch.ElapsedMilliseconds+"ms" );

		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test.Set( Random.Range(0f, 100f), Random.Range(0f, 100f), Random.Range(0f, 100f) );
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log("set : " + stopWatch.ElapsedMilliseconds + "ms");

		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test.x = Random.Range(0f, 100f);
			test.y = Random.Range(0f, 100f);
			test.z = Random.Range(0f, 100f);
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log(". : " + stopWatch.ElapsedMilliseconds + "ms");

		stopWatch.Reset();
		stopWatch.Start();
		for (int i = 0; i < 10000000; ++i)
		{
			test[0] = Random.Range(0f, 100f);
			test[1] = Random.Range(0f, 100f);
			test[2] = Random.Range(0f, 100f);
		}
		stopWatch.Stop();
		UnityEngine.Debug.Log("[] : " + stopWatch.ElapsedMilliseconds + "ms");
	}
new set . []
new : 965ms set : 968ms . : 884ms [] : 1342ms
new : 958ms set : 936ms . : 836ms [] : 1321ms
new : 990ms set : 982ms . : 859ms [] : 1296ms
new : 937ms set : 950ms . : 885ms [] : 1363ms
new : 949ms set : 943ms . : 852ms [] : 1387ms
new : 1015ms set : 974ms . : 877ms [] : 1319ms
new : 963ms set : 946ms . : 876ms [] : 1357ms
new : 980ms set : 939ms . : 852ms [] : 1265ms
new : 993ms set : 980ms . : 895ms [] : 1345ms
new : 959ms set : 935ms . : 847ms [] : 1351ms

とまぁ、こんな結果に。

まぁstructだし.は早かろう。逆に[]は演算子オーバーライドだから重かろうという予想は大体あってました。
で、今回調べようと思ったキッカケのnew Vector3代入と、Set()の負荷比較ですが、
若干ながらSet()の方が軽いっぽい??

new Vector3の代入は、関数の実行タイミングがUpdate()の頭だから重いのかしら??
と思って実行順を替えてみたりもしましたが、大体new Vector3代入とSet()の負荷の差は似たような感じでした。

まぁ1千万回回して大体10ms位の差くらいなので小さな差ではありますが、
チリツモを考えるとnew Vector3代入の代わりにSet()を使っていくのも良いのではないでしょうか。


追記:なお、newとsetを逆にした場合の比較はこちら

set : 990ms new : 1009ms
set : 935ms new : 995ms
set : 930ms new : 964ms
set : 989ms new : 1015ms

ますます差が顕著になったような。

SharedBetweenAnimatorsAttribute メモ

SharedBetweenAnimatorsAttribute を指定すると、メモリフットプリントを削減できるそうな。

docs.unity3d.com

ただ、変数の変更が他のAnimatorにも影響しちゃうみたい?
なので、振る舞いだけを書いた StateMachineBehaviour派生クラスだったら指定してみるのも良いかもしれませんね。

Photoshop クリッピングマスクをOn/Offするスクリプト

ScriptListenerでレコったのをメモ。

選択中レイヤーのクリッピングマスクON

var idGrpL = charIDToTypeID( "GrpL" );
    var desc13 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref7 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref7.putEnumerated( idLyr, idOrdn, idTrgt );
    desc13.putReference( idnull, ref7 );
executeAction( idGrpL, desc13, DialogModes.NO );

選択中レイヤーのクリッピングマスクOFF

var idUngr = charIDToTypeID( "Ungr" );
    var desc11 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref6 = new ActionReference();
        var idLyr = charIDToTypeID( "Lyr " );
        var idOrdn = charIDToTypeID( "Ordn" );
        var idTrgt = charIDToTypeID( "Trgt" );
        ref6.putEnumerated( idLyr, idOrdn, idTrgt );
    desc11.putReference( idnull, ref6 );
executeAction( idUngr, desc11, DialogModes.NO );

後は、選択中のArtLayerがクリッピングマスクかどうか判定できればトグルも作れそうですね

Photoshop CC用Scripting Listenerのダウンロード

地味に迷ったのでリンク紹介だけ

Adobe Photoshop Scripting | Adobe Developer Connection

現状このページの中段くらいにあります。

と思ったら、こっちにもあった。

helpx.adobe.com

後は

qiita.com

この辺とか

オリジナルのスクリプトの作り方 | Dearps

この辺を見ればインストールできるんじゃないかと。

Eclipseから、自作ExtensionBuilderプロジェクトをPhotoshop2015.5で実行する方法

またしてもPhotoshopネタ。
EclipseからPhotoshopのExtensionBuilderの実行に手間取ったのでメモ。

ここに書いておるとおりに、
labs.adobe.com
から、ExtensionBuilder3をダウンロードする。
※zipが落ちてくるけど解凍は不要

  • Eclipseをダウンロードしろ…と書いてあるけれども、その前にJDKをダウンロード(後で必要になるので)

Java SE - Downloads | Oracle Technology Network | Oracle

www.eclipse.org

  • 書いてある通り Help > Install New Software
  • Add... > Archive 選択して先ほどダウンロードしたzipを選択
  • チェックを入れてインストール
  • この辺でEclipse再起動がかかる
  • File > New > Project... 別ウィンドウ開く > Extension Builder 3 > Application Extension Project
  • プロジェクト設定してプロジェクトを作成
  • で、書いてある通りプロジェクトフォルダを右クリックして Run As を選択したのですがエラーダイアログが…

f:id:ScreenPocket:20160918014511p:plain

  • ここで詰まったのですが、結論としては 64bit Windows の場合はパスを入れなおさなければならないっぽい。

forums.adobe.com
f:id:ScreenPocket:20160918020532p:plain

  • 更にエラーが出るのでもういっちょパス合わせ

f:id:ScreenPocket:20160918014935p:plain
CEPServiceBilder4はなかったけど、CEPフォルダで良いっぽいので、それを指定。
赤枠を付け忘れたけど、下のユーザ用フォルダもCEPフォルダに変えておく

コレでとりあえず実行だけはできるようにはなりました…が、まだ自作プロジェクトのエクステンションパネルは出ない模様。

色々調べた結果、マニフェストのバージョンID指定が不足しているようでした。

blogs.adobe.com
を参考に、

  • プロジェクト右クリック→Adobe ExtensionBuilder3 > ManifestEditor
  • ウィンドウが開くのでmanifest.xmlタブを選択し、右クリックXmlEditorを起動

HTML Panel Tips #21: Photoshop CC 2015.5 survival guide | Photoshop, etc.

  • こちらを参考に "14.0" に書き換え(ついでにマニフェストバーションも5.0に)

で、完了!
f:id:ScreenPocket:20160918025058p:plain
ようやくスタートラインです;

Photoshop CC 2015.5 で、自作エクステンションパネルのデバッグを通す方法

またまたUnityとは関係ないですが、初期設定でハマったのでメモ。

主に参考にしたのはこちら
nxpg.net

何はともかくHalloWorldという事でやってみましたが、我が家のPhotoshopCC2015.5ではHalloWorldすら表示できなかった。

そこで見つけたのがこちら。
www.davidebarranca.com

なるほど。PHXSとPHSPを "14.0" にすれば良いのねー。

という事で書き換えて実行してみると、Hallo Worldパネルは読み込めたのですが開こうとするとエラーメッセージが…。

ここでちょっと迷ったのですが、2つ目のリンクを読み進めたところ
> On Windows run Regedit, browse to: HKEY\_CURRENT\_USER/Software/Adobe/CSXS.7
> then add a new PlayerDebugMode key of type String with value 1.
との事。

という事で
regedit起動
 → HKEY_CURRENT_USER/Software/Adpbe/CSXS.7 に文字列キー追加
  → 名前:PlayerDebugMode 値:1

とすることで、めでたくHallo Worldを表示することが出来ました;