2019年4月27日土曜日

LSLバックステージがネット上から消えたので 要約掲載 高速化編

のでまぁテクニックのところだけでも抜粋して
何回かに分けて乗っけとくこととする

でまぁ更に適当に抜粋に抜粋して要約する

3.1高速化手法

3.1.1定数演算は演算結果を書く

なんかLSLコンパイラで計算結果が変わらない定数演算も
そのままアセンブラコードにしちゃうらしいので
定数計算はコメントアウトして計算結果だけ代入しとけとのこと

ただこれも過剰にやると可読性が死ぬので
秒単位で演算時間が変わるような長大ループとか

ミリ秒単位で処理時間圧縮したい場合に有用

ワイの場合メモリに余裕あれば初期化処理してグローバル変数にぶっこむかな

変数間移動とハードコーディング数値の代入では前者が早い

3.1.2ループ中で計算結果の変わらない異処理はループの外に出す

for文とかで比較対象の固定数値をいちいちllList2とか使うと
なんかループの回数分list2が実行されちゃうらしく

先に変数に代入しとけということのようだ

これはllList2系命令の処理の食われ方からしても妥当やな


まぁこれもうちょい短縮方法ある

Listに対して固定でなんかするループ処理の場合
リスト長の変数自体をインクリメントなりデクリメントなりして
whileでぶん回すと結構な短縮になる

llist length = llGetListLength(Holge);

do{
    (何らかの処理)
    --length;
}while(hoge>-1);

これまぁリンクセットダンプとかでも使える


3.1.3 短い処理は インライン展開

なんでもかんでも関数定義して投げるなって話っぽい

概ね10演算子辺りがボーダーらしいので

複数箇所から呼び出すことがわかってる処理以外は
可能な限りユーザー関数使うなみたいな感じだな

これも秒オーダーで処理時間変わるループや
ミリ秒オーダーでイベント終わらせる必要がある場合以外は
割と無視していいが 最後の詰めに使えるな


3.1.4 インクリメント・デクリメント

i++;
より
++i;
の方がアセンブラコードになったときに2命令文圧縮できるとのこと
これは普段使いではくせにしちゃっていいと思う

で更に

ビット反転した後に符号反転すると+1したことになるとかで

a=-(~a); // ++a と等価

符号反転してからビット反転すると-1したことになるとかで

b=~(-b); // --b と等価


という記述方法が紹介されているけど
これも山ほど動かしたり
ミリ秒オーダーじゃないかぎりそこまでは不要かなぁ


3.1.5 ローカル変数は宣言時に初期化する

これはまぁちょっとわかりにくいな

ゼロやNULLで宣言しておく分には関係ない話
特定の数値代入して初期化する際に
宣言と代入と分けずに 宣言即代入したほうが早い

integer i;
i=5;

とするより

integer i =5;

こっちのほうが2命令文早いとのこと

これもミ(ry

3.1.6 同じ値を複数の変数に代入

同じ数値なら=でチェーン記述したほうがええということらしい

a = 0;
b = 0;

よりも

a = b = 0;

のほうが効率的とのこと

3.1.7 ローカル変数VSグローバル変数

ローカル変数の方が確保と開放の処理分ちょい重いとのこと

これは体感としてスタックヒープコリジョンの対策でちょい有効
ループカウンタの変数とか文字列入れる一時変数とか
その辺をグローバル定義するとメモリ圧縮になることもなる


3.1.8 リストへの値の追加

リストへ値を一つ追加する場合は []で囲わなくても
そのまま+=でいけるとのこと

これもリスト初期化処理とかで便利かなぁというところだけど
可読性とのトレードオフがあるから使い所は選ぶね

3.1.9 文字列定数、リスト定数のグローバル変数宣言

これもあれだな グローバル変数定義だと
ローカル変数定義時みたいに確保と削除が無い分

ポインタ参照的な挙動になって高速化するというやつだな

1.0.10 ビット演算を用いた、条件判定の高速化

ちょっとこれ要約するの無理だなぁ
integer値が32までならビット演算で複数の範囲判定が同時に行えるという話

3.1.11 list の長さの非0 判定

listの長さがゼロで無い判定
(lst!=[])
listの長さがゼロの判定
(lst==[])

3.1.12 llGetListLength() [互換性に注意]

ちょっとこれ衝撃だなぁ

integer len = llGetListLength(a);
これは
integer len = (a != []);

こう置き換え可能で listの!=演算が単純なブーリアン値ではなく
リストの長さの差分を計算するプログラムになってるんだってさ

で更に空リストをグローバル変数定義すれば高速化するとのこと

list null_list = []; // グローバル変数として宣言しておく
integer len = (a!=null_list);

ただしこの処理自体を関数化すると相殺されるらしいので
使い所ってことだと結構微妙かなぁ

でまぁこれこれちょっと今使えるかどうかわかんないなぁ


//-------------------------------------------------------------------------------

高速化の章の話はこれで終わり

常用するのはインクリメント・デクリメントと
あと代入処理のチェーンくらいかなぁ

計算結果定数の記述はまぁ詰めでやるくらいでいいかねと


以上

2019年4月1日月曜日

20191031 [怪文書]コンテンツ業界における貨幣経済圏と感情経済圏のお話

くっそ長くなったので怪文書として04/01投稿とする

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

正直ソーシャルベースでの
コンテンツの話ということだとねぇ

買う側が許容するクオリティの最低ラインて
案外高いのよ

でまぁそれ未満だとそもそも相手にされなくて
じゃぁどうすればええのかって話だと

一部のオタクさん方面の人らが
”ごまかし”とか”ズル”とか
言っちゃうような手法が必要になる

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

アマチュアクリエイティブの周りだと
そういうハックやテックを
極端に嫌う人たちがおって

じゃそういう人らが作るもんが
売れるようなコンテンツになってるかというと
ならねぇのよね 工数ベースで既に赤字だから

ほいでまぁそこで面倒な話になる

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

要はなんでそういうの使わないのかという話

そういうの使うとね
対象市場がグローバルになっちゃってさ

世界のトップランナーと戦うことを強いられるの
戦うステージが上がっちゃうのよね

クラスやサークルで一番絵がうまい程度の人間でも
pixivランキングとかだと100位入れない的な話

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

なのでやり方としては

”やり方を評価するニッチなコミュニティ”や
”そもそものコンテンツが少ないジャンル”
に向けてコンテンツ供給するという
生存戦略が考えられるわけなんだけど

そもそもそんな小規模なところで
生きられるだけの対価が得られるのか?と

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

そのへんでまぁお話としては
仮の話としてなんだけど

”貨幣経済圏”と”感情経済圏”が大雑把にあるの

両方ともある程度等価交換が成立するの
でまぁ代表例としてあくまで現状での話ということだと

MMDは感情経済圏で
VRChatは大筋で貨幣経済圏なのよ

でまぁなんというかそこでも面倒な話がある

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

感情経済圏ってさ

得られる対価で物理身体の維持が出来ねぇのよ
というか貨幣経済的な対価を得ることが

現状の法律や各種コンテンツガイドラインや
慣例では実質的に不可能なのよ

だから感情経済圏って名称を仮で使うわけなのだが
じゃぁ具体的な対価と価格って何よ?という話

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

ほんともう大雑把に大げさに表現するけど

星での5段階評価が存在します

星0は興味なし 星1は25点 星2は50点
星3は100点 星4は400点 星5は5000兆点

でこれには実際のところマイナスの星もあるのだが
”感情の振れ幅”ということだと
マイナスの星もそれはそれで価値が存在するの

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

でまぁ基本 感情経済圏では

そもそもの評価基準が個人で違うわけよ
等価交換という話だと星4以上のものにしか
価値があるように見えないように見えて

実際には5000兆点が1単位として取引されてるのね

いいねが+5000兆点 badが-5000兆点 興味なしが0

で最近のトレンドは”表示しない”手法

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

要は 5000兆点以外の評価ボタンが存在しないの

等価交換の手法として
そもそも5000兆点の評価を対価として出さないやつには
コンテンツを供給しません

という感じの話になる
まぁちょっとこの辺は面倒な話だなぁと

ちなみに感情経済圏での
個人資産額は∞です 無限大

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

ほんで 感情経済圏で活動する人間に対して

物理身体を維持するコストを賄う方法として

太古から存在する
パトロン制度とかそういうお話なわけよと

自分の経済状況から可能な限りの”全て”を
貨幣経済的な対価で支払うという仕組み

なので本来そこに”コスパ”みたいなのは存在しない

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

随分話が長くなっちゃったねぇ

まぁ要は 実際のところの話としては

感情経済圏の話ということだと
どんな値札がついていようが
買うか 買わないか 以外の選択肢がないの
財布は常に無限大なので

でまぁ 貨幣経済的に困窮していて
買えない というのはもちろんあるんだけど
それは別のお話なの

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

感情経済圏の財布は実質無限大で
そもそもの値札が存在しない
という話をしたところで

貨幣経済圏の話だと

”買うに値するかどうか”を値踏みするようになる
でまぁそうなると

そこで星の5段階評価が出てくるわけよ
要は貨幣経済圏のコンテンツに関しては
”タダでも要らない”が出てくるわけさという

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

もちろんあれよ
”タダでも要らないが仕方なく使ってやる”
みたいなことを
コンテンツに関して言う連中は
相手にしちゃダメよそもそも

ほいでまぁ貨幣経済圏だと
金払うのは最低限の礼儀で
”二度目はない”って切るのもそれはそれで正当なのよ

後払い方式は無理だねぇそういう意味だと

2019年3月7日木曜日

BENTOでのハンドコントロールについて

まぁ何をいまさらという感じですが
実際に制御ロジック組んでみての話

BENTOのハンドやグローブを作って売る場合には

「BENTOハンド対応のAO使う前提」

最低限の知識としてこれは覚えておいたほうがいい
あるいは売るほうが説明する必要があるなという感じ


理由は
既存のアニメの様に
「アニメ停止したらニュートラルポジションに自動で戻る」なんて
そんな親切な仕組みはない
アニメ停止したら停止したときのフレームで止まりっぱなしになる


ほんじゃなんでそんなとこになるのかというと

既存のSLアニメは任意アニメ停止すると

即Internal Animation(システム標準アニメ)で上書きされるんだわ
ほんでSLのInternal AnimationにはBENTOで新規追加されたボーンに関して
全くのノータッチなので

BENTOハンドのアニメを停止すると文字通りの”停止”になり
ニュートラルに復帰しない
AO無しでリログすると実際ハンドがパーの形になる



なのでまぁこれの解決策はいくつかあるんだが
一番簡単なのは「BENTOハンド対応のAOを使うこと」なんだよねぇと

ハンド自体にアニメとスクリプトを組み込む方法は推奨しない

現状市販されているBENTOハンドやグローブを観測した結果
全部が左右別オブジェクト扱いで装着させてるので
両方にニュートラルにするだけのスクリプト入れたらそれこそクソオモになる


大体この辺かねぇ

以上

2018年12月2日日曜日

SANSARの決裁がSteam対応することについてのお話

結構思ってた"最悪"よりはマシという印象
 
ソース
https://modemworld.me/2018/10/31/sansar-extends-to-steam-lab-to-end-sandex/
https://modemworld.me/2018/11/02/2018-sansar-product-meetings-44-steam-with-audio/
https://modemworld.me/2015/11/04/linden-lab-and-tilia-inc-speculations-on-the-labs-new-subsidiary/

とりま今回の要点
 
・SANDEXが廃止というだけでS$は残る
・steamウォレットでS$が購入できるようになる
・S$購入レートは維持(1US$/100S$)
・SANSARのマケプレでの取引手数料(15%)が廃止(そんなにとってたのかYO!)
・引き出しレートの大幅な引き下げ(143S$/1US$から 250S$/1US$)
・S$の引き出しが"売上金"に限定される(自分で買ったS$の払い戻しは無理)
・S$はUSDに換金後の引き出しに30日の待ちが必要になる(長すぎぃ)
 
 
要はまぁ額面での売上が激減するし支払いまでに一ヶ月かかるようになるという話だな
ゼロになるわけじゃない
かというてS$の売上で"ギリギリ食ってた"連中は餓死するかもしれん
 
 
ただもう想定される最悪のシナリオ
S$廃止でマケプレ売上が
steamウォレットに
チャージされるようになって
一切換金できなくなりあぼーん
"ではない"
 
のでとりま安心かもねぇ
取り分減ること自体は全く変わらないのだけど

仕組み的には日本人に馴染みがあるプラットフォームてことなら
LINEのクリエイターズマーケットとかに近いかなぁという印象
 

最悪のパターンだった場合
それこそかなりグレーなルートで"現金化"する手法を使わないといけなくなったので
まぁそこまでする必要はないからとりまえず安心でいいんじゃないのという
 

とりまこの辺かなぁ

以上

2018年8月28日火曜日

新人3DクリエイターやVRC住民向け想定リスクリスト

とりあえずはVRC
今後新しいアマチュアクリエイティブの場が出来るたびにおきる想定

・コミュニティ内で可能な限り"先輩"や"師匠"と呼べるような人を見つけておけ
 作品を出す前の予防策や 何か気になるようなことを見つけた場合に
 判断基準に出来るような意見を得られる人を得ておくこと
 
 これをやらずにソロで暴走して追い出されたり燃え尽きていった新人は山程おる
 逆にこれの選定に失敗して潰れちゃった人も結構おるけどねぇ

・素材やキャラクタモデルのライセンスはちゃんと読んどけ
 "商用利用禁止"や”改変・再配布禁止”等のワードがある場合
 通称"お気持ち合戦"に巻き込まれて余計なリスクやトラブルを抱えることがあるので
 そのアセットは基本使えないものだと思ったほうがええ

・とりあえず異様に出来が良い版権コンテンツはrippedや違法コピーを疑え
 というか公式からのコラボしますのプレリリースや
 アバター自体に公式コンテンツ表記ナシで出てる時点で何かがおかしい

・自由に利用可能な3Dモデル素材配布サイトなんて便利なものは
 最初から存在しないと思え

 てのがもう どこにrippedコンテンツが混ざったキメラがあるかわからないからだ
 カード登録必須で運営の身元がはっきりしてるところは別と考えてもいいが油断禁物

・自作品が人気コンテンツになった時点で不正コピーの標的になることは想定しろ
 DMCA申請がしやすいように時系列で制作過程とマスターデータの記録を取れ



・部品の一部がripped みたいなキメラを自作と称して公開して
 あまつさえコミッションと称してカネを取ろうとする不届き者は
 絶対に現れるので 警戒しろ
 
・あらゆる手を尽くしてタダでなんかやらそうとする
 "企業"や"自称プロ"や"団体"が現れるから気をつけろ

・新しいプラットフォームではコンテンツ絶対数が不足している間に
 短期で需要が高い高品質なものを作って成り上がるという手が使えるが
 有名になれば過去の行動は全部調べられて後ろめたいこと等は晒されるので
 敵を作らないように品行方正に生きるか 新しく人格を形成しろ



・情報が出揃っていない状態での憶測での行動は危険
 この辺はまぁ MMD vs VRC
 みたいな状態にしようとしてた人らを見てわかってるとは思う
 
 現状の確認 と 間違った情報の訂正 は正しい行動をするための基本

 
・とりま積極的にコンテンツ供給をしたり
 コミュニティに参加したり貢献する気がないなら MMDには関わるな

 コミュニティに参加したり貢献する気がない部外者が関わると基本碌なことがない
 MMDはファンコミュニティでありMMDのアセットは全てMMD専用のものだ
 MMDは貴様の便利な無料アセット置き場ではない
 

とりあえずとしてはこの辺かなぁ
あとなんかあったら随時追記ってことで

以上

2018年3月4日日曜日

公道最強理論 2018年

クルマとして最低限クリアすべきファクターは 4つなんだよ

 
・旋回レートの安定化

・加速レートの安定化

・ブレーキングの実装
 
・まともに車庫入れが出来ること

全部もう両立可能ではある
 

でまぁ 今回は加速レートの安定化と旋回レートの安定化の話


旋回レートと加速レートの安定は相互で関わるわけよ
 
ギアアップするとパワーアップするのは
クルマとしてはおかしいわけよ常識的に考えて
 
加速力ってのは最高速度アップで下がっていくのが
自然の摂理なわけよ パワーバンドとは別の話な
 
じゃぁなんで既存カースクリプトは ギア=パワーなのか

理由はスクリプト内部の数式観察すると簡単なんだよな



その前に高校物理の初歩でやる簡単な数式
a(加速度) = v(最高速度)/t(加速時間)

単純にこうな


でもって SLのヴィークルで直接指定可能なのは
最高速度
VEHICLE_LINEAR_MOTOR_DIRECTION
http://wiki.secondlife.com/wiki/VEHICLE_LINEAR_MOTOR_DIRECTION

加速時間
VEHICLE_LINEAR_MOTOR_TIMESCALE
http://wiki.secondlife.com/wiki/VEHICLE_LINEAR_MOTOR_TIMESCALE/
のみなので

大体ギア(最高速度)をList使って可変にするんよ
そうすると 加速時間が一緒で最高速度が増えるから
そりゃ加速力が向上するわな? 簡単なお話だ



ワイとかよく比喩表現として
"SLのヴィークルは思いで駆動する"とか言うわけよー
物理法則的にはパワーから加速時間が決定するからな



なので加速レートを安定させたければ
 
単純に
t(加速時間)=v(最高速度)/a(加速度)
の数式で加速時間を決定してやればいい


で、
この数式を単純に入れるだけではちょっとした問題が出てくる

VEHICLE_LINEAR_MOTOR_TIMESCALE

これの下限が0.1なんだよな
なので 0-100km/h加速を例えば3秒とかにしたとして

大雑把に27m/sec 加速度は9m/sec^2 大体0.9Gくらいかな

SLでまぁまともな登坂能力欲しかったら最低でも2Gくらい要るのよ大雑把に
でも速度は出したくない 歩く速度程度 5km/hくらいがいい

そうなると

1.38/20=0.069

0.1切りますな

でまぁこうなる場合は
VEHICLE_LINEAR_MOTOR_DIRECTIONを
加速時間が0.5秒くらいになる適当な数値にして
本来設定したい最高速度に達したらモーターをカットすればいい

あともうこれでパワーバンドみたいな概念も直感的な
加速度という数値で入れられるようになる やったね!


参考程度に ということで
ちょっと既存のヴィークルについて計算してみるか
一般にレース用ヴィークル言われてるやつは
1秒程度で時速300キロに達する
加速度的には 8.5Gくらいか 参考に調べたらドドンパが3.75G

83.3/83.3=1.00 まぁこのレートでも最高速度ならあんまり関係ないな




次 旋回レートの安定のお話

実は加速レートが全ギアで安定してしまえば
旋回レートって既存のロジックでも安定しちゃうのよ
ただし超高速領域でクリップしてしまうのでそこはどうにかせんとアカン

VEHICLE_ANGULAR_MOTOR_DIRECTION

日本語だと書いてないけど 英語なら 4PIと書いてある
この数値案外すぐ突破しちゃうんだよな せいぜい12.56くらいなので
 
アーロン系のスクリプトだと大体適切な係数がせいぜい2.5から3.0前後
 
12.56*3.0*3.6=135.048

12.56*2.5*3.6=113.04

時速だと135キロ程度がステアリングが
リニアに効くMAXだということになる
 
DTCARだとその辺はそもそも関係ない
速度でターンレートが下がる数式なので


でまぁ4PIでクリップするなら
それ以上をインパルスとかを使ってアシストすりゃええんだけど
ちゃんと計算してアシストしてやらんとすっ飛ぶし
ヴィークルパラメータの限界はそのままだから
アンダーステア等の問題が出てくるのだ

そっちもインパルスで押し込めばいいんだけどな
その辺の計算は理屈がわかってりゃ単純っちゃ単純だよ

大体この辺かねぇ
以上

2018年2月15日木曜日

BENTOハンド制御HUDの雛形 的なお話 仕様想定編

ちょー雑にやるよ

あくまで仕様想定のみなので実際の実装はそのうち書くかもしれんが
基本的には各自なんとかしてください

・必要そうな変数の想定

とりあえず左右別制御だからLRの二種類は必要

インジケータの点灯認識に必要そうなのでラストリンクナンバー

integer lst_anim_num_L;
integer lst_anim_num_R;

アニメ止めるのに必要そうなのでラストアニメネーム

string lst_anim_name_L;
string lst_anim_name_R;



・アニメーション名称のフォーマット

Lhand_XXX
Rhand_XXX

こんなもんかな XXXは連番の数字 3桁 001~999まで
ボタンプリムの名称も同じにすることで
収納と展開の処理もオートに出来るんじゃないのという想定

このフォーマットになっていないボタンは
別の機能ボタン あるいは背景として最初の方でif文で弾けばいい

アニメボタンのif文後にreturn入れれば
アニメボタンのレスポンスがスポイルされることはないんじゃねぇかなぁ



・ボタンのLRとか番号とかやるためのIF文

基本的に llDetectedLinkNumber からの llGetLinkName で

名称の先頭1文字でLR判定 後ろから3文字で番号判定
抽出はllGetSubString でいいだろ




・タッチ時の挙動
 
まず押されたボタンのLRと番号をチェック

ラストアニメと押されたアニメが一緒の場合
 停止してインジケータ消灯 でreturn

ラストアニメと押されたアニメが別の場合
 ラストアニメが空白でなければ停止してインジケータを消灯後に
 押されたアニメを再生してインジケータを点灯
 
 ラストアニメに再生したアニメ名を入れて
 ラストリンクナンバーにリンクナンバーを入れる


アニメのボタンでない場合
 展開格納の制御等の処理?



・その他気をつけること
 通常のAOのようなアニメの全停止処理を入れると割とまずい
 外した時にアニメ停止するかどうかは判断が別れると思われ
 停止したほうがいいと思うけどねぇ



・展開と収納の処理

全プリムスキャンしてボタン番号を調べて

除算と余りを使って位置を確定して
等間隔にグリッド配置すりゃええでしょう

大体この辺かな

以上