S-H-GAMELINKS / Novel.Game.Engine.LINKS

ノベルゲームエンジン「LINKS」
Other
13 stars 1 forks source link

スクリプト配列:String の動的確保について #25

Closed S-H-GAMELINKS closed 7 years ago

S-H-GAMELINKS commented 7 years ago

こちらのスクリプト配列:String を

//スクリプト用読込配列
char String[script_line_num_lim][script_line_string_len_lim];

下記のコードで行数と文字数(バイト数)を返して、配列を動的確保できないでしょうか?

//行数カウント関数
int CountLine(){

    //カウンタ変数
    int number = 0;

    //テキストを開く
    ifstream file("sample.txt");

    //テキストの行数をカウント
    while(!file.eof()){
        string s;
        getline(file, s);
        number++;
    }

    return number;
}

//文字数カウント関数(バイト数)
int CountWord(){

    //各種カウンタ変数の初期化
    int number = 0;
    int word1 = 0;
    int word2 = 0;

    //テキストを開く
    ifstream file("sample.txt");

    //一行ずつ文字数をカウントし、最大値を返す
    while(!file.eof()){
        string s;
        getline(file, s);
        word2 = word1;
        word1 = s.length();
        if(number <= word1 || word2 >= number)
            number = max(word1, word2);
        //number = max(word2, number);
    }

    return number;
}
yumetodo commented 7 years ago

現状FileRead_getsで読み込みをしていますが、この場合DXArchiveに対応しています。この対応を切ってもいいなら比較的ラクにできますが、DXA対応が必要な場合はFileRead周りをラップすることになり大変です。どうしますか?

いずれにしても動的確保にすることでメモリー使用量削減に寄与するかと思います。

S-H-GAMELINKS commented 7 years ago

あー、DXArchive周りの事まで考えが回ってなかったですね…。

DXArchive非対応となるのはユーザーからすると辛いでしょうし、かといってラップするというのも大変ですし。

yumetodo commented 7 years ago

やっぱり対応しないとあかんか・・・。結局 https://github.com/Nagarei/DxLibEx/pull/53#issuecomment-218428288 と同じ問題にぶち当たるのか・・・。

まあようはstd::streambuf, std::istream, std::ostreamをそれぞれ継承してやればいいんだけど、本当に設計が古臭くてだるい。

S-H-GAMELINKS commented 7 years ago

個人的には、DXA対応を切ってしまっても問題ないと思いますよ。

それに、現状ユーザーからの声はほとんどないですので(サークルメンバーからのみ……)、DXA非対応になったとしても大きな問題にはならないと考えます。

この際ですし、非対応の方向で行きましょうか。

yumetodo commented 7 years ago

ちなみに前にstd::wcin/ std::wcoutをUTF-8としてバイパスする目的で書いたstreambufが https://github.com/yumetodo/utf8_streambuf です。まあこれよりは楽に書けるんじゃないかな・・・

非対応だと嬉しいです。


以下愚痴。

そもそもDXAって話を複雑にしているだけで不要だと思うんですよね。画像、動画、音声はzlib圧縮ごときではさして縮まないどころか下手すると増えますし。唯一価値があるのはテキストファイルですが、これだってファイル単位でboost::iostreamsとかでzlibなりbzip2で圧縮すればいいんですよ。たまにDXAの暗号化が必要だからとか言っている輩がいますが、解除鍵がプログラム中にある時点でいくらでも逆アセンブルして割れますし、ネットワーク通信で手に入れる実装にしても通信がある事自体はオフライン環境で実行すればわかるし、通信内容はWireSharkでわかるし、結局無意味なんですよ。もちろんDRMの認証に使っているものくらい頑張ればそうそう破られないでしょうが、そんなコードかけるやつはDXAなんてつかいませんよ。そんなにリソースファイル隠したいならもうブラウザゲームにしろよっていう・・・。改ざん対策にDXA使うのも誤りで、そんなもんハッシュチェックしろよと申し上げたい。つまりDXAなんてゴミ箱に投げ捨てるべきなんですよ。ええ、あんなものがあるせいでboost::iostreamsをstatic linkしようとするとリンカーエラーになるし、まじでDXA考えたやつは頭が(ry

(DXAへの恨みのあまり錯乱したので隠しました)

S-H-GAMELINKS commented 7 years ago

よし、非対応にしましょう!

個人的にも、DXAでの暗号化は「見ようと思えばみれてしまうよな」という思いがありましたので、今回の件はいい区切りだと思います。

あと、それ以上いけない……

yumetodo commented 7 years ago

了解です。試しに実装してみています・・・

S-H-GAMELINKS commented 7 years ago

よろしくお願いします。m(__)m

S-H-GAMELINKS commented 7 years ago

27 のPull request にて動的確保が実装できていますので、この issue は close しますね。