HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0808
KOMARIコーディング技術の向上を目指すために8解決


KOMARI

リンク

2014/8/8(Fri) 23:06:20|NO.63609

何となくスレを建ててみる(・ω・)……

コーディングをしていて実際に実行してみると、なんか処理が重いなあ……なんてことがよくありますよね。

例えば、

notesel note repeat notemax  noteget  (notegetした内容についてあれこれ) loop
と書いていたのを、

split note,"\n",snote repeat length(snote)-1  (snote(cnt)についてあれこれ) loop
と書き換えたら処理が劇的に軽くなりました。

こんな感じで、知っていると処理速度の向上やメモリ節約、コーディングにかかる時間が削減できる等
知っていたら得をしそうなものを紹介してほしいです。
・変数、関数、定数等の命名規則について
・デバッグをどのようにすると効率がいいか
・外部にファイルを出力する時中身をどう書くか
・ファイルの分割の仕方
・その他小技等なんでも

よろしくお願いします。

ちなみに、コンテストに向けてローグライクゲームを鋭意制作中です(宣伝)
ファイル分割をした結果49個のhspファイルが……。ごちゃごちゃしてきて大変なことに('A`)
多分9月には公開できると思うので、期待しないで待っていてくださいネ(・ω・)



この記事に返信する


cmoritoshi

リンク

2014/8/8(Fri) 23:45:49|NO.63611

受け売りですが、
noteadd よりmemcpyのほうが十数倍速いです。
http://www.hsptv.sakura.ne.jp/play/pforum.php?mode=pastwch&num=51253



きのよー

リンク

2014/8/9(Sat) 01:46:10|NO.63614

ふと気になったのだけれど


buf=str(a) mes buf title buf


mes str(a) title str(a)
どちらが早いのでしょうか……。



Flat (元Tetr@pod)

リンク

2014/8/9(Sat) 02:04:46|NO.63616

N=5000000のとき、
文字列の代入操作:約770ミリ秒
str関数: 約340ミリ秒
となりました。
よってこちらの環境では下のコードのほうが早かったです。

まあ、こんなものは微々たる違いで実際にはmes命令とtitle命令が
いっぱい時間を食うので気にしなくても良いかと。
(というか、mesやtitleを頻繁に使わないプログラムにしたほうが良いと思う。)



ぴょぴょ

リンク

2014/8/9(Sat) 02:19:53|NO.63617

> ・変数、関数、定数等の命名規則について
こちらはネットで良く話題になってる問題ですね。

・プログラミング作法
http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95

・Visual Basic のコーディング規則
http://msdn.microsoft.com/ja-jp/library/h63fsef3.aspx

・C# のコーディング規則 (C# プログラミング ガイド)
http://msdn.microsoft.com/ja-jp/library/ff926074.aspx

これらは「コーディング規則」検索した上位3つです。
HSPは構造体が利用できないため変数名・関数名の最初を統一するのが望ましいと私は考えます。
去年、腕試しでシューティングを作成した時は次のようになりました。
まずは変数
// 自機
FightDebug FightLeft FightBomb FightHead FightTail // 敵機 EnemyBirthCycle EnemyHead EnemyTail // 爆風 BlastHead BlastTail // 自機弾 ShotHead ShotTail // 敵機弾 BeamHead BeamTail // アイテム ItemHead ItemTail // 流星 StarBirthCycle StarHead StarTail // その他 Score HiScore DebugMode // 一時変数 key r g b i p q pp qq m n x y cx cy ex ey
続いてラベル名
*Init
*Main *ShootingInit *ShootingMove *ShootingDraw *FightInit *FightMove *FightDraw *EnemyInit *EnemyFlush *EnemyBirth *EnemyMove *EnemyDraw *ShotBirth *ShotMove *ShotDraw *BeamFlush *BeamBirth *BeamMove *BeamDraw *ItemAuto1 *ItemAuto2 *ItemMove *ItemDraw *StarBirth *StarMove *StarDraw *BlastMove *BlastDraw *CrashMain *TelopDraw *DebugInit *DebugChainCheck *DebugChainClear *DebugErrorClear *DebugAllClear *DebugDraw
続いてユーザ定義命令
#deffunc ObjectClear var _head_,var _tail_,local _curs_,local _next_
#deffunc FightCrash int _x_,int _y_ #deffunc FightDeath int _cx_,int _cy_ #deffunc FightBirth int _x_,int _y_ #deffunc EnemyCrash int _x_,int _y_,int _item_ #deffunc ItemBirth int _cx_,int _cy_,int _item_ #deffunc ItemCrash int _x_,int _y_,int _item_ #deffunc BlastBirth int _cx_,int _cy_,int _type_,int _data_ #deffunc ScoreCalc int _score_ #deffunc TelopPuts int _x_,int _y_,str _msg_ #deffunc DebugChainDelete int _debug_,int _head_,int _tail_,local _prev_,local _curs_ #deffunc DebugObjectDraw int _top_
続いてユーザ定義関数
#defcfunc ObjectAlloc
#defcfunc ObjectInsert var _head_,var _tail_,var _curs_,int _debug_ #defcfunc ObjectAppend var _head_,var _tail_,var _curs_,int _debug_ #defcfunc ObjectDelete var _head_,var _tail_,int _prev_,int _curs_,local _next_ #defcfunc CrashFightCheck int _cx_,int _cy_,int _ex_,int _ey_ #defcfunc CrashEnemyCheck int _cx_,int _cy_,int _ex_,int _ey_ #defcfunc CrashShotCheck int _cx_,int _cy_,int _ex_,int _ey_ #defcfunc CrashBeamCheck int _cx_,int _cy_,int _ex_,int _ey_ #defcfunc CrashItemCheck int _cx_,int _cy_,int _ex_,int _ey_
このような感じで、私は先頭をある単語で統一します。

> ・ファイルの分割の仕方
これも上記の名前で分割します。
Shooting.hsp メイン
Crash.as 当たり判定
Fight.as 自機(初期化、移動、描画、衝突判定など)
Enemy.as 敵機(〃)
Shot.as 自機弾(〃)
Beam.as 敵機弾(〃)
Item.as アイテム(〃)
Star.as 流星(〃)
Blast.as 爆発アニメ(〃)
Telop.as テロップ(スコアなども含む)
Debug.as デバッグ(変数・配列・単方向リスト閲覧など)

> ・デバッグをどのようにすると効率がいいか
#if、#endif と _debug を組み合わせてデバッグ中のユーザ定義命令を実行するなど。

> ・外部にファイルを出力する時中身をどう書くか
一概に言えませんね。
一覧表出力、変数名+値、クリップボード出力、logmes出力などを使います。

> ・その他小技等なんでも
一杯ありますが、書き切れません。

> ちなみに、コンテストに向けてローグライクゲームを鋭意制作中です(宣伝)
懐かしいですね。

> ファイル分割をした結果49個のhspファイルが……。ごちゃごちゃしてきて大変なことに('A`)
でしょうね。
ファイル分割+フォルダ分割で管理するしかない。
また、私はメインのファイルは .hsp の拡張子を使い、
#include命令で読み込むファイルは .as の拡張子を使ってます。

どんなにファイルが多くても
ファイル命名規則、
フォルダ分割規則、
変数名、配列名の命名規則を
しっかりすれば良いのです。

記号定数、列挙定数には、大文字で統一するのが一般(C/C++出身なので)
ユーザ定義命令、ユーザ定義関数の引数には下線文字を追加
ユーザ定義命令、ユーザ定義関数は単語の最初だけ大文字に統一(下線文字を使う方法もあるよ)

さらに記号定数、列挙定数をまとめた Const.as を用意。
グローバル変数、グローバル配列をまとめた Value.as を用意。
メインの Shooting.hsp の上部で
#include "Const.as"
#include "Value.as"
で組み込みます。

その後に
#include "Fight/Fight.as"
#include "Fight/Shot.as"
#include "Enemy/Enemy.as"
#include "Enemy/Beam.as"
でフォルダ付きで組み込みます。

あと繰り返し命令内を高速になる工夫や、
文字列処理を外部の dll で用意するとか。
なお、dll はC/C++言語で作りますけどね。



f(台風対策中)

リンク

2014/8/9(Sat) 09:33:48|NO.63621

【鬼と】ニコニコ論理式講座【悪魔の】


まず、左から右に流れる電線が一本あるとする。
|---------------------------------------------------------|



この線が通電すると、ランプAが点灯するとする。

|---------------------------------------------------------[ランプA●Off/○On]

・0をOff、1woOnとした場合
LampA = 0 / LampA = 1


スイッチ1を付ける事で、ランプAのOn/Offが制御できるようになる

|--[スイッチ1Off]-----------------------------------------[ランプA●Off]

又は

|--[スイッチ1On ]-----------------------------------------[ランプA○On ]

・論理式「条件が成立する時1、そうでないとき0になる」を利用する
LampA = ( Swicth1 = 1 )


ランプAがOnの状態を、スイッチOnと同一と見なすと、この様な作りが可能になる
この場合、スイッチ1がOffになっても、ランプAがONの間はランプAがOnで有り続ける事になる。

|--[スイッチ1On ]---+-------------------------------------[ランプA○On ] 
| .|
|--[ランプA○On ]---+

・並列になった条件は、「論理和」で表現できる
LampA = ( ( Switch1 = 1 ) or LampA )


最後にランプAを消灯する為のスイッチ2を増設する。

|--[スイッチ1On ]---+------[スイッチ2Off .]..------------------[ランプA○Off.]
| .|
|--[ランプA○Off.]---+

・直列になった条件は「論理積」で表現できる
LampA = ( ( Switch1 = 1 ) or LampA ) and ( Switch2 = 1 )



結果
・出来上がった回路の機能は
 Switch1が1にになるとLampAが1になる
 LampAの値は、Switch2が1の間、保持される

結論
・「フラグOn条件」、「フラグ維持条件」の2つの入力が有るフラグ管理は、1行で出来る。






>>>>>注意<<<<<
・見た目が非常に複雑になり、作ってから間が開くと、自分でも何をしているのか分からなくなる。
・多用すると自滅する。割とシャレにならない。



skyblue

リンク

2014/8/9(Sat) 10:20:26|NO.63623

ぴょぴょさん>
ハンガリアン記法?



KOMARI

リンク

2014/8/9(Sat) 12:01:15|NO.63629

>>どんなにファイルが多くても
>>ファイル命名規則、
>>フォルダ分割規則、
>>変数名、配列名の命名規則を
>>しっかりすれば良いのです。

まあ結局はここに行きつくんですかね(・ω・)……

とりあえず、キリがないんで解決つけときます。
どちらかというと私が知りたいというより、有益な情報の共有をする場としてスレを建てた感じです。
ですので、引き続き何かあれば書き込んでいきやがれください(・ω・)



KOMARI

リンク

2014/8/12(Tue) 22:04:48|NO.63756

関数の返り値を捨てる時、
 a = func()
とするより
 if (func())
とする方が早かった(・ω・)

ま、結局は代入演算よりifのが早いよってことだろうけど……。



ONION software Copyright 1997-2021(c) All rights reserved.