Discuss Scratch
- Discussion Forums
- » 日本語
- » Scratch 3.0 をハック(動作や構造を解析すること)しよう!
- inoking
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
何をしたいかという程度にもよりますが
このトピックを最初から見ていくだけで一次情報になると思います。
その中にある Scratch 3.0の拡張機能を作ってみよう などは特に有用です。
JavaScript はまともに扱ったこともない私でさえ
「数週間単位の時間や最低数千円単位の書籍代」もかけることなく、
ポイントを絞ればソースの解析はできています。
このトピックを最初から見ていくだけで一次情報になると思います。
その中にある Scratch 3.0の拡張機能を作ってみよう などは特に有用です。
JavaScript はまともに扱ったこともない私でさえ
「数週間単位の時間や最低数千円単位の書籍代」もかけることなく、
ポイントを絞ればソースの解析はできています。
- apple502j
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
私としては、一次情報は
・ソースコード
・Issue/Pull Request/コミットメッセージ
・STメンバーのプロフィールコメント
・ときどきフォーラム投稿
ですね。
・ソースコード
・Issue/Pull Request/コミットメッセージ
・STメンバーのプロフィールコメント
・ときどきフォーラム投稿
ですね。
- inoking
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
質問コーナー3 #7644 より:
スケジューラについて調べました。
33ミリ秒毎にメインループが起動され各スプライトの処理が順番に実行されます。
これが33ミリ秒単位の待ち時間になるという理由と思われます。
※この辺の作りは Scratch 2.0 と同様のようです。
メインループ起動の流れ:
1. 緑旗のクリック時 VirtualMachine::start() が呼ばれます(と思われる)。
https://github.com/LLK/scratch-gui/blob/develop/src/containers/controls.jsx#L17
2. VirtualMachine::start() では Runtime::start() が呼ばれます。
https://github.com/LLK/scratch-vm/blob/develop/src/virtual-machine.js#L171
3. Runtime::start() では 33(1000 / 30)ミリ秒毎に Runtime::_step() を呼び出すよう設定します。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L700
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2557
4. Runtime::_step() では Sequencer::stepThreads() が呼ばれます。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2019
5. Sequencer::stepThreads() では インターバル(33ミリ秒)の 75% を消費するまでループが実行され、これがメインループです。
https://github.com/LLK/scratch-vm/blob/develop/src/engine/sequencer.js#L70
スケジューラについて調べました。
33ミリ秒毎にメインループが起動され各スプライトの処理が順番に実行されます。
等では時間が満了していない場合は yield され次回の処理に回されるので
これが33ミリ秒単位の待ち時間になるという理由と思われます。
※この辺の作りは Scratch 2.0 と同様のようです。
メインループ起動の流れ:
1. 緑旗のクリック時 VirtualMachine::start() が呼ばれます(と思われる)。
https://github.com/LLK/scratch-gui/blob/develop/src/containers/controls.jsx#L17
handleGreenFlagClick (e) {
e.preventDefault();
if (e.shiftKey) {
this.props.vm.setTurboMode(!this.props.turbo);
} else {
if (!this.props.isStarted) {
this.props.vm.start();
}
this.props.vm.greenFlag();
}
}
https://github.com/LLK/scratch-vm/blob/develop/src/virtual-machine.js#L171
start () {
this.runtime.start();
}
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L700
static get THREAD_STEP_INTERVAL_COMPATIBILITY () {
return 1000 / 30;
}
start () {
// Do not start if we are already running
if (this._steppingInterval) return;
let interval = Runtime.THREAD_STEP_INTERVAL;
if (this.compatibilityMode) {
interval = Runtime.THREAD_STEP_INTERVAL_COMPATIBILITY;
}
this.currentStepTime = interval;
this._steppingInterval = setInterval(() => {
this._step();
}, interval);
this.emit(Runtime.RUNTIME_STARTED);
}
https://github.com/LLK/scratch-vm/blob/develop/src/engine/runtime.js#L2019
_step () {
...
const doneThreads = this.sequencer.stepThreads();
https://github.com/LLK/scratch-vm/blob/develop/src/engine/sequencer.js#L70
stepThreads () {
// Work time is 75% of the thread stepping interval.
const WORK_TIME = 0.75 * this.runtime.currentStepTime;
...
while (this.runtime.threads.length > 0 &&
numActiveThreads > 0 &&
this.timer.timeElapsed() < WORK_TIME &&
(this.runtime.turboMode || !this.runtime.redrawRequested)) {
https://github.com/LLK/scratch-vm/blob/develop/src/blocks/scratch3_control.js#L110
wait (args, util) {
if (util.stackTimerNeedsInit()) {
const duration = Math.max(0, 1000 * Cast.toNumber(args.DURATION));
util.startStackTimer(duration);
this.runtime.requestRedraw();
util.yield();
} else if (!util.stackTimerFinished()) {
util.yield();
}
}
- inoking
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
というわけで Scratch 2.0 のオフラインエディターで編集していた開発版プロジェクトが
(上限の50MBよりは少し小さいのだけれど)いつの間にか保存できなくなってる。。
Scratch 3.0 のオフラインエディタでは読み込んで保存できるものの
.sb2 では 1.2MB だった project.json が
.sb3 では 5.2MB に膨れ上がり
そのせいでオンラインにアップできない。。
Scratch 3.0 は圧縮効率が向上しているはずではなかったのか?
・Scratch 2.0 のサイズ制限を緩和した Mod では保存もできるのでそちらで続けるか、
・Scratch 3.0 のオフラインエディターで編集を続けるか、
思案中。。。
Scratch 3.0 の project.json のサイズがなぜ膨れ上がるかなのですが
targets.blocks にある各ブロック(↓ のような単位)
にそれぞれ20文字の一意識別子のようなものが付加されていて相互参照しているようです。
使われているブロックの数だけこの識別子は付加されていますから
それだけでも膨れ上がらせるには十分でしょう。
- inoking
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
JSON のビューアとしては「J_and_E」がいい感じです。
Scratch 3.0 の改行なし project.json も放り込んでやれば整形してくれます。

Scratch 3.0 の改行なし project.json も放り込んでやれば整形してくれます。
Last edited by inoking (June 27, 2020 15:56:08)
- apple502j
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
基本はopcode-type対応表を用意します。との違いが書いてあるところはありますか?(json内)
ただし、変数ブロックは別です。(変数ブロックは「入力欄」として扱われています)
- musicmansub
-
1 post
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
部外者ですいません。scratch3.0ではハッキングすることってできますか?
- akku--n11
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
多分大丈夫です。 ハックしたプロジェクトは共有してもいいのでしょうか?
危険なもの(危ないユーザースクリプトなど)を使ったプロジェクトは投稿しないように。
- apple502j
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
その場合は、利用規約の4.4(modされたScratchを使ったプロジェクトの共有禁止)にも気を付けてください。
Scratch外での共有は問題ありません。
Scratch外での共有は問題ありません。
- tsumuri3
-
1000+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
展開したやつは、.sb3ではなく、(windowsの場合だが)フォルダごと、右クリックして、送るでzipにしてください。僕もうまくいきませんでした。しかも、sb3に拡張子を変えても、アイコンはzipのままでした。アップロード機能はもう使えるみたいです。 ベータ版はアップロード機能をもうサポートしているのでしょうか?
ダウンロードしただけのファイルでもアップロードできませんか?
すみません、私は試していません。
※この話題なら Scratch3.0について話し合う所 のほうがいいかも
ところで、ふと思ったことがあったので、実験してみました。
zipだったファイルの拡張子をもう一度sb3に戻してアップロードを試してみましたが、うまくいきませんでした。
Last edited by tsumuri3 (Aug. 3, 2020 08:42:05)
- bakabaka99
-
100+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
趣旨にずれている気がしたので削除
Last edited by bakabaka99 (Aug. 11, 2020 21:33:45)
- MINITOMATO10
-
100+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
変数を後ろに下げる方法ってありますか?質問コーナー4で質問したのですが、このトピックの目的が、っぽかったので投稿させていただきました
Last edited by MINITOMATO10 (Aug. 12, 2020 08:44:10)
- aorubomerkun-s_test
-
100+ posts
Scratch 3.0 をハック(動作や構造を解析すること)しよう!
このトピックのハッキングとあなたが思っているハッキングでは意味が違います。 ハッキングはだめですよね
単にハッキングと言っても悪いことだけではありません。